6.2. 高效模型设计指导手册

6.2.1. 概述

地平线X3/J3处理器是2020年发布的面向智能机器人/高级别辅助驾驶场景的第二代低功耗、高性能智能处理器, 其BPU®(伯努利2.0架构引擎)的设计时间为2017年,因此也针对当时兴起的Group Conv、Depthwise Conv等新形式卷积做了针对性的大幅优化, 下文将具体阐述在XJ3芯片上设计高效模型的通用建议。

6.2.2. 通用建议

6.2.2.1. 建议1:使用地平线高效实现的Backbone

在XJ3处理器上,Bernoulli架构的BPU针对GroupConv,特别是DepthwiseConv做了针对性的优化,因此我们更推荐采用Depthwise+Pointwise结构的MobileNetv2、EfficientNet_lite, 以及地平线基于GroupConv手工设计自研的 VarGNet 作为模型的Backbone, 这对于模型性能的整体提升最为显著

需要注意的是,地平线的EfficientNet_lite示例模型来源于 EfficientNet_lite , 相比于EfficientNet官方实现去除了包含Sigmoid查表算子的SE结构,并将Swish激活替换为Relu(查表算子影响请参考 建议3:避免使用查表算子 )。

6.2.2.2. 建议2:选择BPU算子搭建模型

BPU硬件的执行效率远高于CPU,并且模型中CPU、BPU算子间的调度切换还会引入量化、反量化节点(CPU上的运行耗时与shape大小成正比,位于模型收尾时建议通过hb_model_modifier工具删除后合并至前后处理代码中,详细可参考 modifier工具输出内容说明 ), 因此模型设计时应尽量选择全BPU算子来获取高效的性能。 XJ3处理器的算子支持情况可参考 模型转换工具链算子支持约束列表 章节。

6.2.2.3. 建议3:避免使用查表算子

对于一些BPU原生无法支持的算子(包括Cos、Sin、Sigmoid、Softplus、Sqrt、Tanh等激活函数),地平线开发了查表算子, 对应模型转换日志里的HzLUT(Horizon Look up Table)算子类型。 查表算子本身的计算效率并没有ReLU、ReLU6这种BPU原生支持的算子高,但少量查表算子并不会过多地影响模型整体性能。 但需要注意的是,当查表算子执行时的align_shape(NxCxHxW)大小超过8192时会回退至CPU计算, 因此更建议替换至ReLU/ReLU6。

6.2.2.4. 建议4:避免单独使用BN、Add、Relu算子

浮点转换工具链在模型转换的Optimizer阶段会进行一些算子融合、算子拆分、冗余计算合并、常量折叠等图优化操作。 通常情况下,Conv+BN,Conv+BN+ReLU,Conv+Add(Elementwise)+ReLU等结构都可以进行数学等价的融合。 而脱离Conv单独使用的BN、Add、ReLU则会在算子之前插入Unit_Conv节点(内部量化逻辑,无需用户手动插入), 从而产生额外的计算量。

6.2.2.5. 建议5:遵循BPU数据对齐规则,充分利用MAC计算资源

该建议来源于BPU硬件本身限制,即如果模型设计时未遵循BPU数据对齐规则,则BPU在推理时会自动进行padding, 造成MAC计算资源的浪费。Bernoulli架构BPU的数据对齐规则包括:

维度

XJ3对齐规则

Width

8对齐

Channel

8对齐

Group Conv

每组内的Channel和Kernel num 8对齐