4. 模型精度问题调试
1. IPU精度问题概述¶
当模型精度不符合预期时,IPU给出了几种常见的精度问题的Debug思路,具体分为以下三种:
-
原始框架模型与Float.sim模型精度问题
-
Float.sim模型和Fixed.sim模型精度问题
-
板端精度问题
2. 原始框架模型与Float.sim模型精度问题¶
当模型精度不符合预期时,首选要排查原始框架模型推理结果和Float.sim模型推理结果是否一致。确保浮点模型结果一致后,再排查模型量化问题才有意义。
2.1 如何运行原始AI框架模型¶
-
使用
SGS_IPU_Toolchain/DumpDebug/code/run_caffe.py
运行 Caffe模型使用示例:
python3 run_caffe.py \ -i 000775.jpg \ --model ./caffe_mobilenet_v2.prototxt \ --weight ./caffe_mobilenet_v2.caffemodel \ -n ./caffe_mobilenet_v2.py \ --input_config ./input_config.ini
-
使用
SGS_IPU_Toolchain/DumpDebug/code/run_onnx.py
运行 Onnx模型使用示例:
python3 run_onnx.py \ -i 000775.jpg \ --model ./mobilenet_v2.onnx \ -n ./mobilenet_v2.py \ --input_config ./input_config.ini
-
使用
SGS_IPU_Toolchain/DumpDebug/code/run_tflite.py
运行 Tflite模型使用示例:
python3 run_tflite.py \ -i 000775.jpg \ --model ./mobilenet_v2.tflite \ -n ./mobilenet_v2.py
将原始AI框架模型的推理结果与Float.sim的推理结果比较,如果不一致,需要逐层Dump数据比较是从哪层算子开始导致的模型结果不一致。
使用须知
- 首先要确保原始模型前处理和Float.sim模型前处理结果一致。
- 原始模型推理结果保存在output目录,Float.sim模型推理结果保存在log/output目录,记得每次推理后,对生成文件重命名,避免覆盖。
2.2 如何dump原始AI框架模型推理数据¶
2.2.1 Dump解析Caffe原模型¶
-
工具的位置在
SGS_IPU_Toolchain/DumpDebug/code/caffe_dump_data.py
。 -
caffe_dump_data.py脚本需要使用 python3 运行(IPU Toolchain环境已包含caffe的python运行环境),用于以字符串形式或者二进制形式dump出caffe原模型每一层的数据。
-
使用示例:
python3 caffe_dump_data.py \ --model_file caffe_mobilenet_v2.prototxt \ --weight_file caffe_mobilenet_v2.caffemodel \ --image ./img.bmp \ --dump_bin True \ -n ./caffe_mobilenet_v2.py
-
使用参数说明:
① 必选参数说明:
-
--model_file
: Caffe原模型prototxt文件路径。 -
--weight_file
: Caffe原模型caffemodel文件路径。 -
-i
,--image
: 图片文件或图片文件夹路径或 指定图片路径列表文件 。 -
--dump_bin
: 是否以二进制形式dump每一层结果,可选 True / False。
使用须知
-
True: Dump结果以二进制形式保存于当前运行目录下,将自动创建文件夹dumpData, 内存有caffe_NHWC_outtensor_dump.bin结果文件 ./dumpData/caffe_NHWC_outtensor_dump.bin(4维tensor排布格式为NHWC,与IPU模型相同)
-
False: Dump结果以字符串形式保存于当前运行目录下,将自动创建文件夹dumpData,内存有caffe_NHWC_outtensor_dump.txt结果文件及NHWC和NCHW文件夹 ./dumpData/caffe_NHWC_outtensor_dump.txt(4维tensor排布格式为NHWC,与IPU模型相同) ./dumpData/NHWC(每层输出单独生成文件,4维tensor排布格式为NHWC,与IPU模型相同) ./dumpData/NCHW(每层输出单独生成文件,4维tensor排布格式为NCHW,与原模型排布相同)
-
如果需要使用dump_debug.py脚本分析数据,务必使用 True。
-n
, --preprocess
: 前处理方法,请直接给定前处理python文件路径。请使用运行sim模型的前处理文件。
② 可选参数说明:
--input_config
: input_config.ini的路径。如果模型配置了input_layouts=NCHW,可增加input_config.ini的配置,这样才能使caffe_dump_data.py在内部对齐-n
, --preprocess
的数据排布。
使用须知
- 若模型为 多输入 时,
-n,--preprocess
参数用法需要多个前处理方法,例如 -n preprocess1.py,preprocess2.py 或者 --preprocess preprocess1.py,preprocess2.py - 若模型为 多输入 时,
-i/--image
参数传入 指定图片路径列表文件 的形式。
2.2.2 Dump解析Onnx原模型¶
-
工具的位置在
SGS_IPU_Toolchain/DumpDebug/code/onnx_dump_data.py
。 -
onnx_dump_data.py脚本需要使用 python3 运行(与IPU Toolchain环境相同),用于以字符串形式或者二进制形式dump出Onnx原模型每一层的数据。
-
使用示例:
python3 onnx_dump_data.py \ --model_file onnx_mobilenet_v2.onnx \ --image ./img.bmp \ --dump_bin True \ -n onnx_mobilenet_v2.py
-
使用参数说明:
① 必选参数说明:
--model_file
: ONNX refine模型文件路径(使用时ConvertTool.py会生成)。或者每层都包含shape信息的ONNX模型路径。
-i
,--image
: 图片文件或图片文件夹路径或 指定图片路径列表文件 。
--dump_bin
: 是否以二进制形式dump每一层结果,可选 True / False。
使用须知
-
True: Dump结果以二进制形式保存于当前运行目录下,将自动创建文件夹dumpData, 内存有onnx_NHWC_outtensor_dump.bin结果文件 ./dumpData/onnx_NHWC_outtensor_dump.bin(4维tensor排布格式为NHWC,与IPU模型相同)
-
False: Dump结果以字符串形式保存于当前运行目录下,将自动创建文件夹dumpData,内存有onnx_NHWC_outtensor_dump.txt结果文件及NHWC和NCHW文件夹 ./dumpData/onnx_NHWC_outtensor_dump.txt(4维tensor排布格式为NHWC,与IPU模型相同) ./dumpData/NHWC(每层输出单独生成文件,4维tensor排布格式为NHWC,与IPU模型相同) ./dumpData/NCHW(每层输出单独生成文件,4维tensor排布格式为NCHW,与原模型排布相同)
-
如果需要使用dump_debug.py脚本分析数据,务必使用 True。
-n
, --preprocess
: 前处理方法,请直接给定前处理python文件路径。请使用运行sim模型的前处理文件。
② 可选参数说明:
--input_config
: input_config.ini的路径。如果模型配置了input_layouts=NCHW,可增加input_config.ini的配置,这样才能使onnx_dump_data.py在内部对齐-n
, --preprocess
的数据排布。
使用须知
- 若模型为 多输入 时,
-n,--preprocess
参数用法需要多个前处理方法,例如 -n preprocess1.py,preprocess2.py 或者 --preprocess preprocess1.py,preprocess2.py - 若模型为 多输入 时,
-i/--image
参数传入 指定图片路径列表文件 的形式。
2.3 如何dump Float.sim模型和Fixed.sim模型推理数据¶
逐层dump 浮点模型 和定点模型前,需要先将 SGS_IPU_Toolchain/cfg/DebugConfig.txt
文件拷贝到执行目录,同时打开如下开关, 再使用 SGS_IPU_Toolchain/Scripts/calibrator/simulator.py
分别对浮点模型和定点模型仿真,会在path指定目录生成sigma_outtensor_dump.bin 文件。
- DebugConfig.txt
dumpTensor # Dump网络模型各层数据总开关,需打开。(默认关闭)
eliminateGarbage # Dump网络模型数据时去除无用数据,需打开。
dequantFixed # 针对定点网络模型,将整形数据转换为浮点数据,需打开。(默认关闭)
#dumpasstring # Dump网络模型数据为字符串类型,关闭选项为二进制文件类型。(如果需要使用auto_dump_debug.sh脚本分析数据,务必关闭此选项)。
#disableDomainFuseOps # 转换定点网络模型时,取消网络层融合(建议关闭)。
path= # 指定生成档案的输出全路径(path= 后面确保填写类似 **/home/user** 的绝对路径。如果path= 后面没有内容或根本没有 path= 的话,则会默认输出到 **$HOME** 位置。路径长度不超过122字节)
使用须知
-
Dump完成后,结果将保存在sigma_outtensor_dump.bin文件中,若需重命名,请勿修改文件后缀 .bin。
-
新的Dump会复写sigma_outtensor_dump.bin文件,若重新运行,请注意保存。
-
DebugConfig.txt文件中disableDomainFuseOps 选项说明:
- 作用于转换定点网络模型阶段,建议关闭。
- 使用时,默认关闭该选项,即calibrator将浮点网络模型转换成定点网络模型时将进行网络融合,如果打开该选项,则将取消网络融合功能。
- 关闭该选项时,定点网络模型和离线网络模型能够在转换时优化网络模型的算子,加速模型的运行,但是也会影响网络的层级结构,使得部分算子的输出不会被Dump到sigma_outtersor_dump.bin文件中。
- 如果需要网络模型的每一层数据,可以打开disableDomainFuseOps选项,重新运行calibrator转换定点网络模型,此时转出的模型没有融合优化,可以输出每层的数据。
-
离线模型不支持Dump Debug,离线模型网络的层级结构Domain已经融合,不能Dump网络模型中各层的数据。
2.3.1 dump Float.sim模型推理数据¶
使用 SGS_IPU_Toolchain/Scripts/calibrator/simulator.py
工具对 浮点模型仿真,会在path指定目录生成sigma_outtensor_dump.bin 文件,仿真推理结果保存在执行目录./log/output 文件夹中。
使用示例:
python3 ~/SGS_IPU_Toolchain/Scripts/calibrator/simulator.py \
-m ./mobilenet_v1_float.sim \
-i ./000775.jpg \
-n ./pre.py \
--soc_version CHIP
2.3.2 dump Fixed.sim模型推理数据¶
使用 SGS_IPU_Toolchain/Scripts/calibrator/simulator.py
工具对 定点模型仿真,会在path指定目录生成sigma_outtensor_dump.bin 文件,仿真推理结果保存在执行目录./log/output 文件夹中。
使用示例:
python3 ~/SGS_IPU_Toolchain/Scripts/calibrator/simulator.py \
-m ./mobilenet_v1_fixed.sim \
-i ./000775.jpg \
-n ./pre.py \
--soc_version CHIP
使用须知
- 浮点模型和定点模型仿真推理生成的sigma_outtensor_dump.bin 文件和log/output 重名,记得每次仿真后,对生成文件重命名,避免覆盖。
- 非dump数据操作,请及时将DebugConfig.txt文件从执行目录移除,避免影响模型转换操作。
3 使用auto_dump_debug.sh脚本分析数据¶
3.1 原始框架模型和Float.sim模型精度问题¶
如果原始框架模型的推理结果与Float.sim 模型的推理结果不一致,可以使用 SGS_IPU_Toolchain/DumpDebug/auto_dump_debug.sh
工具逐层比较 dump出的bin 文件,能够通过对比样本 bin(sample)和基准 bin(benchmark)的相同output tensor层的COS、MSE和RMSE 来判断是哪层算子的结果不正确,导致模型输出的结果不正确。
使用 SGS_IPU_Toolchain/DumpDebug/auto_dump_debug.sh
脚本运行,查看错误的Layer。
使用示例:
./auto_dump_debug.sh \
/home/user/SGS_IPU_Toolchain \
/path/to/float_sim_sigma_outtensor_dump.bin \
/path/to/caffe_NHWC_outtensor_dump.bin
① 与Caffe原模型对比:
./auto_dump_debug.sh \
/home/user/SGS_IPU_Toolchain \
/home/user/sigma_outtensor_dump.bin \
/home/user/caffe_NHWC_outtensor_dump.bin
./auto_dump_debug.sh \
/home/user/SGS_IPU_Toolchain \
/home/user/sigma_outtensor_dump.bin \
/home/user/onnx_NHWC_outtensor_dump.bin
-
Param1
: SGS_IPU_Toolchain 的路径,如果在当前位置,只需传目录夹名。 -
Param2
: 需要对比的已经 dump出来的sample bin路径,此处应为IPU网络模型(浮点/定点)Dump出的bin文件路径。 -
Param3
: 作为参考的已经 dump出来的 benchmark bin路径,此处应为原模型(Caffe/Onnx)Dump出的bin文件路径。
3.2 Float.sim模型和Fixed.sim模型精度问题¶
Float.sim 和Fixed.sim 误差很大,可以通过如下流程Debug:
使用 SGS_IPU_Toolchain/DumpDebug/dauto_dump_debug.sh
工具逐层比较Float.sim模型的推理与Fixed.sim 模型的推理是dump的bin 文件,可以能够通过对比样本 bin(sample)和基准 bin(benchmark)的相同output tensor层的COS、MSE和RMSE 来判断是哪层算子的精度损较大。
使用示例:
./auto_dump_debug.sh \
/home/user/SGS_IPU_Toolchain \
/home/user/sample.bin \
/home/user/benchmark.bin
相关参数说明:
-
Param1
: SGS_IPU_Toolchain 的路径,如果在当前位置,只需传目录夹名。 -
Param2
: 需要对比的已经 dump出来的sample bin路径,此处应为定点网络模型Dump出的bin文件路径。 -
Param3
: 作为参考的已经 dump出来的 benchmark bin路径,此处应为浮点网络模型Dump出的bin文件路径。
使用须知
- auto_dump_debug.sh脚本对比结果将受DebugConfig.txt中disableDomainFuseOps影响。
① 未开启disableDomainFuseOps选项时,完成分析后显示如下:(部分)
0) data MSE: 0.028521 COS: 0.990174 RMSE: 0.191048
1) conv1/bn_xx_xx MSE: 0.000060 COS: 0.999969 RMSE: 0.007786
2) conv2_1/expand/bn_xx_xx MSE: 0.000133 COS: 0.999922 RMSE: 0.010600
3) conv2_1/dwise/bn_xx_xx MSE: 0.001055 COS: 0.999604 RMSE: 0.026628
4) conv2_1/linear/bn_xx MSE: 0.008872 COS: 0.997960 RMSE: 0.077780
5) conv2_2/expand/bn_xx_xx MSE: 0.000849 COS: 0.999145 RMSE: 0.034236
6) conv2_2/dwise/bn_xx_xx MSE: 0.002526 COS: 0.998491 RMSE: 0.054812
7) conv2_2/linear/bn_xx MSE: 0.016800 COS: 0.995695 RMSE: 0.100490
8) conv3_1/expand/bn_xx_xx MSE: 0.000814 COS: 0.997401 RMSE: 0.067148
9) conv3_1/dwise/bn_xx_xx MSE: 0.003532 COS: 0.993593 RMSE: 0.096485
10) block_3_1 MSE: 0.054808 COS: 0.992504 RMSE: 0.127393
11) conv3_2/expand/bn_xx_xx MSE: 0.002223 COS: 0.995493 RMSE: 0.076465
12) conv3_2/dwise/bn_xx_xx MSE: 0.003252 COS: 0.997917 RMSE: 0.058834
13) conv3_2/linear/bn_xx MSE: 0.030526 COS: 0.995008 RMSE: 0.099188
14) conv4_1/expand/bn_xx_xx MSE: 0.000484 COS: 0.998078 RMSE: 0.053329
15) conv4_1/dwise/bn_xx_xx MSE: 0.001138 COS: 0.995249 RMSE: 0.085869
16) block_4_1 MSE: 0.041154 COS: 0.993904 RMSE: 0.108148
17) conv4_2/expand/bn_xx_xx MSE: 0.000628 COS: 0.997298 RMSE: 0.064804
18) conv4_2/dwise/bn_xx_xx MSE: 0.001379 COS: 0.994016 RMSE: 0.094983
19) block_4_2 MSE: 0.047413 COS: 0.992955 RMSE: 0.115523
20) conv4_3/expand/bn_xx_xx MSE: 0.001276 COS: 0.997816 RMSE: 0.054641
21) conv4_3/dwise/bn_xx_xx MSE: 0.004304 COS: 0.996268 RMSE: 0.078860
22) conv4_3/linear/bn_xx MSE: 0.019364 COS: 0.992479 RMSE: 0.122014
23) conv4_4/expand/bn_xx_xx MSE: 0.000678 COS: 0.996980 RMSE: 0.070730
24) conv4_4/dwise/bn_xx_xx MSE: 0.001787 COS: 0.993290 RMSE: 0.109461
25) block_4_4 MSE: 0.031072 COS: 0.992266 RMSE: 0.123066
26) conv4_5/expand/bn_xx_xx MSE: 0.000657 COS: 0.995815 RMSE: 0.085172
27) conv4_5/dwise/bn_xx_xx MSE: 0.001807 COS: 0.993433 RMSE: 0.106439
28) block_4_5 MSE: 0.043631 COS: 0.991963 RMSE: 0.125202
29) conv4_6/expand/bn_xx_xx MSE: 0.000639 COS: 0.995696 RMSE: 0.087078
30) conv4_6/dwise/bn_xx_xx MSE: 0.001854 COS: 0.994223 RMSE: 0.098243
31) block_4_6 MSE: 0.061734 COS: 0.991830 RMSE: 0.125977
32) conv4_7/expand/bn_xx_xx MSE: 0.001029 COS: 0.994616 RMSE: 0.095454
33) conv4_7/dwise/bn_xx_xx MSE: 0.003071 COS: 0.996565 RMSE: 0.072931
34) conv4_7/linear/bn_xx MSE: 0.014118 COS: 0.992815 RMSE: 0.117115
35) conv5_1/expand/bn_xx_xx MSE: 0.000649 COS: 0.997619 RMSE: 0.061338
36) conv5_1/dwise/bn_xx_xx MSE: 0.001037 COS: 0.995496 RMSE: 0.087281
37) block_5_1 MSE: 0.022231 COS: 0.993252 RMSE: 0.114678
38) conv5_2/expand/bn_xx_xx MSE: 0.000522 COS: 0.996605 RMSE: 0.078887
39) conv5_2/dwise/bn_xx_xx MSE: 0.001216 COS: 0.995946 RMSE: 0.079409
40) block_5_2 MSE: 0.031804 COS: 0.993276 RMSE: 0.115544
41) conv5_3/expand/bn_xx_xx MSE: 0.000592 COS: 0.995792 RMSE: 0.085456
42) conv5_3/dwise/bn_xx_xx MSE: 0.001892 COS: 0.997871 RMSE: 0.053695
43) conv5_3/linear/bn_xx MSE: 0.008352 COS: 0.994394 RMSE: 0.104836
44) conv6_1/expand/bn_xx_xx MSE: 0.000359 COS: 0.997728 RMSE: 0.062928
45) conv6_1/dwise/bn_xx_xx MSE: 0.000522 COS: 0.996774 RMSE: 0.072542
46) block_6_1 MSE: 0.012969 COS: 0.995122 RMSE: 0.098212
47) conv6_2/expand/bn_xx_xx MSE: 0.000311 COS: 0.997588 RMSE: 0.068856
48) conv6_2/dwise/bn_xx_xx MSE: 0.000694 COS: 0.996954 RMSE: 0.066177
49) block_6_2 MSE: 0.018713 COS: 0.994592 RMSE: 0.103677
50) conv6_3/expand/bn_xx_xx MSE: 0.000360 COS: 0.995374 RMSE: 0.095421
51) conv6_3/dwise/bn_xx_xx MSE: 0.001144 COS: 0.998021 RMSE: 0.047618
52) conv6_3/linear/bn_xx MSE: 0.005441 COS: 0.991614 RMSE: 0.128396
53) conv6_4/bn_xx_xx MSE: 0.022556 COS: 0.991828 RMSE: 0.135669
54) pool6 MSE: 0.004184 COS: 0.995849 RMSE: 0.094941
55) fc7 MSE: 0.081746 COS: 0.995249 RMSE: 0.104243
56) prob MSE: 0.000000 COS: 1.000000 RMSE: 0.000914
② 开启disableDomainFuseOps选项时,完成分析后显示如下:(部分)
0) data MSE: 0.028521 COS: 0.990174 RMSE: 0.191048
1) conv1/bn_xx_xx MSE: 0.000060 COS: 0.999969 RMSE: 0.007786
2) conv2_1/expand/bn_xx_xx MSE: 0.000133 COS: 0.999922 RMSE: 0.010600
3) conv2_1/dwise/bn_xx_xx MSE: 0.001055 COS: 0.999604 RMSE: 0.026628
4) conv2_1/linear/bn_xx MSE: 0.008872 COS: 0.997960 RMSE: 0.077780
5) conv2_2/expand/bn_xx_xx MSE: 0.000849 COS: 0.999145 RMSE: 0.034236
6) conv2_2/dwise/bn_xx_xx MSE: 0.002526 COS: 0.998491 RMSE: 0.054812
7) conv2_2/linear/bn_xx MSE: 0.016800 COS: 0.995695 RMSE: 0.100490
8) conv3_1/expand/bn_xx_xx MSE: 0.000814 COS: 0.997401 RMSE: 0.067148
9) conv3_1/dwise/bn_xx_xx MSE: 0.003532 COS: 0.993593 RMSE: 0.096485
10) conv3_1/linear/bn_xx MSE: 0.026856 COS: 0.987982 RMSE: 0.156977
11) block_3_1 MSE: 0.054808 COS: 0.992504 RMSE: 0.127393
12) conv3_2/expand/bn_xx_xx MSE: 0.002223 COS: 0.995493 RMSE: 0.076465
13) conv3_2/dwise/bn_xx_xx MSE: 0.003252 COS: 0.997917 RMSE: 0.058834
14) conv3_2/linear/bn_xx MSE: 0.030526 COS: 0.995008 RMSE: 0.099188
15) conv4_1/expand/bn_xx_xx MSE: 0.000484 COS: 0.998078 RMSE: 0.053329
16) conv4_1/dwise/bn_xx_xx MSE: 0.001138 COS: 0.995249 RMSE: 0.085869
17) conv4_1/linear/bn_xx MSE: 0.008352 COS: 0.991382 RMSE: 0.126459
18) block_4_1 MSE: 0.041154 COS: 0.993904 RMSE: 0.108148
19) conv4_2/expand/bn_xx_xx MSE: 0.000628 COS: 0.997298 RMSE: 0.064804
20) conv4_2/dwise/bn_xx_xx MSE: 0.001379 COS: 0.994016 RMSE: 0.094983
21) conv4_2/linear/bn_xx MSE: 0.005679 COS: 0.990344 RMSE: 0.133938
22) block_4_2 MSE: 0.047413 COS: 0.992955 RMSE: 0.115523
23) conv4_3/expand/bn_xx_xx MSE: 0.001276 COS: 0.997816 RMSE: 0.054641
24) conv4_3/dwise/bn_xx_xx MSE: 0.004304 COS: 0.996268 RMSE: 0.078860
25) conv4_3/linear/bn_xx MSE: 0.019364 COS: 0.992479 RMSE: 0.122014
26) conv4_4/expand/bn_xx_xx MSE: 0.000678 COS: 0.996980 RMSE: 0.070730
27) conv4_4/dwise/bn_xx_xx MSE: 0.001787 COS: 0.993290 RMSE: 0.109461
28) conv4_4/linear/bn_xx MSE: 0.009286 COS: 0.991433 RMSE: 0.132465
29) block_4_4 MSE: 0.031072 COS: 0.992266 RMSE: 0.123066
30) conv4_5/expand/bn_xx_xx MSE: 0.000657 COS: 0.995815 RMSE: 0.085172
31) conv4_5/dwise/bn_xx_xx MSE: 0.001807 COS: 0.993433 RMSE: 0.106439
32) conv4_5/linear/bn_xx MSE: 0.011957 COS: 0.989749 RMSE: 0.144398
33) block_4_5 MSE: 0.043631 COS: 0.991963 RMSE: 0.125202
34) conv4_6/expand/bn_xx_xx MSE: 0.000639 COS: 0.995696 RMSE: 0.087078
35) conv4_6/dwise/bn_xx_xx MSE: 0.001854 COS: 0.994223 RMSE: 0.098243
36) conv4_6/linear/bn_xx MSE: 0.018842 COS: 0.989861 RMSE: 0.140551
37) block_4_6 MSE: 0.061734 COS: 0.991830 RMSE: 0.125977
38) conv4_7/expand/bn_xx_xx MSE: 0.001029 COS: 0.994616 RMSE: 0.095454
39) conv4_7/dwise/bn_xx_xx MSE: 0.003071 COS: 0.996565 RMSE: 0.072931
40) conv4_7/linear/bn_xx MSE: 0.014118 COS: 0.992815 RMSE: 0.117115
41) conv5_1/expand/bn_xx_xx MSE: 0.000649 COS: 0.997619 RMSE: 0.061338
42) conv5_1/dwise/bn_xx_xx MSE: 0.001037 COS: 0.995496 RMSE: 0.087281
43) conv5_1/linear/bn_xx MSE: 0.008186 COS: 0.992600 RMSE: 0.123085
44) block_5_1 MSE: 0.022231 COS: 0.993252 RMSE: 0.114678
45) conv5_2/expand/bn_xx_xx MSE: 0.000522 COS: 0.996605 RMSE: 0.078887
46) conv5_2/dwise/bn_xx_xx MSE: 0.001216 COS: 0.995946 RMSE: 0.079409
47) conv5_2/linear/bn_xx MSE: 0.010952 COS: 0.992991 RMSE: 0.118647
48) block_5_2 MSE: 0.031804 COS: 0.993276 RMSE: 0.115544
49) conv5_3/expand/bn_xx_xx MSE: 0.000592 COS: 0.995792 RMSE: 0.085456
50) conv5_3/dwise/bn_xx_xx MSE: 0.001892 COS: 0.997871 RMSE: 0.053695
51) conv5_3/linear/bn_xx MSE: 0.008352 COS: 0.994394 RMSE: 0.104836
52) conv6_1/expand/bn_xx_xx MSE: 0.000359 COS: 0.997728 RMSE: 0.062928
53) conv6_1/dwise/bn_xx_xx MSE: 0.000522 COS: 0.996774 RMSE: 0.072542
54) conv6_1/linear/bn_xx MSE: 0.004180 COS: 0.995212 RMSE: 0.099410
55) block_6_1 MSE: 0.012969 COS: 0.995122 RMSE: 0.098212
56) conv6_2/expand/bn_xx_xx MSE: 0.000311 COS: 0.997588 RMSE: 0.068856
57) conv6_2/dwise/bn_xx_xx MSE: 0.000694 COS: 0.996954 RMSE: 0.066177
58) conv6_2/linear/bn_xx MSE: 0.006447 COS: 0.995696 RMSE: 0.095621
59) block_6_2 MSE: 0.018713 COS: 0.994592 RMSE: 0.103677
60) conv6_3/expand/bn_xx_xx MSE: 0.000360 COS: 0.995374 RMSE: 0.095421
61) conv6_3/dwise/bn_xx_xx MSE: 0.001144 COS: 0.998021 RMSE: 0.047618
62) conv6_3/linear/bn_xx MSE: 0.005441 COS: 0.991614 RMSE: 0.128396
63) conv6_4/bn_xx_xx MSE: 0.022556 COS: 0.991828 RMSE: 0.135669
64) pool6 MSE: 0.004184 COS: 0.995849 RMSE: 0.094941
65) fc7 MSE: 0.081746 COS: 0.995249 RMSE: 0.104243
66) prob MSE: 0.000000 COS: 1.000000 RMSE: 0.000914
- 当发现某层指标不佳,想看具体数据时,可在运行路径下找到Undefined_xxx.bin_DumpDebug_out文件夹(xxx.bin为bin的文件名)。
该文件夹内部从0开始编号文件夹,编号与上述指标打印Tensor name前的编号一致。
具体数据以16个为一行排布,如果需要每行仅1个数据排布的方式,运行./auto_dump_debug.sh前在环境变量中多配置:
export SAVE_ONE_ROW=1
3.2.1 检查前处理¶
1)图片输入模型 前处理Python 文件的image_preprocess 函数定义中需要两个参数:
-
图片路径
-
归一化标记(norm=True)
其中归一化标记用于区分运行是否需要做图片归一化的动作。在运行Float.sim 模型需要传入归一化后的图片, image_preprocess调用时会为norm传True,此时需要将归一化动作放在norm为True下。运行Fixed.sim和 Offline模型需要传入与模型输入大小的UINT8格式大小图片,此时不需要做归一化。因此图片输入模型前要检查 是否正确使用了归一化标记,并做了正确的处理。同时,input_config.ini和前处理Python文件中所配置的 mean和std值要保持一致。
2)非图片输入模型 请参考前处理文件编写说明,确保前处理Python文件需要实现和模型输入大小一致的对应类型的numpy.ndarray类型数据。
3.2.2 使用ALL_INT16量化查看结果¶
在input_config.ini中增加如下内容
[CONV_CONFIG]
input_format=ALL_INT16;
3.2.3 使用DumpDebug工具分析¶
对比Float.sim和Fixed.sim每层结果精度,输出每层Tensor的MSE、COS、RMSE信息作为参考。 由于Fixed.sim模型会有算子融合,部分Tensor无法dump出数据,可以通过开启DebugConfig.txt中disableDomainFuseOps选项, 重新生成Fixed.sim模型后dump数据,再用dump_debug.py对比,可以得到更为详细的比对信息。
3.2.4 使用训练量化工具提升精度¶
SGS_IPU_Toolchain/Scripts/calibrator/torch_calibrator.py
该脚本有两大量化等级,推荐使用精度更好的Q2量化等级,但是需要额外配置GPU环境,否则训练时间可能较长。训练结束后会自动选取最优量化参数生成Fixed.sim模型。
3.2.5 能明确找到精度丢失层?¶
通过使用DumpDebug工具得到的MES、COS、RMSE信息中,从过往经验判断,当COS < 0.99或RMSE > 0.1,说明该层精度可能已经无法满足。
如上图所示,在DumpDebug工具得到的信息中,如果这三个指标一直震荡,比如COS总在0.99 ~ 0.98震荡,RMSE也总在 0.01 ~ 0.1震荡,可以通过使用训练量化工具后再次对比。
如果能明确发现从某一层或几层开始,MES、COS、RMSE三个指标都发生了很大改变,说明发生问题的点正是从这层开始的。如果这三个指标没有发生突变,比如COS慢慢从0.99往下掉,RMSE慢慢从0.1往上升,
可以找到第一个上述两个指标超过经验阈值的层作为后续重点查找目标。
3.2.6 通过手动修改参数解决?¶
手动修改参数的主要目的是通过修改指标不佳的Tensor用INT16量化,看能否提升到合适的精度。
当找到怀疑的Tensor后首先需要使用SGS_IPU_Toolchain中提供的Netron工具同时打开Float.sim和Fixed.sim模型,并定位到出问题的Operator位置。
Fixed.sim模型可以点击对应Op,在右边弹窗中点开输入输出Tensor查看到量化信息。如上图所示,当发现Tensor的min / max范围超过20,并且该Tensor仍为UINT8量化,可以通过修改input_config.ini配置卷积升级到INT16量化。
由于input_config.ini中只能配置卷积的输入Tensor为INT16量化,如果该Op不是卷积,可以将该Op前后几个卷积都配置成INT16后观察精度是否改善。
3.2.7 提供相关分析数据¶
如果能提供原始模型或者Float.sim和Fixed.sim模型,能最快复现问题。
如果无法提供模型,需要提供dump出的Float.sim和Fixed.sim的数据,并使用如下脚本dump出Fixed.sim模型的量化信息:
python3 SGS_IPU_Toolchain/Scripst/examples/save_quant_param.py \
-m mobilenet_v1_fixed.sim
使用须知
-
提供每层精度对比结果
-
如果能定位出丢失精度的算子,提供丢失精度算子float的输入输出数据和fixed的输入输出数据
-
如果不能定位丢失精度的算子,把第一步的对比数据给到FAE相关同事帮忙判断具体需要提供的数据
4. 板端精度问题¶
当板端结果和PC端offline仿真结果不一致时,先确定PC端fixed模型仿真结果与offline仿真结果是否一致,如果一致,可通过如下方法定位板端模型结果与PC仿真Offline模型结果不一致的原因。
4.1 使用simulator方法验证Fixed模型与Offline模型结果是否一致¶
PC上使用SGS_IPU_Toolchain/Scripts/calibrator/simulator.py
分别运行Fixed模型和Offline模型,比较二者的输出结果是否一致。
运行Fixed模型示例:
python3 SGS_IPU_Toolchain/Scripts/calibrator/simulator.py \
-i 000775.jpg \
-m mobilenet_v1_fixed.sim \
-n mobilenet_v1_preprocess.py \
--soc_version CHIP
使用须知
- 运行结果报错在./log/output/目录,需重命名log目录(如 log_fixed),避免覆盖。
运行Offline模型示例:
python3 SGS_IPU_Toolchain/Scripts/calibrator/simulator.py \
-i 000775.jpg \
-m mobilenet_v1_fixed.sim_sgsimg.img \
-n mobilenet_v1_preprocess.py \
--soc_version CHIP
使用须知
- 运行结果报错在./log/output/目录,需重命名log目录(如 log_offline),避免覆盖。
如果Fixed模型结果与Offline模型结果一致,再定位板端模型结果与PC仿真Offline模型结果不一致的原因。
4.2 使用simulator方法验证Offline模型板端结果与PC端结果是否一致¶
PC上使用SGS_IPU_Toolchain/Scripts/calibrator/simulator.py
工具通过rpc协议调用,在板端运行offline模型,同时将板端推理结果 写回到PC端output 目录,方便客户比较板端推理结果与PC端图例结果是否一致,排除由于前处理等因素导致的输入数据不一致的干扰,便于客户快速定位问题。
Linux SDK-alkaid已提供sdk/verify/release_feature/source/dla/ipu_server的app。
在板端运行prog_dla_ipu_server
应用程序,开启RPC服务,SGS_IPU_Toolchain/Scripts/calibrator/simulator.py
在PC端通过IP地址和端口号访问板端应用程序,将PC 端模型下发到板端运行推理后,再将推理结果返回到PC端。
板端开启RPC应用服务示例:
./prog_dla_ipu_server -p PORT
PC端通过RPC服务在板端运行推理实例:
python3 SGS_IPU_Toolchain/Scripts/calibrator/simulator.py \
-i 000775.jpg \
-m mobilenet_v1_fixed.sim_sgsimg.img \
-n mobilenet_v1_preprocess.py \
--host 板端ip地址 \
--port PORT \
--soc_version CHIP
使用须知
相关参数解释
-
--host HOST
IPU Server host. -
--port PORT
IPU Server port. -
--timeout TIMEOUT
Set timeout seconds, default is 60s. -
--model_onboard_path
MODEL_ONBOARD_PATH Model on board path.
运行完成后,比较PC端仿真推理结果和通过RPC服务的板端推理结果是否一致。结果如果不一致,可以联系对应的FAE,请求支援。结果如果一致,需要排查板端demo,定位一下是哪里的bug导致的板端推理结果不正确。