6. IPU 性能分析
1. IPU 性能分析¶
1.1 Offline模型信息查看¶
Offline模型信息查看工具:SGS_IPU_Toolchain/DumpDebug/show_img_info.py。
(1) 工具使用命令
python3 show_img_info.py \
-m deploy_fixed.sim_sgsimg.img \
--soc_version chip型号
(2) 必选参数
-m
, --model
: 离线模型的路径
--soc_version
: chip型号
使用后将显示如下信息:
说明
-
Offline IMG Version
: 所用数据集生成该离线模型时用的SDK版本信息。 -
Offline Model Size
: 该离线模型的大小,单位是byte。 -
Offline Model Max Batch Numer
: 该离线模型的最大batch数。(Compiler工具-b,--batch
参数) -
Offline Model Suggested Batch
: n_buf模型内可参考的batch数,实际使用时可设置为小于等于Max Batch Numer的任意batch数。(Compiler工具--batch_mode
参数) -
Offline Model Supported Batch
:one_buf模型内可使用的batch数,只能在这些batch数中进行选择。(Compiler工具--batch_mode
参数) -
Offline Model Variable Buffer Size
: 该离线模型的Variable Buffer大小,单位是byte。 -
Offline_Model
:-
Input
:name: 模型输入Tensor名称。
index: 模型输入Tensor索引。
dtype: 模型输入Tensor的数据类型,uint8/allint16
layouts: 模型输入Tensor的数据排布,NCHW/NHWC
shape: 模型输入Tensor的shape信息。
training_input_formats:网络训练时的图片格式信息(input_config
training_input_formats
参数)input_formats:网络模型在SigmaStar芯片上运行的图片输入格式(input_config
input_formats
参数)input_width_alignment:数据作为网络输入时Width方向对齐的数量(input_config
input_width_alignment
参数)input_height_alignment:数据作为网络输入时Height方向对齐的数量(input_config
input_height_alignment
参数)batch:该离线模型的batch数
batch_mode:模型的batch模式,n_buf/one_buf
-
Output
:name:模型输出Tensor名称。
index:模型输出Tensor索引
dtype:模型输出Tensor的数据类型,uint8/allint16
shape:模型输出Tensor的shape信息。
batch:该离线模型的batch数
batch_mode:模型的batch模式,n_buf/one_buf
-
1.2 IPU 性能查看¶
Linux SDK-alkaid已提供sdk/verify/release_feature/source/dla/dla_dla_show_img_info的app。
板端执行prog_dla_dla_show_img_info这个可执行文件,可以通过打印查看模型的性能数据。
说明
-
Invoke Time
: 板端Invoke API耗时。板端Invoke API耗时包含:CPU驱动IPU工作耗时,IPU Time
,模型输出数据同步DRAM耗时等。 -
IPU Time
: IPU硬件耗时。 -
BandWidth
: 模型运行一次访问DRAM的数据量。 -
Variable size
: 模型运行时需要申请的运行内存。多个模型可以共享该内存,因此需要选用多个模型中最大的Variable size
。 -
work_mode
: 模型单核/双核模式信息。 -
Batch mode
: 模型Batch模式信息。 -
Setting batch
: 转换离线模型时设置的batch值。 -
Suggest batch
: 离线模型内部包含的batch值。
1.3 IPU Log性能分析¶
IPU Log性能分析工具位置:SGS_IPU_Toolchain/Scripts/example/performance_timeline.py
,将模型运行时生成的IPU Log 传入解析脚本,会在当前目录下生成一个json格式文件,打开Google Chrome浏览器,敲入chrome://tracing
,将生成的json文件拖入浏览器即可。
1.3.1 运行offline模型,生成IPU Log。¶
Linux SDK-alkaid已提供sdk/verify/release_feature/source/dla/dla_dla_show_img_info的app。
在板端执行prog_dla_dla_show_img_info这个可执行文件,生成ipu_log,ipu_log包括以_core0.bin/_core1.bin/_corectrl0.bin为结尾的二进制文件。
./prog_dla_dla_show_img_info \
-m deploy_fixed.sim_sgsimg.img \
--ipu_log logdir
-m
, --model
: 离线模型的路径
--ipu_log
: 生成ipu log的保存目录
注意
-
IPU Log的buf大小如果不够,在串口或者
dmesg
会有如下图红框的报错,此时生成的IPU Log是不完整的,需要增大--ipu_log_size
的参数重新生成IPU Log。 -
生成IPU Log期间打印的Invoke Time / IPU Time / BandWidth等信息不可信,请收集关闭生成IPU Log期间的打印作为模型的性能信息。
1.3.2 如何使用IPU log生成json 文件¶
python3 ~/SGS_IPU_Toolchain/Scripts/example/performance_timeline.py \
-c0 log_core0.bin\
-c1 log_core1.bin \
-cc log_corectrl0.bin \
-f 900 \
-v muffin
参数解释如下:
-c0
, --core0
: core0 ipu log 文件的路径 (单核只需 core0 ipu log)
-c1
, --core1
: core1 ipu log 文件路径
-cc
, --corectrl
: corectrl ipu log 文件路径 (可选)
-f
, --frequency
: ipu clk freq (默认为800)
-v
, --ipu_version
: ipu chip version (如:muffin)
运行结束后,会在运行目录下生成log_ctrl0.json文件,将生成的json文件拖入Google Chrome浏览器chrome://tracing
即可显示每层的性能耗时占比,其中各指标术语解释如下:
指标术语
-
start:该层开始时间
-
wall duration:该层耗时
-
total_cycle:该层cycle数,与“wall duration”可以换算,wall duration = total_cycle/freq
-
conv_cycle_percent:该层conv运行时间占该层运行时间百分比
-
vector_cycle_percent:该层vector运行时间占该层运行时间百分比
-
dma_load_cycle_percent:该层dma load运行时间占该层运行时间百分比
-
dma_store_cycle_percent:该层dma store运行时间占该层运行时间百分比
-
conv/vertor/dma_load/dma_store指令可以并行执行,所以百分比相加不是100%
1.3.3 如何使用统计op耗时工具¶
python3 ~/SGS_IPU_Toolchain/Scripts/DumpDebug/get_op_time_cost.py \
-m /path/to/fixed.sim \
--ipu_log_file /path/to/log.json
参数解释如下:
-m
:传入fixed.sim模型。
ipu_log_file
:传入1.3.2节生成的json文件。
mode
:支持 each 和 total 两种模式,默认是total。
total是打印op type的耗时占比,运行结束后,屏幕上会按每类op耗时占比从高到底进行打印。示例onnx_yolov8s的显示如下:
CONV_2D 80.743%
SOFTMAX 8.033%
CONCATENATION 5.006%
TRANSPOSE 2.304%
Fix2Float 1.121%
LOGISTIC 0.755%
RESIZE_NEAREST_NEIGHBOR 0.739%
MUL 0.536%
MAX_POOL_2D 0.405%
ADD 0.321%
STRIDED_SLICE 0.022%
SUB 0.013%
each是按照fixed模型op index打印每个op的耗时占比,示例onnx_yolov8s的显示如下:
0 CONV_2D 7.880%
1 CONV_2D 0.000%
2 CONV_2D 0.000%
3 CONV_2D 2.976%
4 CONV_2D 0.000%
5 CONCATENATION 1.214%
6 CONV_2D 4.951%
7 CONV_2D 0.000%
8 CONV_2D 0.000%
9 CONV_2D 1.132%
10 CONV_2D 1.132%
11 CONV_2D 1.128%
12 CONV_2D 1.132%
13 CONCATENATION 0.577%
14 CONV_2D 1.283%
15 CONV_2D 2.706%
16 CONV_2D 0.542%
17 CONV_2D 1.187%
18 CONV_2D 1.189%
19 CONV_2D 1.186%
20 CONV_2D 1.187%
21 CONCATENATION 0.141%
22 CONV_2D 1.153%
23 CONV_2D 2.470%
24 CONV_2D 0.592%
25 CONV_2D 1.162%
26 CONV_2D 1.165%
27 CONCATENATION 0.063%
28 CONV_2D 0.816%
29 CONV_2D 0.309%
30 MAX_POOL_2D 0.135%
31 MAX_POOL_2D 0.135%
32 MAX_POOL_2D 0.135%
33 CONV_2D 1.090%
34 RESIZE_NEAREST_NEIGHBOR 0.205%
35 CONV_2D 2.078%
36 CONV_2D 1.186%
37 CONV_2D 1.187%
38 CONCATENATION 0.106%
39 CONV_2D 0.831%
40 RESIZE_NEAREST_NEIGHBOR 0.534%
41 CONV_2D 1.833%
42 CONV_2D 1.129%
43 CONV_2D 1.129%
44 CONCATENATION 0.314%
45 CONV_2D 0.904%
46 CONV_2D 1.362%
47 CONV_2D 0.899%
48 CONV_2D 1.186%
49 CONV_2D 1.186%
50 CONCATENATION 0.105%
51 CONV_2D 0.825%
52 CONV_2D 1.192%
53 CONV_2D 0.866%
54 CONV_2D 1.159%
55 CONV_2D 1.156%
56 CONCATENATION 0.095%
57 CONV_2D 0.854%
58 CONV_2D 0.602%
59 CONV_2D 0.084%
60 CONV_2D 0.016%
61 CONV_2D 1.178%
62 CONV_2D 0.300%
63 CONV_2D 0.031%
64 CONCATENATION 0.027%
65 TRANSPOSE 0.049%
66 CONV_2D 1.208%
67 CONV_2D 0.286%
68 CONV_2D 0.046%
69 CONV_2D 2.409%
70 CONV_2D 1.187%
71 CONV_2D 0.102%
72 CONCATENATION 0.089%
73 TRANSPOSE 0.206%
74 CONV_2D 2.249%
75 CONV_2D 1.127%
76 CONV_2D 0.384%
77 CONV_2D 10.019%
78 CONV_2D 0.000%
79 CONV_2D 0.000%
80 CONCATENATION 0.919%
81 TRANSPOSE 0.978%
82 CONCATENATION 1.356%
83 TRANSPOSE 0.756%
84 SOFTMAX 8.033%
85 TRANSPOSE 0.316%
86 CONV_2D 0.184%
87 STRIDED_SLICE 0.011%
88 MUL 0.311%
89 STRIDED_SLICE 0.011%
90 ADD 0.306%
91 ADD 0.015%
92 SUB 0.013%
93 MUL 0.225%
94 LOGISTIC 0.755%
95 Fix2Float 1.121%
并且会在1.3.2节生成的json文件的路径下重新生成一个前缀为new_的json文件,当发现1.3.2节生成的json文件在Google Chrome浏览器chrome://tracing
中显示的index和fixed模型中op的index对应不上时,将这个新生成的json拖入到浏览器中,index显示可以一致。
chrome://tracing
中常用快捷键:
W
: 放大
S
: 缩小
A
: 左移
D
: 右移