6. DumpDebug Tool
6.1. 主要功能¶
DumpDebug Tool工具的位置在 SGS_IPU_SDK/DumpDebug/ 。 该工具是主要功能如下:
- 解析网络模型数据;
- 对比不同阶段的网络模型数据;
- 绘制各层网络模型的Histogram图。
SigmaStar DLA SDK在转换网络时,Caffe、Onnx、TensorFlow的网络模型与SigmaStar浮点网络模型的结果完全一致,SigmaStar定点网络模型与SigmaStar离线网络模型的结果完全一致。
有精度差别的只有在SigmaStar浮点模型转换为SigmaStar定点这个阶段,因此在发现SigmaStar定点网络的结果与原有浮点的结果相差较多时,使用DumpDebug Tool可以检查转换后定点网络的错误。
DumpDebug Tool也可用于直接dump原模型Caffe/Onnx的每一层数据,以便与SigmaStar模型进行对比。
6.2. 使用步骤¶
6.2.1 Dump网络模型中各层数据¶
6.2.1.1 Dump SigmaStar浮点或定点模型¶
-
在 SGS_IPU_SDK/cfg 文件夹中找到DebugConfig.txt文件,复制到当前运行路径下.
-
打开DebugConfig.txt,修改文件内容:
dumpTensor eliminateGarbage dequantFixed #dumpasstring #disableDomainFuseOps path=
DebugConfig.txt各参数作用:
dumpTensor
: Dump网络模型各层数据总开关。eliminateGarbage
: Dump网络模型数据时去除无用数据(建议开启)。dequantFixed
: 针对定点网络模型,将整形数据转换为浮点数据(建议开启)。dumpasstring
: Dump网络模型数据为字符串类型,关闭选项为二进制文件类型。(如果需要[6.2.2 使用auto_dump_debug.sh脚本分析数据]功能,务必关闭此选项)。disableDomainFuseOps
: 转换定点网络模型时,取消网络层融合(建议关闭)。path=
: 指定生成档案的输出全路径(path= 后面确保填写类似 /home/user 的绝对路径。如果path= 后面没有内容或根本没有 path= 的话,则会默认输出到 $HOME 位置。另外,绝对路径或 /home/user 不超过122字节)。 -
运行simulator对单张图片推演。
-
推演完成后,会在path=参数指定的目录生成sigma_outtensor_dump.bin,即为Dump网络模型中各层的数据。
Note
- Dump完成后重命名sigma_outtensor_dump.bin文件,请勿修改文件后缀。新的Dump会复写sigma_outtensor_dump.bin文件。
- DebugConfig.txt文件中disableDomainFuseOps 选项只在使用calibrator将浮点网络模型转换成定点网络模型时有用。其作用是取消网络融合功能,关闭该选项时,定点网络模型和离线网络模型能够在转换时优化网络模型的算子,加速模型的运行,但是也会影响网络的层级结构,使得部分算子的输出不会被Dump到sigma_outtersor_dump.bin文件中。如果需要网络模型的每一层数据,可以打开disableDomainFuseOps选项,重新运行calibrator转换定点网络模型,此时转出的模型没有融合优化,可以输出每层的数据。
- 对比浮点网络模型和定点网络模型,使用simulator中参数
-t/--type
和-m/--model
指定不同阶段的模型,即可Dump出不同阶段的网络模型数据。 - 离线模型不支持Dump Debug,离线模型网络的层级结构Domain已经融合,不能Dump网络模型中各层的数据。
- 使用calibrator将浮点网络模型转换为定点网络模型时,会在SGS_IPU_SDK根目录下产生tensor_min_max.txt 文件,此文件记录了网络的每层输入和输出的最大与最小值,将在之后分析Dump数据时有用。
6.2.1.2 Dump Caffe原模型¶
工具的位置在 SGS_IPU_SDK/DumpDebug/code/caffe_dump_data.py。
caffe_dump_data.py脚本需要使用 python2 运行(Caffe仅支持python2),用于以字符串形式或者二进制形式dump出Caffe原模型每一层的数据。
使用示例:
(1)caffe_dump_data.py中修改Caffe的运行路径,比如:
caffe_root = '/home/your_caffe_root'
sys.path.insert(0,caffe_root+'/python')
(2)运行脚本:
python2 caffe_dump_data.py \
--model_file caffe_mobilenet_v2.prototxt \
--weight_file caffe_mobilenet_v2.caffemodel \
--i ./img.bmp \
--dump_bin True \
-n ./caffe_mobilenet_v2.py
必选参数说明:
--model_file
: Caffe原模型prototxt文件路径。
--weight_file
: Caffe原模型caffemodel文件路径。
-i
,--image
: 图片文件或图片文件夹路径或 指定图片路径列表文件 。
--dump_bin
: 是否以二进制形式dump每一层结果。
True: Dump结果以二进制形式保存于当前运行目录下的
./dumpData/caffe_NHWC_outtensor_dump.bin(4维tensor排布格式为NHWC,与SigmaStar模型相同)
False: Dump结果以字符串形式保存于当前运行目录下的
./dumpData/caffe_NHWC_outtensor_dump.txt(4维tensor排布格式为NHWC,与SigmaStar模型相同)
./dumpData/NHWC(每层输出单独生成文件,4维tensor排布格式为NHWC,与SigmaStar模型相同)
./dumpData/NCHW(每层输出单独生成文件,4维tensor排布格式为NCHW,与原模型排布相同)
-n
, --preprocess
: 前处理方法,请直接给定前处理python文件路径。需要确保前处理python文件中包含 get_image 函数,并且该函数带有 nchw 参数用来处理原模型4维输入的排布为NCHW(caffe_dump_data.py会直接调用get_image函数来生成模型input数据,并且强制nchw=True)。 前处理脚本函数示例:
def get_image(img_path, resizeH=224, resizeW=224, resizeC=3, norm=True, meanB=104, meanG=117, meanR=123, std=58.82, rgb=False, nchw=False):
...
...
if nchw:
# NCHW
img_norm = np.transpose(img_norm.reshape(resizeH, resizeW, -1), axes=(2, 0, 1))
return np.expand_dims(img_norm, 0)
- 若模型为 多输入 时,
-n,--preprocess
参数用法需要多个前处理方法,例如 -n preprocess1.py,preprocess2.py 或者 --preprocess preprocess1.py,preprocess2.py - 若模型为 多输入 时,
-i/--image
参数传入 指定图片路径列表文件 的形式。
6.2.1.3 Dump Onnx原模型¶
工具的位置在 SGS_IPU_SDK/DumpDebug/code/onnx_dump_data.py。
onnx_dump_data.py脚本需要使用 python3 运行(与IPU SDK环境相同),用于以字符串形式或者二进制形式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原模型文件路径。
-i
,--image
: 图片文件或图片文件夹路径或 指定图片路径列表文件 。
--dump_bin
: 是否以二进制形式dump每一层结果。
True: Dump结果以二进制形式保存于当前运行目录下的
./dumpData/onnx_NHWC_outtensor_dump.bin(4维tensor排布格式为NHWC,与SigmaStar模型相同)
False: Dump结果以字符串形式保存于当前运行目录下的
./dumpData/onnx_NHWC_outtensor_dump.txt(4维tensor排布格式为NHWC,与SigmaStar模型相同)
./dumpData/NHWC(每层输出单独生成文件,4维tensor排布格式为NHWC,与SigmaStar模型相同)
./dumpData/NCHW(每层输出单独生成文件,4维tensor排布格式为NCHW,与原模型排布相同)
-n
, --preprocess
: 前处理方法,请直接给定前处理python文件路径。需要确保前处理python文件中包含 get_image 函数,并且该函数带有 nchw 参数用来处理原模型4维输入的排布为NCHW(onnx_dump_data.py会直接调用get_image函数来生成模型input数据,并且强制nchw=True)。 前处理脚本函数示例:
def get_image(img_path, resizeH=224, resizeW=224, resizeC=3, norm=True, meanB=104, meanG=117, meanR=123, std=58.82, rgb=False, nchw=False):
...
...
if nchw:
# NCHW
img_norm = np.transpose(img_norm.reshape(resizeH, resizeW, -1), axes=(2, 0, 1))
return np.expand_dims(img_norm, 0)
- 若模型为 多输入 时,
-n,--preprocess
参数用法需要多个前处理方法,例如 -n preprocess1.py,preprocess2.py 或者 --preprocess preprocess1.py,preprocess2.py - 若模型为 多输入 时,
-i/--image
参数传入 指定图片路径列表文件 的形式。
6.2.2 使用auto_dump_debug.sh脚本分析数据¶
工具的位置在 SGS_IPU_SDK/DumpDebug/auto_dump_debug.sh。
6.2.2.1 对比分析SigmaStar浮点与定点模型¶
auto_dump_debug.sh脚本能够对比样本 bin(sample)和基准 bin(benchmark)的相同output tensor层的COS、MSE和RMSE,需使用[6.2.1.1 Dump SigmaStar浮点或定点模型]中Dump出浮点网络模型和定点网络模型的bin文件。
使用示例:
./auto_dump_debug.sh \
/home/user/SGS_IPU_SDK \
/home/user/sample.bin \
/home/user/benchmark.bin
相关参数说明:
Param1
: SGS_IPU_SDK 的路径,如果在当前位置,只需传目录夹名。
Param2
: 需要对比的已经 dump出来的sample bin路径,此处应为定点网络模型Dump出的bin文件路径。
Param3
: 作为参考的已经 dump出来的 benchmark bin路径,此处应为浮点网络模型Dump出的bin文件路径。
未开启disableDomainFuseOps选项时,完成分析后显示如下:(部分)
3.conv1_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000046 COS:0.999898 RMSE:0.014310
4.pool1.xx.output0 OP_TYPE:MAX_POOL_2D MSE:0.000057 COS:0.999931 RMSE:0.011018
7.res2a_branch1_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000076 COS:0.999886 RMSE:0.015652
11.res2a_branch2a_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000027 COS:0.999652 RMSE:0.023612
16.res2a_xx.xx.output0 OP_TYPE:RELU MSE:0.000177 COS:0.999644 RMSE:0.025049
20.res2b_branch2a_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000069 COS:0.999242 RMSE:0.039121
25.res2b_xx.xx.output0 OP_TYPE:RELU MSE:0.000430 COS:0.999452 RMSE:0.030551
28.res3a_branch1_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000165 COS:0.998975 RMSE:0.041644
32.res3a_branch2a_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000139 COS:0.998842 RMSE:0.048416
37.res3a_xx.xx.output0 OP_TYPE:RELU MSE:0.000297 COS:0.999069 RMSE:0.041043
41.res3b_branch2a_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000070 COS:0.998836 RMSE:0.051215
46.res3b_xx.xx.output0 OP_TYPE:RELU MSE:0.000366 COS:0.999035 RMSE:0.042863
49.res4a_branch1_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000026 COS:0.999282 RMSE:0.035575
53.res4a_branch2a_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000108 COS:0.998950 RMSE:0.047213
58.res4a_xx.xx.output0 OP_TYPE:RELU MSE:0.000149 COS:0.999174 RMSE:0.040582
62.res4b_branch2a_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000030 COS:0.999020 RMSE:0.046630
67.res4b_xx.xx.output0 OP_TYPE:RELU MSE:0.000168 COS:0.999073 RMSE:0.041229
70.res5a_branch1_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000305 COS:0.999276 RMSE:0.033715
74.res5a_branch2a_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000032 COS:0.998723 RMSE:0.053469
79.res5a_xx.xx.output0 OP_TYPE:RELU MSE:0.000507 COS:0.998762 RMSE:0.050663
83.res5b_branch2a_xx_xx_xx.xx.output0 OP_TYPE:CONV_2D MSE:0.000027 COS:0.998182 RMSE:0.064201
88.res5b_xx.xx.output0 OP_TYPE:RELU MSE:0.006022 COS:0.998665 RMSE:0.056931
89.pool5.xx.output0 OP_TYPE:AVG_POOL_2D MSE:0.004321 COS:0.998488 RMSE:0.079694
90.fc1000_reshape#1_output#183.output0 OP_TYPE:ReshapeAliasMSE:0.004321 COS:0.998488 RMSE:0.079694
91.fc1000#185.xx.output0 OP_TYPE:CONV_2D MSE:0.014197 COS:0.998901 RMSE:0.051447
92.fc1000.xx.output0 OP_TYPE:ReshapeAliasMSE:0.014197 COS:0.998901 RMSE:0.051447
93.prob.xx.output0 OP_TYPE:Fix2Float MSE:0.000000 COS:1.000000 RMSE:0.000152
开启disableDomainFuseOps选项时,完成分析后显示如下:(部分)
0.conv1.xx.output0 OP_TYPE:CONV_2D MSE:2.397930 COS:0.999887 RMSE:0.019312
1.conv1_xx.xx.output0 OP_TYPE:MUL MSE:0.000037 COS:0.999850 RMSE:0.020800
2.conv1_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000037 COS:0.999936 RMSE:0.010667
3.conv1_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000052 COS:0.999885 RMSE:0.015123
4.pool1.xx.output0 OP_TYPE:MAX_POOL_2D MSE:0.000063 COS:0.999924 RMSE:0.011603
5.res2a_branch1.xx.output0 OP_TYPE:CONV_2D MSE:0.000096 COS:0.999952 RMSE:0.009368
6.res2a_branch1_xx.xx.output0 OP_TYPE:MUL MSE:0.000080 COS:0.999956 RMSE:0.009144
7.res2a_branch1_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000080 COS:0.999880 RMSE:0.016141
8.res2a_branch2a.xx.output0 OP_TYPE:CONV_2D MSE:0.000349 COS:0.999951 RMSE:0.009727
9.res2a_branch2a_xx.xx.output0 OP_TYPE:MUL MSE:0.000049 COS:0.999956 RMSE:0.009349
10.res2a_branch2a_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000049 COS:0.999886 RMSE:0.016510
11.res2a_branch2a_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000028 COS:0.999641 RMSE:0.024211
12.res2a_branch2b.xx.output0 OP_TYPE:CONV_2D MSE:0.000100 COS:0.999821 RMSE:0.018379
13.res2a_branch2b_xx.xx.output0 OP_TYPE:MUL MSE:0.000118 COS:0.999832 RMSE:0.017982
14.res2a_branch2b_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000118 COS:0.999670 RMSE:0.024984
15.res2a.xx.output0 OP_TYPE:ADD MSE:0.000241 COS:0.999771 RMSE:0.021801
16.res2a_xx.xx.output0 OP_TYPE:RELU MSE:0.000182 COS:0.999634 RMSE:0.025262
17.res2b_branch2a.xx.output0 OP_TYPE:CONV_2D MSE:0.000525 COS:0.999709 RMSE:0.023127
18.res2b_branch2a_xx.xx.output0 OP_TYPE:MUL MSE:0.000193 COS:0.999746 RMSE:0.022434
19.res2b_branch2a_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000193 COS:0.999474 RMSE:0.032121
20.res2b_branch2a_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000071 COS:0.999219 RMSE:0.039747
21.res2b_branch2b.xx.output0 OP_TYPE:CONV_2D MSE:0.000157 COS:0.999549 RMSE:0.030371
22.res2b_branch2b_xx.xx.output0 OP_TYPE:MUL MSE:0.000272 COS:0.999587 RMSE:0.029537
23.res2b_branch2b_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000272 COS:0.999151 RMSE:0.040304
24.res2b.xx.output0 OP_TYPE:ADD MSE:0.000534 COS:0.999425 RMSE:0.031402
25.res2b_xx.xx.output0 OP_TYPE:RELU MSE:0.000448 COS:0.999429 RMSE:0.031203
26.res3a_branch1.xx.output0 OP_TYPE:CONV_2D MSE:0.000267 COS:0.999320 RMSE:0.034101
27.res3a_branch1_xx.xx.output0 OP_TYPE:MUL MSE:0.000169 COS:0.999345 RMSE:0.034331
28.res3a_branch1_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000169 COS:0.998949 RMSE:0.042434
29.res3a_branch2a.xx.output0 OP_TYPE:CONV_2D MSE:0.001885 COS:0.999472 RMSE:0.030785
30.res3a_branch2a_xx.xx.output0 OP_TYPE:MUL MSE:0.000427 COS:0.999486 RMSE:0.030586
31.res3a_branch2a_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000427 COS:0.998909 RMSE:0.045188
32.res3a_branch2a_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000147 COS:0.998773 RMSE:0.049700
33.res3a_branch2b.xx.output0 OP_TYPE:CONV_2D MSE:0.000331 COS:0.999425 RMSE:0.034038
34.res3a_branch2b_xx.xx.output0 OP_TYPE:MUL MSE:0.000368 COS:0.999411 RMSE:0.034275
35.res3a_branch2b_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000368 COS:0.998931 RMSE:0.044919
36.res3a.xx.output0 OP_TYPE:ADD MSE:0.000585 COS:0.999040 RMSE:0.042398
37.res3a_xx.xx.output0 OP_TYPE:RELU MSE:0.000301 COS:0.999058 RMSE:0.041479
38.res3b_branch2a.xx.output0 OP_TYPE:CONV_2D MSE:0.000811 COS:0.999530 RMSE:0.029739
39.res3b_branch2a_xx.xx.output0 OP_TYPE:MUL MSE:0.000288 COS:0.999580 RMSE:0.028879
40.res3b_branch2a_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000288 COS:0.999383 RMSE:0.033874
41.res3b_branch2a_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000073 COS:0.998787 RMSE:0.052493
42.res3b_branch2b.xx.output0 OP_TYPE:CONV_2D MSE:0.000136 COS:0.999469 RMSE:0.033442
43.res3b_branch2b_xx.xx.output0 OP_TYPE:MUL MSE:0.000314 COS:0.999489 RMSE:0.033050
44.res3b_branch2b_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000314 COS:0.999308 RMSE:0.036079
45.res3b.xx.output0 OP_TYPE:ADD MSE:0.000659 COS:0.998989 RMSE:0.042628
46.res3b_xx.xx.output0 OP_TYPE:RELU MSE:0.000375 COS:0.999011 RMSE:0.043575
47.res4a_branch1.xx.output0 OP_TYPE:CONV_2D MSE:0.000098 COS:0.999264 RMSE:0.037842
48.res4a_branch1_xx.xx.output0 OP_TYPE:MUL MSE:0.000027 COS:0.999298 RMSE:0.037615
49.res4a_branch1_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000027 COS:0.999253 RMSE:0.036302
50.res4a_branch2a.xx.output0 OP_TYPE:CONV_2D MSE:0.001011 COS:0.999543 RMSE:0.028507
51.res4a_branch2a_xx.xx.output0 OP_TYPE:MUL MSE:0.000300 COS:0.999544 RMSE:0.028563
52.res4a_branch2a_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000300 COS:0.999147 RMSE:0.040221
53.res4a_branch2a_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000107 COS:0.998961 RMSE:0.047238
54.res4a_branch2b.xx.output0 OP_TYPE:CONV_2D MSE:0.000335 COS:0.999464 RMSE:0.032660
55.res4a_branch2b_xx.xx.output0 OP_TYPE:MUL MSE:0.000255 COS:0.999453 RMSE:0.032788
56.res4a_branch2b_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000255 COS:0.999234 RMSE:0.038888
57.res4a.xx.output0 OP_TYPE:ADD MSE:0.000312 COS:0.999298 RMSE:0.036873
58.res4a_xx.xx.output0 OP_TYPE:RELU MSE:0.000146 COS:0.999191 RMSE:0.040181
59.res4b_branch2a.xx.output0 OP_TYPE:CONV_2D MSE:0.000369 COS:0.999748 RMSE:0.021992
60.res4b_branch2a_xx.xx.output0 OP_TYPE:MUL MSE:0.000156 COS:0.999772 RMSE:0.021527
61.res4b_branch2a_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000156 COS:0.999625 RMSE:0.026857
62.res4b_branch2a_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000028 COS:0.999073 RMSE:0.045494
63.res4b_branch2b.xx.output0 OP_TYPE:CONV_2D MSE:0.000048 COS:0.999748 RMSE:0.022612
64.res4b_branch2b_xx.xx.output0 OP_TYPE:MUL MSE:0.000191 COS:0.999751 RMSE:0.022354
65.res4b_branch2b_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000191 COS:0.999678 RMSE:0.024581
66.res4b.xx.output0 OP_TYPE:ADD MSE:0.000337 COS:0.999448 RMSE:0.032108
67.res4b_xx.xx.output0 OP_TYPE:RELU MSE:0.000160 COS:0.999113 RMSE:0.040588
68.res5a_branch1.xx.output0 OP_TYPE:CONV_2D MSE:0.000072 COS:0.999179 RMSE:0.038052
69.res5a_branch1_xx.xx.output0 OP_TYPE:MUL MSE:0.000290 COS:0.999179 RMSE:0.038130
70.res5a_branch1_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000290 COS:0.999311 RMSE:0.032880
71.res5a_branch2a.xx.output0 OP_TYPE:CONV_2D MSE:0.000355 COS:0.999758 RMSE:0.020371
72.res5a_branch2a_xx.xx.output0 OP_TYPE:MUL MSE:0.000133 COS:0.999750 RMSE:0.020561
73.res5a_branch2a_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000133 COS:0.999613 RMSE:0.026392
74.res5a_branch2a_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000028 COS:0.998859 RMSE:0.051003
75.res5a_branch2b.xx.output0 OP_TYPE:CONV_2D MSE:0.000063 COS:0.999512 RMSE:0.031809
76.res5a_branch2b_xx.xx.output0 OP_TYPE:MUL MSE:0.001009 COS:0.999480 RMSE:0.032233
77.res5a_branch2b_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.001009 COS:0.999257 RMSE:0.039436
78.res5a.xx.output0 OP_TYPE:ADD MSE:0.001413 COS:0.999379 RMSE:0.034297
79.res5a_xx.xx.output0 OP_TYPE:RELU MSE:0.000457 COS:0.998876 RMSE:0.048274
80.res5b_branch2a.xx.output0 OP_TYPE:CONV_2D MSE:0.001387 COS:0.999842 RMSE:0.015781
81.res5b_branch2a_xx.xx.output0 OP_TYPE:MUL MSE:0.000239 COS:0.999839 RMSE:0.015798
82.res5b_branch2a_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.000239 COS:0.999639 RMSE:0.026762
83.res5b_branch2a_xx_xx_xx.xx.output0 OP_TYPE:RELU MSE:0.000023 COS:0.998458 RMSE:0.058598
84.res5b_branch2b.xx.output0 OP_TYPE:CONV_2D MSE:0.000041 COS:0.999061 RMSE:0.041137
85.res5b_branch2b_xx.xx.output0 OP_TYPE:MUL MSE:0.007750 COS:0.999058 RMSE:0.041188
86.res5b_branch2b_xx_xx.xx.output0 OP_TYPE:ADD MSE:0.007751 COS:0.998732 RMSE:0.052601
87.res5b.xx.output0 OP_TYPE:ADD MSE:0.008533 COS:0.998792 RMSE:0.052043
88.res5b_xx.xx.output0 OP_TYPE:RELU MSE:0.004860 COS:0.998924 RMSE:0.051718
89.pool5.xx.output0 OP_TYPE:AVG_POOL_2D MSE:0.004061 COS:0.998601 RMSE:0.078395
90.fc1000_reshape#1_output#183.output0 OP_TYPE:ReshapeAliasMSE:0.004061 COS:0.998601 RMSE:0.078395
91.fc1000#185.xx.output0 OP_TYPE:CONV_2D MSE:0.013363 COS:0.998935 RMSE:0.050327
92.fc1000.xx.output0 OP_TYPE:ReshapeAliasMSE:0.013363 COS:0.998935 RMSE:0.050327
93.prob.xx.output0 OP_TYPE:SOFTMAX MSE:0.000000 COS:1.000000 RMSE:0.000152
6.2.2.2 对比分析SigmaStar(浮点/定点)模型与原模型(Caffe/Onnx)¶
auto_dump_debug.sh脚本同样能够对比SigmaStar(浮点/定点)模型与原模型(Caffe/Onnx)相同output tensor层的COS、MSE和RMSE。打印格式与[6.2.2.1 对比分析SigmaStar浮点与定点模型]相同。
将[6.2.1.1 Dump SigmaStar浮点或定点模型]中Dump出的浮点网络模型或定点网络模型的bin文件作为样本 bin(sample),传入Param2,不得传入Param3。
将[6.2.1.2 Dump Caffe原模型]或[6.2.1.3 Dump Onnx原模型]中Dump出的原模型bin文件作为基准 bin(benchmark),传入Param3,不得传入Param2。
与Caffe原模型对比:
./auto_dump_debug.sh \
/home/user/SGS_IPU_SDK \
/home/user/sigma_outtensor_dump.bin \
/home/user/caffe_NHWC_outtensor_dump.bin
./auto_dump_debug.sh \
/home/user/SGS_IPU_SDK \
/home/user/sigma_outtensor_dump.bin \
/home/user/onnx_NHWC_outtensor_dump.bin
相关参数说明:
Param1
: SGS_IPU_SDK 的路径,如果在当前位置,只需传目录夹名。
Param2
: 需要对比的已经 dump出来的sample bin路径,此处应为SigmaStar网络模型(浮点/定点)Dump出的bin文件路径。
Param3
: 作为参考的已经 dump出来的 benchmark bin路径,此处应为原模型(Caffe/Onnx)Dump出的bin文件路径。
6.3. 使用histogram.py绘制各层网络模型的Histogram图¶
工具的位置在 SGS_IPU_SDK/DumpDebug/histogram.py。 该工具可对Dump出来的数据绘制各层的数据分布,使用该工具需Dump出的数据文件,以及使用calibrator 工具将浮点网络模型转换成定点网络模型时在运行目录下 log/tensor_min_max.txt 文件。
工具使用示例:
Python3 histogram.py sigma_outtensor_dump.bin tensor_min_max.txt
运行中如下提示
[===============================================> ]97.61%
绘制的Histogram图如下所示:
图中蓝色部分是该层网络数据的出现次数,左右两边的红色虚线是最小值和最大值。
Note
- 工具在运行当前路径下,会创建Histograms文件夹,里面包含各网络层的数据Histogram图片。
- 对不同Dump数据绘制网络模型的Histogram图时,应该重命名当前路径下的Histograms文件夹,或移动至其他路径,histogram.py 工具会在运行时删除当前路径下的Histograms文件夹。
6.4. 错误处理¶
当运行时发生SegmentFault错误时,程序中断运行,此时定位程序发生错误位置至关重要。请输入以下命令,协助提供相关信息。
修改生成core文件路径为当前目录,并设置core文件大小无上限:
echo core > /proc/sys/kernel/core_pattern
ulimit -c unlimited
重新运行刚刚发生错误的转换网络命令。
生成core文件后,运行如下命令,会打印程序相关信息:
~/SGS_IPU_SDK/DumpDebug/show_address.sh /path/to/SGS_IPU_SDK/bin/XXX /path/to/core
show_address.sh脚本需要两个参数,第一个参数为执行命令的bin的路径,第二个参数为core的路径。
屏幕会打印内存映射信息以及程序函数堆栈地址,请反馈此信息。
6.5. 使用sim_optimizer优化模型精度¶
使用calibrator将根据统计信息自动配置卷积的量化方式,目前有 --quant_level
参数可以选择L1、L2、L3、L4或L5。如果fixed模型的精度与float模型相比损失较大,而通过修改input_config.ini中的[CONV_CONFIG],使用ALL_INT16能使得fixed模型精度与float模型相近,可以使用sim_optimizer.py工具优化训练,得到较为合适的模型精度。
sim_optimizer.py工具的位置在 SGS_IPU_SDK/Scripts/examples/sim_optimizer.py
。
6.5.1 必选参数¶
-i, --image
: 图片文件 / 图片文件夹路径。
-m, --model
: Float网络模型文件路径。
--input_config
: input_config.ini文件路径,该文件为input tensor的配置信息。
-n, --preprocess
: 前处理方法,与图片前处理方法相关,也可以完成前处理文件配置后,给定前处理文件路径。
6.5.2 可选参数¶
--num_process
: 进程数,运行同时运行的进程数。(可选参数,不加该参数默认为10个进程)。
6.5.3 使用示例¶
使用sim_optimizer.py前,应首先通过修改input_config.ini配置卷积为全16bit精度,重新转换float和fixed模型后,验证fixed模型与原有模型精度基本一致,本工具才有可用之处。使用sim_optimizer.py时,应还原input_config.ini,使得所有卷积默认为8bit量化。使用sim_optimizer.py示例如下:
python3 ~/SGS_IPU_SDK/Scripts/examples/sim_optimizer.py \
-i ~/SGS_Models/resource/detection/coco2017_calibration_set32 \
-m ~/SGS_Models/tensorflow/ssd_mobilenet_v1/ssd_mobilenet_v1_float.sim \
-n ssd_mobilenet_v1 \
--input_config ~/SGS_Models/tensorflow/ssd_mobilenet_v1/input_config.ini \
--num_process 20
sim_optimizer.py运行结束后,会生成若干量化导入文件,生成的量化导入文件数量与sim_optimizer.py中定义的compression_rates的list中数量相同,因此可以修改该list中的参数,参数的范围是 (0.5, 1)。
再使用sim_calibrator.py工具将量化信息导入到模型中,生成fixed模型。
python3 ~/SGS_IPU_SDK/Scripts/examples/sim_calibrator.py \
-i ~/SGS_Models/resource/detection/coco2017_calibration_set32 \
-m ~/SGS_Models/tensorflow/ssd_mobilenet_v1/ssd_mobilenet_v1_float.sim \
-n ssd_mobilenet_v1 \
--input_config ~/SGS_Models/tensorflow/ssd_mobilenet_v1/input_config.ini \
--quant_file ./optimized_quant_info_0.pkl \
--num_process 20
6.6. 相关问题汇总¶
DumpDebug Tool提供了模型量化后精度下降问题的排查方法,可用于针对实际问题参考。 使用calibrator时,--quant_level
选择L2、L3、L4或L5时会根据统计信息自动配置卷积的量化方式,如果calibrator未能将下列情况的卷积修改成”INT16”卷积模式,请手动开启。
- 在将SigmaStar浮点网络模型转化为SigmaStar定点网络模型时,注意保存在运行目录下的 log/tensor_min_max.txt 文件,该文件记录了在转换过程中各层的最大和最小值。如果卷积输入层的最大值和最小值相差过大(一般认为差值大于30),需要在对应网络的input_config.ini文件中开启该层的”INT16”卷积模式,具体修改方法请参考[2.2. input config配置信息设置]配置信息。修改input_config.ini文件后需要重新从原始框架训练的模型转换。
- 使用[6.2.2 使用auto_dump_debug.sh脚本分析数据]的auto_dump_debug.sh脚本对比数据后,如果RMSE值较大(一般认为大于0.5),可将该层前的卷积输入层开启 INT16 卷积模式。修改input_config.ini文件后需要重新从原始框架训练的模型转换。
- 使用[6.3. 使用histogram.py绘制各层网络模型的Histogram图]的histogram.py工具绘制Histogram图应使用SigmaStar浮点网络的Dump数据和对应的tensor_min_max.txt。如果图中的数据分布很集中,但是最大值和最小值范围较大(一般认为最大值和最小值的差值大于30),可以考虑对该层卷积的输入开启 INT16 卷积模式。修改input_config.ini文件后需要重新从原始框架训练的模型转换。