专栏算法工具链【J6工具链性能分析与优化-1】编译器预估perf解读与性能分析

【J6工具链性能分析与优化-1】编译器预估perf解读与性能分析

momo(社区版)2024-09-21
398
0

1.引言

地平线J6参考算法如何在编译后生成layer-details

干货满满-J6工具链常用工具和API整理(含新手示例)

在以上两篇文章中,笔者介绍了J6工具链如何生成编译器性能预估perf以及layerdetails的方法,在这篇文章中,我们将首先介绍layerdetails中的参数信息,然后将结合实例分析如何利用layerdetails来分析模型的性能瓶颈,进而对模型的性能进行优化。

2.layerdetails中信息解读

J6工具链目前提供了两种方式生成性能评估报告:

  • 使用hb_compile工具编译模型时会自动生成性能评估报告;
  • 编译出hbm模型后,使用编译器提供的python API hbm_perf生成性能评估报告,这里需要注意,调用compile接口编译模型时需要开启debug后才能生成layerdetails。

性能预估报告包括html和json两个版本,通常看html即可。

html中包括Summary、Temporal Statistics和Layer Details这3个部分,下面将逐一介绍。

2.1Summary

  1. FPS(1 core)

  2. 在 1 个 BPU 内核上运行时的估计 FPS。

  3. Latency

  4. 编译后的模型推理一次的时间,编译的模型可能包含batch。

  5. BPU conv original OPs per frame

  6. 原始模型卷积层的计算量。 卷积变体(deconv、dilated conv、deformable conv 等)也被计算在内。

2.2Temporal Statistics

  1. Loaded bytes per frame

  2. 每帧推理 BPU 需要读取 DDR 的字节数。(编译时可能有batch,每帧推理不一定等于每次推理)

  3. Stored bytes per frame

  4. 每帧推理 BPU 需要写入 DDR 的字节数。(编译时可能有batch,每帧推理不一定等于每次推理)

  5. DDR (loaded + stored) bytes per frame:

  6. 每帧推理 BPU 需要读写 DDR 的字节数

  7. DDR bytes per second (for xxx FPS):

  8. 每秒BPU需要读写 DDR 的字节数。


2.3Layer Details

  1. layer

  2. 原始模型的layer name。torch模型没有layer name,torch转hbir时会自动命名

  3. original ops

  4. 原始layer的计算量(包含卷积及其变种)

  5. computing cost(no DDR)

  6. 编译后layer的时间开销,不包括DDR相关的时间开销,但会包含reorder(数据重排)的开销

  7. load/store cost

  8. 编译后layer的DDR访问时间开销。对于非模型输入输出的feature,DDR访问可能被优化掉。

  9. active period of time

  10. 编译后layer活跃时间段。不代表该layer的执行时间,通常都是多个layer交替/并行执行。

3.性能分析实例

3.1通用流程

  1. 首先观察Temporal Statistics统计图中的曲线:

  2. 观察computing曲线是否有波动,带宽瓶颈会引起它的波动

  3. 观察load&store柱状图,配合computing曲线,判断是否有带宽瓶颈

  4. 然后根据时态统计图中的时间轴,观察在某区间的layer detail

3.2实例分析

分析过程

1.观察computing曲线是否有波动,带宽瓶颈会引起它的波动:

如下图,此模型的computing曲线波动较大,模型可能存在带宽瓶颈。

2.进一步观察load&store柱状图,并配合computing曲线:

可以看到,图中由多处的load&store柱状图高于computing曲线,这些地方可能存在了带宽瓶颈。

3.根据时态统计图中的时间轴,观察在某区间的layer detail

如上图,标记了6处load&store柱状图高于computing的地方,对应的时间为:

然后根据layerdetails的active period of time查看以上时间点的对应算子:

  • 标记点1&标记2

可以看到引起带宽瓶颈的算子的Softmax_458_mul、MatMul_459,onnx模型中对应的子结构为:


  • 标记点3

可以看到引起带宽瓶颈的算子的Softmax_765_mul、MatMul_766,onnx模型中对应的子结构为:

  • 标记点4

可以看到引起带宽瓶颈的算子的Softmax_968_mul、MatMul_969,onnx模型中对应的子结构为:

  • 标记点5

可以看到引起带宽瓶颈的算子的Softmax_1171、MatMul_1172,onnx模型中对应的子结构为:

  • 标记点6

可以看到引起带宽瓶颈的算子的Softmax_1374、MatMul_1375,onnx模型中对应的子结构为:

初步结论

综合以上分析结果可知,此模型中引起性能问题的是Softmax和MatMul算子组成的子结构,在下一篇文章中,笔者将介绍模型性能相关的优化策略。

路过的小伙伴欢迎点赞评论!!!

你们的小红心是UP更新的动力



算法工具链
技术深度解析社区征文征程6官方教程
+2
评论0
0/1000