Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Qualcomm: 16a16w quantization is much less accurate than 16a8w

Đang mở
#23,108 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
55/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python, pytorch
Lĩnh vực
backend, machine-learning

Hướng nghiên cứu

Start by running the provided host-only reproduction and trace make_quantizer through get_16a16w_qnn_ptq_config. Compare the int16 per-tensor and per-channel weight specifications, including PerChannelParamObserver, to isolate the quantization-parameter discrepancy. Done means 16a16w no longer produces catastrophic SQNR or task-accuracy loss relative to 16a8w.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

bug module: qnn module: quantization

QuantDtype.use_16a16w is far less accurate than use_16a8w on the same model. More weight bits should never mean a worse result.

resnet18, host PTQ only (prepare_pt2e / convert_pt2e, no lowering, no device), SQNR of the quantized output against fp32:

recipe SQNR vs fp32
use_16a8w 24.49 dB
use_16a16w -1.53 dB

Same pattern on every model tried: deeplabv3_mobilenet_v3_large 8.14 -> 1.47 dB, mobilenet_v3_large 2.72 -> -0.75 dB. On a real task it is catastrophic: DeepLabV3-MobileNetV3 on VOC2012 scores 63.89% mIoU at 16a8w and 3.38% at 16a16w (fp32 67.52%, 100 calibration images).

Repro:

import torch
import torchvision.models as tvm
from executorch.backends.qualcomm.export_utils import make_quantizer
from executorch.backends.qualcomm.quantizer.quantizer import QuantDtype
from torchao.quantization.pt2e.quantize_pt2e import convert_pt2e, prepare_pt2e

torch.manual_seed(0)
model = tvm.resnet18(weights=tvm.ResNet18_Weights.DEFAULT).eval()
sample = (torch.randn(1, 3, 224, 224),)
probe = torch.randn(1, 3, 224, 224)
with torch.no_grad():
    ref = model(probe)

for dtype in (QuantDtype.use_16a8w, QuantDtype.use_16a16w):
    quantizer = make_quantizer(quant_dtype=dtype, soc_model="SM8850")
    prepared = prepare_pt2e(
        torch.export.export(model, sample, strict=False).module(), quantizer)
    with torch.no_grad():
        for _ in range(16):
            prepared(torch.randn(1, 3, 224, 224))
        got = convert_pt2e(prepared)(probe)
    sqnr = 10 * torch.log10((ref**2).mean() / ((ref - got) ** 2).mean()).item()
    print(f"{dtype.name:16s} SQNR vs fp32: {sqnr:7.2f} dB")

Ruled out:

  • Not the int32 bias. Counting folded bias elements sitting at the int32 limits gives 0 saturated in both arms (DeepLabV3, 100 calibration images, 520px). quantize_per_tensor past int32 saturates rather than wraps, so this is not silent corruption there either. Worth noting separately that the derived bias scale leaves little headroom at 16-bit weights: max|bias/scale| reached 0.999 of int32 in one configuration.
  • Not the weights. Dequantized weights match between the two arms at 36-48 dB, i.e. the 16-bit weights are essentially exact.
  • Not execution. This is fake-quant in PyTorch with convolutions in float, so no HTP and no integer accumulator are involved; the loss comes from the quantization parameters alone.
  • Not an unsupported SoC. validate_16a16w_support requires HTP >= V73 and SM8850 is v81.

The activation specs are identical between the two recipes, so the difference is on the weight side: get_16a16w_qnn_ptq_config uses an int16 per-tensor symmetric weight spec (quant_min=-32767, quant_max=32767), and the per-channel path uses weight_dtype=torch.int16 with PerChannelParamObserver. I have not isolated which of those is at fault.

Environment: executorch at 8081eb88, torch 2.14.0+cpu, torchao 0.18.0.dev20260729, torchvision 0.29.0+cpu, QAIRT 2.37.0.250724, Linux x86_64. No device needed.

cc @kimishpatel @jerryzh168 @metascroy @cbilgin @psiddh

Ngôn ngữ chính
Python
Star
5k
Fork
1.2k
Merge trung bình
2 ngày 10 giờ
Pull request đã merge (30 ngày)
573

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của pytorch/executorch

Tất cả issue của pytorch/executorch

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.