[Bug] QuantONNX 导出阶段 crash: ppq_tensor_round AssertionError
#3
by inoryQwQ - opened
问题描述
使用 model_type: "QuantONNX" 编译带有 QuantizeLinear/DequantizeLinear ops 的 ONNX 模型时,量化阶段顺利完成(AX Load QDQ Config Pass 正确识别 QDQ 配置),但在导出阶段崩溃:
AssertionError: tensor round only takes effect on torch tensor.
复现步骤
- 使用 onnxruntime 生成 QDQ ONNX(仅量化 Conv/MatMul):
from onnxruntime.quantization import quantize_static, QuantType, QuantFormat
quantize_static(
fp32_onnx, qdq_onnx, calib_reader,
quant_format=QuantFormat.QDQ,
per_channel=True,
op_types_to_quantize=['Conv', 'MatMul'],
weight_type=QuantType.QInt8,
activation_type=QuantType.QUInt8,
)
- Pulsar2 配置:
{
"model_type": "QuantONNX",
"target_hardware": "AX650",
"onnx_opt": { "disable_onnx_optimization": true }
}
pulsar2 build --config config.json
完整错误栈
[11:51:59] AX Load QDQ Config Pass Running ... ✅
[11:51:59] AX Refine Int Parameter Pass Running ...
[11:51:59] AX Passive Parameter Quantization Running ...
[11:51:59] AX Parameter Baking Pass Running ...
--------- Network Snapshot ---------
Num of Op: [272]
Num of Quantized Op: [271] ← 量化成功
------- Quantization Snapshot ------
...
Network Quantization Finished. ← 量化完成
...
Traceback:
File "quant.ppq.parser.ax_exporter.suergery.insert_op", line 471, in insert_all_qlinear
File "quant.ppq.parser.ax_exporter.suergery.insert_op", line 57, in insert_quantize_linear_op
File "quant.ppq.parser.ax_exporter.suergery.insert_op", line 116, in insert_quantizer_linear_after_var
File "quant.ppq.utils.round", line 126, in ppq_tensor_round
File "quant.ppq.utils.round", line 84, in forward
AssertionError: tensor round only takes effect on torch tensor.
环境
- Pulsar2: 6.0 (48520c11)
- Docker: axera/pulsar2:latest (f6c10451cee1)
- 模型: 6层 Transformer Text Encoder (192 hidden, 36x Conv1d, 24x MatMul)
补充说明
ONNX 层面的 QDQ 精度已验证正常(QDQ vs FP32 cosine=0.993),问题出在 Pulsar2 内部导出阶段。如果能修复,QuantONNX 通道对 Transformer 类模型(含 Softmax/Attention)的量化精度提升非常关键——PTQ 只有 0.78,QAT+QDQ 可达 0.99+。
参考
完整编译日志见附件。