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

在软硬件架构方面,征程6不仅保持了对传统CNN网络的高效支持能力,还强化了对Transformer类型网络的支持,主要表现为大幅强化了对逐点计算、数据搬运的能力。基于J6硬件平台的增强和算法移植的痛点,同时坚持‘软硬协同’的设计理念,J6工具链衍生了诸多新特性。
2.模型性能优化建议
本节将结合笔者在J6工具链参考算法的学习经验,整理常用的性能优化策略。
2.1高效backbone
HENet是针对J6平台专门设计的高效backbone,其采用了纯CNN架构,总体可分为四个stage,每个stage会进行2倍下采样。以下为总体的结构配置:
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上,可以采用以下方式提供此算子的运行效率:
对gridsample计算做拆分,比如Nx22223x4x2的gird,数据集中在H维度,导致硬件对齐后计算量相较于之前增加不少,所以在算法设计的时候可以将22223维度进行拆分,比如Nx22223x4x2对gridsample计算做拆分,比如Nx22223x4x2的gird,数据集中在H维度,导致硬件对齐后计算量相较于之前增加不少,所以在算法设计的时候可以将22223维度进行拆分,比如Nx22223x4x2-->Nx313x284x2;
合理选择BEV Grid尺寸,J6平台的带宽得到增强,但仍需考虑BEV Grid尺寸对模型性能的影响,并且综合衡量模型精度预期,选择合适的BEV Grid尺寸以获得模型性能和精度的平衡;
6.cumsum算子替换
7.Gather/GatherND算子高效支持
在地平线以往的版本(OE3.0.17)中,Gather/GatherND算子底层均为CPU实现,效率较低,在地平线J6工具链即将发布的正式版本中,Gather/GatherND算子将支持BPU加速,可以极大地提升计算效率。


