专栏算法工具链【J6工具链性能分析与优化-2】模型性能优化建议

【J6工具链性能分析与优化-2】模型性能优化建议

momo(社区版)2024-09-28
615
0

1.引言

为了应对低、中、高阶智驾场景,以及当前AI模型在工业界的应用趋势,地平线推出了J6系列芯片,如下:

在软硬件架构方面,征程6不仅保持了对传统CNN网络的高效支持能力,还强化了对Transformer类型网络的支持,主要表现为大幅强化了对逐点计算、数据搬运的能力。基于J6硬件平台的增强和算法移植的痛点,同时坚持‘软硬协同’的设计理念,J6工具链衍生了诸多新特性。

【J6工具链性能分析与优化-1】编译器预估perf解读与性能分析这篇文章中,我们解释了编译器预估perf中各个参数的含义以及对性能的初步分析,在这篇文章中,我们将基于J6软硬件特性,整理出J6工具链算法优化常用策略。

2.模型性能优化建议

本节将结合笔者在J6工具链参考算法的学习经验,整理常用的性能优化策略。

2.1高效backbone

HENet是针对J6平台专门设计的高效backbone,其采用了纯CNN架构,总体可分为四个stage,每个stage会进行2倍下采样。以下为总体的结构配置:

模型相关细节可以参考HENet高效模型相关介绍。

2.2算子优化建议

1.遵循硬件对齐原则

一般的tensor shape对齐到2的幂次,conv-like的算子H维度对齐到8、W维度对齐到16、C维度对齐到32,若设计尺寸不满足对齐规则时会对tensor自动进行padding,造成无效的算力浪费。

2.尽量使用BPU算子搭建模型

BPU算子本身性能远高于CPU算子,且CPU和BPU之间的异构调度还会引入量化、反量化节点,其计算因为需要遍历数据,所以耗时也与shape大小成正比。所以建议结合用户手册中的算子支持列表,选择合适的BPU算子来搭建模型。

3.减少数据搬运操作

虽然J6中大幅度强化了对数据搬运(transpose、reshape)操作的效率,但是建议在模型中还是避免频繁的数据搬运操作,同时注意reshape操作时,改动的维度越多,计算效率越低。

4.将attention层的add、sum、mean替换为conv计算

另外,笔者还建议将Linear替换为Conv1x1,从而获得性能的进一步提升。

5.GridSample性能优化

GridSample是BEV坐标变换和deformable conv高频使用的算子,若grid的size过大或H,W分布的不均匀则可能会有带宽问题(该问题在J5上常有发生,随着J6的带宽增加,对gridsample的约束限制降低)或运行到CPU上,可以采用以下方式提供此算子的运行效率:

  1. 对gridsample计算做拆分,比如Nx22223x4x2的gird,数据集中在H维度,导致硬件对齐后计算量相较于之前增加不少,所以在算法设计的时候可以将22223维度进行拆分,比如Nx22223x4x2对gridsample计算做拆分,比如Nx22223x4x2的gird,数据集中在H维度,导致硬件对齐后计算量相较于之前增加不少,所以在算法设计的时候可以将22223维度进行拆分,比如Nx22223x4x2-->Nx313x284x2;

  2. 合理选择BEV Grid尺寸,J6平台的带宽得到增强,但仍需考虑BEV Grid尺寸对模型性能的影响,并且综合衡量模型精度预期,选择合适的BEV Grid尺寸以获得模型性能和精度的平衡;

6.cumsum算子替换

公版模型的QCNetDecoder中使用了J6暂不支持的torch.cumsum算子,参考算法中将其替换为了Conv1x1,相关代码如下:

7.Gather/GatherND算子高效支持

在地平线以往的版本(OE3.0.17)中,Gather/GatherND算子底层均为CPU实现,效率较低,在地平线J6工具链即将发布的正式版本中,Gather/GatherND算子将支持BPU加速,可以极大地提升计算效率。

更多优化建议将持续更新,请关注此帖

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