4. 精度损失排查与精度调优建议
4.1. 精度损失排查
注意
转换后的模型出现精度损失时, 请按照以下推荐方式排查出现问题的 stage
或 layer
4.1.1. CheckLists
- 第一步, 明确发生精度损失的硬件平台
仅发生在
AX
平台上请继续往下排查.
其他平台均有掉点问题发生
共性问题, 需要用户自行斟酌是否要训练一个更好的模型然后再重新量化; 确定其他平台的使用 INT8 还是 INT16 量化, 亦或者是混合量化.
- 第二步, 确定发生精度损失的阶段
pulsar run
对分精度低 (cos-sim < 98%
)请按照 [第三步] 建议继续往下排查
上板接入用户
后处理
程序, 解析之后精度很低请按照 [第四步] 建议继续往下排查
- 第三步, cos-sim 低于 98%, 排查建议
pulsar run
所需的output_config.prototxt
文件 必须 由pulsar build
自动生成检查
pulsar build
配置文件config.prototxt
中的color space
和mean/std
配置是否正确使用
pulsar run
比较model.lava_joint
和model.onnx
之间的cos-sim
值, 观察是否发生精度损失使用逐层对分查看发生精度损失的
layer
- 第四步, 上板精度低, 排查建议
执行
run_joint
指令时会打印joint
模型的部分信息, 用户需要检查后处理程序
是否正确解析输出数据如果其他平台不掉点, 但是在
AX
平台上报错的BadCase
, 具体见 上板精度丢失排查方法
- 第五步, 寻求 AXera 帮助
当用户通过前四步排查建议依然无法解决问题时, 请将相关
log
以及结论
发送给FAE
同学, 以便AX
工程师定位问题
4.1.2. 模型编译后掉点
本节对 CheckLists 中 第三步 进行详细说明.
提示
pulsar run
为 Pulsar
工具链中用于仿真和对分的集成工具, 详情可以参考 x86平台下仿真与对分
如果原始 onnx
模型编译为 joint
模型后, pulsar run
的 cos-sim
很低, 说明转换后的模型发生了精度损失, 需要排查问题出现的具体位置.
- config 配置
pulsar run
所需要的config
是从pulsar build
中自动生成的.1# 注意, 以下命令并不完整 2pulsar build --input model.onnx --config config.prototxt --output_config output_config.prototxt ... 3pulsar run model.onnx model.joint --config output_config.prototxt ...
- csc & mean/std
color space convert, csc
配置之后需要按照通道顺序配置mean/std
.1# 配置编译后模型的输入数据 color space 为 BGR 2dst_input_tensors { 3 color_space: TENSOR_COLOR_SPACE_BGR 4} 5 6# mean/std 需要按照 BGR 的顺序填写 7input_normalization { 8 mean: [0.485, 0.456, 0.406] # 均值 9 std: [0.229, 0.224, 0.255] # 方差 10}
dst_input_tensors
中color_space
为BGR
代表编译时是按照BGR
格式来读取的校正图片数据, 从而mean/std
也要按BGR
顺序设置.
- 查看模型量化阶段是否已经丢失精度
pulsar build
编译过程中, 会生成一个调试用的中间文件model.lava_joint
, 通过1# 注意, 以下命令均不完整 2pulsar run model.onnx model.lava_joint --input ...
可以验证在量化阶段是否发生了精度损失.
- 模型量化阶段丢失精度解决方法
增加量化数据集
1dataset_conf_calibration { 2 path: "imagenet-1k-images.tar" 3 type: DATASET_TYPE_TAR 4 size: 256 # 编译过程中校准所需的实际数据个数 5 batch_size: 32 # 默认为 32, 可以修改为其他值 6}
调整量化策略和量化方法
量化策略,
CALIB_STRATEGY_PER_CHANNEL
和CALIB_STRATEGY_PER_TENSOR
量化方法,
OBSVR_METHOD_MIN_MAX
和OBSVR_METHOD_MSE_CLIPPING
量化策略和量化方法可以 两两组合, 其中
CALIB_STRATEGY_PER_CHANNEL
可能会出现掉点推荐
PER_TENSOR/MIN_MAX
或PER_TENSOR/MSE_CLIPPING
的组合方式
1dataset_conf_calibration { 2 path: "magenet-1k-images.tar" # 量化数据集 3 type: DATASET_TYPE_TAR 4 size: 256 # 编译过程中校准所需的实际数据个数 5 batch_size: 32 # 默认为 32, 可以修改为其他值 6 7 calibration_strategy: CALIB_STRATEGY_PER_TENSOR # 量化策略 8 observer_method: OBSVR_METHOD_MSE_CLIPPING # 量化方法 9}
采用
INT16
量化具体参考 16bit 量化
打开
dataset_conf_error_measurement
, 用于编译过程中误差测试1dataset_conf_error_measurement { 2 path: "imagenet-1k-images.tar" 3 type: DATASET_TYPE_TAR 4 size: 32 5 batch_size: 8 6}
- pulsar debug
pulsar debug
功能后续将补充介绍
4.1.3. 模型上板掉点
本节对 CheckLists 中 第四步 进行详细说明.
- 判断后处理程序是否有误
在
AX
开发板上使用run_joint
指令可以实现板端推理, 然后使用用户自己的后处理程序对推理结果进行解析.为了验证的用户后处理程序是否存在错误, 可以比较在同一输入的条件下,
pulsar run
的输出结果与run_joint
的输出结果之间是否存在差异,具体参考 gt 文件夹对分说明, 如果对分成功, 说明 用户的 后处理程序
可能
存在错误.
- 后处理程序正确, 但精度依然很低
- 原因的可能
npu simulator
生成的指令和cmode
跑出的结果不一致run_joint.so
和npu drive
出错
这类问题需要提交相关日志, 以便于快速修复.
- BadCase 处理
其他平台没问题, 仅在
AX
平台精度很低, 对于这类BadCase
, 先用pulsar run
查一下cos-sim
, 如果没有掉点严重(低于 98%),那么将这个
BadCase
送到板子上用run_joint
跑一遍,看下结果是否和
pulsar run
一致, 如果不一致, 说明是上板有问题, 需要AX
工程师修复.
4.1.4. 其他注意事项
如果需要 AX
工程师排查问题, 请提供详细的日志信息以及相关实验结论.
>>> 注: 如果能够提供最小复现集可以提高解决问题的效率.
备注
在某些情况下 SILU
函数会导致检测模型的 mAP
很低, 将其替换为 ReLU
函数后可以解决问题.
备注
如果 量化数据集
与 训练数据集
差别很大, 会导致精度大幅度降低.
判断 calibration
选择是否合理, 可以从 calibration
数据集中选取一张进行 pulsar run
对分.
4.2. 精度调优建议
对于量化后的精度误差, 建议用户采用以下 2
种方式进行优化, 且均需要在 config.prototxt
文件配置后重新转换模型.
4.2.1. calibration 设置
量化策略与量化方案两两组合
尝试使用其他量化数据集
适当增加或减少数据量
4.2.2. QAT 训练
当使用各种调优手段依然无法提高模型精度时, 那么该模型可能是 PTQ
方案中的 corner case
, 这个时候可以尝试使用 QAT
训练.
注意
更多调优建议将会逐步更新.