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

6.1.1. 概述

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

6.1.2. 通用建议

6.1.2.1. 建议 1:使用地瓜机器人高效实现的 Backbone

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

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

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

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

6.1.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.1.2.4. 建议 4:避免单独使用 BN、Add、Relu 算子

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

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

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