问题总结
你的情况很典型:quantized.onnx精度正常(87%),但bin模型精度严重下降(51%)。根据admin回复和社区案例,核心排查方向如下:
排查路径
第一步:运行精度Debug工具
# 使用hb_mapper的精度debug功能
hb_mapper debug --model_config your_model.yaml \
--output_dir ./debug_output \
--mode cosine_similarity
重点关注:
- 余弦相似度 < 0.98 的层
- 你数据中
spatial_conv相关层相似度已降到 0.971,这些是重点怀疑对象
第二步:检查编译Log中的Warning
搜索日志中是否有以下关键字:
grep -i "illegal threshold" make_rtbin.log
grep -i "requantize" make_rtbin.log
find illegal threshold→ 校准失败,threshold被强置为1requantize warning→ ReLU等激活函数量化问题
第三步:快速验证方案
方案A:全局Int16测试(验证是否是量化精度问题)
# 在yaml配置中添加
set_all_node_int16: true
重新编译bin模型,测试精度是否恢复。如果恢复到85%+,说明是Int8量化参数问题。
方案B:针对问题层设置Int16
custom_node_config:
- layer_name_pattern: ".*spatial_conv.*Conv"
precision: "int16"
第四步:校准数据集检查
| 检查项 | 要求 |
|---|---|
| 数据量 | 100-500张 |
| 场景覆盖 | 覆盖典型输入场景 |
| 预处理 | 与训练时完全一致 |
| 数据格式 | 是输入onnx前dump的原始数据 |
社区参考资源
| 帖子 | 关键解决方案 |
|---|---|
| 量化后calibrated正常但quantized精度损失 | 使用FeatureMap模式排除前处理干扰 |
| PTQ精度调优—Int16量化 | 对敏感层设置int16平衡精度/性能 |
| 算法工具链量化精度问题 | quantized与bin不一致的排查方法 |
建议操作顺序
1. 先试 set_all_node_int16: true → 验证是否是量化精度问题
2. 如果有效,用debug工具定位具体问题层
3. 只对问题层设置int16,其他保持int8
4. 如果仍无效,检查校准数据集质量
需要进一步帮助的话,可以提供:
- 完整的编译log(特别是warning部分)
- YAML配置文件
- 精度debug工具输出的累计误差图
这样可以更精准定位问题节点。