Qualcomm: 8-bit per-channel weight scales are floored at the 16-bit eps, and the HTP miscomputes near-zero channels
メンテナーはふだん 1 日以内に返信
@psiddh がすでに取り組んでいます。
2026年9月25日 から。
評価
この issue はまだ評価されていません。
説明
get_ptq_per_channel_quant_config floors every per-channel weight scale at DEFAULT_EPS_16BIT (1.5e-9), 8-bit weights included. A conv output channel that BatchNorm has all but zeroed gets that scale, ~1e6x below its neighbours, and the HTP computes the channel as garbage. Host fake-quant is correct.
16a8w on SM8850 (Galaxy S26 Ultra, QAIRT 2.47), 200 VOC2012 val images, mIoU:
| default eps | eps=DEFAULT_EPS_8BIT |
XNNPACK int8 | |
|---|---|---|---|
| DeepLabV3-ResNet101 | 0.10% | 78.90% | 78.82% |
| FCN-ResNet101 | 28.69% | 74.93% | 74.99% |
Repro, one conv. Writes both .pte files, the input and the fp32 reference to the directory given as the first argument:
import sys
import torch
from executorch.backends.qualcomm.export_utils import make_quantizer
from executorch.backends.qualcomm.quantizer.qconfig import DEFAULT_EPS_8BIT
from executorch.backends.qualcomm.quantizer.quantizer import QuantDtype
from executorch.backends.qualcomm.serialization.qc_schema import QcomChipset
from executorch.backends.qualcomm.utils.utils import (
generate_htp_compiler_spec, generate_qnn_executorch_compiler_spec,
get_qnn_context_binary_alignment, to_edge_transform_and_lower_to_qnn)
from executorch.exir.capture._config import ExecutorchBackendConfig
from executorch.exir.passes.memory_planning_pass import MemoryPlanningPass
from torchao.quantization.pt2e.quantize_pt2e import convert_pt2e, prepare_pt2e
torch.manual_seed(0)
conv = torch.nn.Conv2d(16, 16, 3, padding=1)
with torch.no_grad():
conv.weight[0] *= 1e-8 # what BatchNorm with gamma ~ 0 leaves after folding
conv.bias[0] = 0.0
model = torch.nn.Sequential(conv).eval()
calib = [torch.randn(1, 16, 32, 32) for _ in range(8)]
x = torch.randn(1, 16, 32, 32)
out = sys.argv[1]
x.numpy().tofile(f"{out}/input_0.raw")
with torch.no_grad():
model(x).numpy().tofile(f"{out}/ref.raw")
for tag, eps in [("default", None), ("eps8bit", DEFAULT_EPS_8BIT)]:
p = prepare_pt2e(torch.export.export(model, (x,)).module(),
make_quantizer(quant_dtype=QuantDtype.use_16a8w, soc_model="SM8850", eps=eps))
for c in calib:
p(c)
q = convert_pt2e(p)
spec = generate_qnn_executorch_compiler_spec(soc_model=QcomChipset.SM8850,
backend_options=generate_htp_compiler_spec(use_fp16=False))
prog = to_edge_transform_and_lower_to_qnn(q, (x,), spec).to_executorch(ExecutorchBackendConfig(
memory_planning_pass=MemoryPlanningPass(alloc_graph_input=True, alloc_graph_output=True),
segment_alignment=get_qnn_context_binary_alignment()))
open(f"{out}/conv_dead_ch_{tag}.pte", "wb").write(prog.buffer)
Run each .pte with qnn_executor_runner on input_0.raw and read channel 0 of the output. It should be 0 (fp32 max 2.2e-8). With the default eps it comes out at 2.25; with eps=DEFAULT_EPS_8BIT it is 0.0. The other 15 channels match fp32 equally well in both runs (relative error 0.0069), and host fake-quant gives 0.0 in both cases.
cc @cccclai @winskuo-quic @shewu-quic @haowhsu-quic @DannyYuyang-quic @cbilgin @abhinaykukkadapu @psiddh
- 主要言語
- Python
- スター
- 5k
- フォーク
- 1.2k
- 平均マージ
- 2日 9時間
- マージ済み PR(30日)
- 555
環境構築
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
pytorch/executorch のほかの issue
-
enhancement triaged
難易度 2/5 半日 初心者へのやさしさ 68/100
pytorch/executorch#21640 ·
メンテナーはふだん 1 日以内に返信
-
enhancement module: examples
難易度 5/5 1週間以上 初心者へのやさしさ 20/100
pytorch/executorch#23164 · コメント 7 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[cpu kernels] native_layer_norm: layer_norm_scalar returns NaN on large-mean rows; Half/BF16 at N>=256 slow after #23153対応中かも @JakeStevens が 1 日前に担当しました。 オープンmodule: kernels
pytorch/executorch#23159 · コメント 2 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
module: vulkan
難易度 3/5 1〜2日 初心者へのやさしさ 66/100
pytorch/executorch#23158 ·
メンテナーはふだん 1 日以内に返信
-
[Vulkan] Missing/partial op support blocks full delegation of a dynamic-shape transformer encoderオープンmodule: vulkan
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
pytorch/executorch#23156 ·
メンテナーはふだん 1 日以内に返信
pytorch/executorch の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
solana-foundation/pay-kit#341 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
nasa/python_cmr#123 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
EleutherAI/lm-evaluation-harness#4243 ·
メンテナーはふだん 1 日以内に返信
-
area: dashboard bug perceived difficulty: 3
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
Nitjsefnie-Harness-Commons/daedalus#1179 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
cusp-ai-oss/tojax#17 ·