NNIE 精度问题定位步骤
nnie 精度问题定位步骤:
第 1 步:确认数据是否正确。
找一张有精度问题的图片,量化、指令仿真、caffe 都用这张图片。比较仿真和 caffe 每
层的相似度。
case 1: 如果第一层,即 data 层的相似度不是 0.999,请看第 2 步。
case 2: 如果第一层是 0.99+,后面逐层下降,最后一层小于 0.95,请看第 3 步。
case 3: 如果最后一层的相似度 0.99,中间某些层 0.90 以下,请看第 4 步。
case 4: 如果所有层的相似度都是 0.99+且绝对误差也很小,则很可能是后处理的问题,
请看第 5 步。
第 2 步:确认 data 层输入一致。
请检查均值[mean_file]、缩放[data_scale]、预处理方式[norm_type],是否和 caffe 一致。
Mxnet 和 Darknet(yolo) 网络训练时,默认是 RGB,所以量化时,cfg 里的[RGB_order]也
要配置为 RGB。
第 3 步:确认是否量化误差导致。
修改 nnie_mapper 的配置项,把[compile_mode] 0 改为 1,即 把 8bit 低精度改为 16bit 高
精度,再重新量化仿真比较相似度。
case 1: 如果相似度明显有提升,所有层都是 0.99,则说明是量化误差导致。使用高精度
会使性能下降一倍,如果不能接受,请尝试改为[compile_mode] 2,
即自定义高精度,从首层开始,逐层 layer name 加后缀"_hp",直到精度和性能
平衡(一般只要第一层卷积加_hp,精度就正常了,性能损失也小)。
如果不想使用高精度,还可以使用 fine-tuning 量化库重训,请联系海思 FAE。
case 2: 如果精度没有明显提升,则把明显下降的那层信息反馈给海思,看第 6 步。
第1步:确认数据是否正确。
找一张有精度问题的图片,编
译、指令 仿真、caffe都用这张
图片。比较仿真和caffe 每层的
相似度。
第2步:确认data层输入一致。
请检查均值[m ea n_file]、缩放[data_scale]、预处理方式[norm_type],
是否和caffe一致。Mxne t 和Da rknet(yolo) 网络训练时,默认是RG B,
所以编译时,cfg里的[RG B_order]也要配置为RGB。
case 1: 如果第一层,即dat a层的 相似度 不是0.999,请看第2步。
第3步:确认是否量化误差导致。
修改nnie_mapper的配置项,把[compile_mode] 0 改为 1,即把8bit低
精度改为16bit高精度,再重新编译仿真比较相似度。
case 2: 如果第一层是0.99+,后面逐层下降,最后一层小于0.95,请看第3步。
第4步:确认层是否匹配。
nnie_mapper会优化网络结构,以适应硬件执行,所以相似度比较时
有可能层和caffe的不匹配。
第5步:确认后处理是否正确。
假设caffe 的结果经过caffe的后处理画框或分类,则把仿真的结果也
使用caffe的后处理,看是否正常画框或分类。
第6步:反馈问题给海思分析。
请把以下信息发给海思:
1)有问题的那层对应的prototxt、weights、caffe和仿真的输入/输出数据。
2)编译用的cfg、图片、均值文件。
3)编译时打印的nnie_mapper版本号。
case 3: 如果最后一层的相似度0.99,中间某些层0.90以下,请看第4步。
case 4: 如果所有层的相似度都是0.99+且绝对误差也很小,则很可能是后处理的问题,请看第5步。
case 1: 如果相似度明显有提升,所有层都是0.99,则说明是量化误差导致。使用高精
度会使性能下降一倍,如果不能接受,请尝试改为[compile_mode] 2,即自定义高精
度,从首 层开始,逐层layer name加后缀"_hp",直到 精度和 性能平衡(一般只要第一层
卷积加_hp,精度就正常了,性能损失也小)。如果 不想使 用高精度,还可 以使用 量化
库重训,请联系海思FAE。
case 2: 如果精度没有明显提升,则把明显下降的那层信息反馈给海思,看第6步。
case 1: 是否inplace层。某些层nnie不支持inplace,会拆开,以非inplace的方式处
理。如 concat + relu , fc + scale 等。请修改prototxt,改为非inplace方式,再跑仿真
和caffe比较相似度。
case 2: 是否nnie_mapper修改了网络。请查看cnn_net_tre e.dot (nnie_mapper 编译时
生成),和原来的prototxt比较,看是否修改了网络结构。如upsample, ROIPoolin g,
PSROIPooling等层会加permute 做转换,所以 要和permute 的结果比,或直接看后
面层的相似度。
case 3: 如果层匹配,而相似度比较低,请把信息反馈给海思,看第6步。
case 1: 如果正常,则说 明是板 端后处理问题,请比较板端和caffe的后处理代码。
case 2: 如果不正常,而数据的相似度0.99且绝对误差很小,则说明caffe的后 处理代
码对数据很敏感,请检查caffe的后处理代 码。(此情况很少)
Confidential For HUAWEI Internal Only