根据你提供的信息,量化流程在 HB_ONNXRuntime 测试阶段正常,但板端 .bin 模型效果严重失真(top5 类别和 logits 都完全不同)。这是典型的量化部署一致性问题。
核心结论
问题大概率出在以下三个环节之一:
- 校准数据格式/预处理不一致(最可能)
- 板端推理代码数据处理错误
- 模型编译参数或版本不匹配
排查步骤(按优先级)
步骤 1:使用 hb_verifier 工具验证一致性
这是最关键的一步,可以直接定位是量化问题还是部署问题。
# 在 x86 环境(量化所在的 Docker)执行
hb_verifier -m stgcn_x5_quantized.onnx,stgcn_x5.bin \
-b <板子IP地址> \
-s True \
-i <你的校准数据路径> \
-c 5 \
-r True
参数说明:
-s True: 同时在 x86 模拟器上运行 bin 模型-r True: 输出所有节点的对比结果(定位具体哪一层开始失真)-c 5: 比较小数点后 5 位-i: 必须使用和量化时相同的校准数据
预期结果:
- 如果显示
Strict check PASSED:说明模型本身没问题,问题在板端推理代码 - 如果显示
Check FAILED:说明量化/编译环节有问题,查看-r True输出的节点对比日志
步骤 2:检查校准数据格式
你的 YAML 配置中:
calibration_parameters:
cal_data_dir: '/data/save-1'
cal_data_type: 'float32'
input_type_rt: 'featuremap'
input_type_train: 'featuremap'
关键检查点:
-
校准数据是否真的是 float32 的 featuremap 格式?
import numpy as np data = np.fromfile('/data/save-1/xxx.bin', dtype=np.float32) print(data.shape) # 应该是 (1, 3, 32, 18) 或 (3, 32, 18) -
校准数据是否和训练/测试数据分布一致?
- ST-GCN 是骨骼点模型,校准数据应该是归一化后的骨骼点坐标
- 如果校准数据是原始像素坐标或未归一化,会导致量化参数计算错误
-
校准数据数量是否足够?
- 建议至少 100 帧以上,覆盖各种动作场景
步骤 3:检查板端推理代码
从你的日志看,板端输入输出信息:
input shape : (1, 3, 32, 18)
input dtype : float32
output shape : (1, 400, 1, 1)
output dtype : float32
常见错误:
-
输入数据未正确归一化
// 错误示例:直接使用原始骨骼点坐标 float* input_data = skeleton_points; // 可能是像素坐标 // 正确做法:应该和训练时一致的归一化 for(int i=0; i<32*18; i++) { input_data[i] = (skeleton_points[i] - mean[i]) / std[i]; } -
数据 Layout 错误
// 确认是 NCHW 格式 // 如果板端代码按 NHWC 填充数据,会导致结果完全错误 -
未使用正确的推理接口
// featuremap 模型应该用 hbDNNInferFeatureMap 或设置正确的 input_type // 不要用处理图像的接口
步骤 4:使用 hrt_model_exec 验证板端推理
在板子上直接用地平线官方工具推理,排除自己代码的问题:
# 在板子上执行
hrt_model_exec infer \
--model_file=stgcn_x5.bin \
--input_file=<你的测试数据.bin> \
--enable_dump 1 \
--dump_format txt \
--dump_precision 9
然后对比输出和 HB_ONNXRuntime 的结果。
步骤 5:检查工具链版本
从日志看:
BPU Platform Version(1.3.6)
Runtime version = 3.15.55.0
DNN Runtime version = 1.24.5
Model builder version = 1.24.3
确认:
- 量化用的 OE 包版本和板子上的 Runtime 版本是否匹配?
- 建议升级到最新 OE 包重新量化(社区有多个案例显示版本不匹配会导致精度问题)
快速诊断流程图
quantized.onnx 正常 → bin 模型异常
↓
运行 hb_verifier
↓
┌────┴────┐
↓ ↓
PASSED FAILED
↓ ↓
板端代码问题 量化/编译问题
↓ ↓
检查: 检查:
- 输入归一化 - 校准数据格式
- 数据 Layout - 校准数据分布
- 推理接口 - YAML 配置
- 后处理 - 工具链版本
建议的下一步行动
- 立即执行
hb_verifier -r True,查看具体哪一层节点开始失真 - 提供 verifier 的输出日志(特别是节点对比结果)
- 检查校准数据:用 Python 加载几个样本,确认数值范围和分布
- 如果 verifier 通过:提供板端推理代码的关键部分(输入数据处理部分)
相关社区资源
- 模型精度验证及调优建议 - 官方精度排查流程
- python 推理与板端推理不一致 - 类似案例
- PTQ&QAT 方案板端验证注意事项 - 数据一致性检查
请先运行 hb_verifier 并贴出结果,这样可以更精准定位问题。