Skip to content

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)
Please Note:

  • 若模型为 多输入 时,-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)
Please Note:

  • 若模型为 多输入 时,-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
与Onnx原模型对比:
./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图如下所示:

Histogram.png

图中蓝色部分是该层网络数据的出现次数,左右两边的红色虚线是最小值和最大值。

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”卷积模式,请手动开启。

  1. 在将SigmaStar浮点网络模型转化为SigmaStar定点网络模型时,注意保存在运行目录下的 log/tensor_min_max.txt 文件,该文件记录了在转换过程中各层的最大和最小值。如果卷积输入层的最大值和最小值相差过大(一般认为差值大于30),需要在对应网络的input_config.ini文件中开启该层的”INT16”卷积模式,具体修改方法请参考[2.2. input config配置信息设置]配置信息。修改input_config.ini文件后需要重新从原始框架训练的模型转换。
  2. 使用[6.2.2 使用auto_dump_debug.sh脚本分析数据]的auto_dump_debug.sh脚本对比数据后,如果RMSE值较大(一般认为大于0.5),可将该层前的卷积输入层开启 INT16 卷积模式。修改input_config.ini文件后需要重新从原始框架训练的模型转换。
  3. 使用[6.3. 使用histogram.py绘制各层网络模型的Histogram图]的histogram.py工具绘制Histogram图应使用SigmaStar浮点网络的Dump数据和对应的tensor_min_max.txt。如果图中的数据分布很集中,但是最大值和最小值范围较大(一般认为最大值和最小值的差值大于30),可以考虑对该层卷积的输入开启 INT16 卷积模式。修改input_config.ini文件后需要重新从原始框架训练的模型转换。