地平线高效 backbone: HENet - V1.0

一、背景 & 目标

为了提供针对征程 6 系列芯片专门设计的高效 backbone,我们充分利用了征程 6 芯片的硬件特性,设计了高效模型 HENet (HybridEfficient Network)。

二、性能&精度数据

三、HENet_TinyM

3.1 总体结构

HENet_TinyM (Hybrid Efficient Network, Tiny for 征程 6M) 采用了纯 CNN 架构,总体分为四个 stage,每个 stage 会进行一次 2 倍下采样。以下是总体的结构配置:

markdown 复制代码
# ---------------------- TinyM ----------------------
depth = [4, 3, 8, 6]
block_cls = ["GroupDWCB", "GroupDWCB", "AltDWCB", "DWCB"]
width = [64, 128, 192, 384]
attention_block_num = [0, 0, 0, 0]
mlp_ratios, mlp_ratio_attn = [2, 2, 2, 3], 2
act_layer = ["nn.GELU", "nn.GELU", "nn.GELU", "nn.GELU"]
use_layer_scale = [True, True, True, True]
final_expand_channel, feature_mix_channel = 0, 1024
down_cls = ["S2DDown", "S2DDown", "S2DDown", "None"]

参数含义:

depth:每个 stage 包含的 block 数量

block_cls:每个 stage 使用的基础 block 类型

width:每个 stage 中 block 的输出 channel 数

attention_block_num:每个 stage 中的 attention_block 数量,将用在 stage 的尾部(TinyM 中没有用到)

act_layer:每个 stage 使用的激活函数

use_layer_scale:是否对 residual 分支进行可学习的缩放

final_expand_channel:在网络尾部的 pooling 之前进行 channel 扩增的数量,0 代表不使用扩增

feature_mix_channel :在分类 head 之前进行 channel 扩增的数量

down_cls:每个 stage 对应的下采样类型

3.2 基础 block 结构

3.2.1 DWCB

DWCB (DWConvBlock) 是 HENet 中主要使用的一个基础 block,它在主分支上使用一个 depthwise 卷积进行空间维度的信息融合(k=3x3),然后使用两个连续的 pointwise 卷积进行 channel 维度的信息融合,这种结构一定程度上借鉴了 transformer 中的 attention + mlp 的架构,同时将 latency 控制在一个较轻量级的程度。在 residual 分支上,DWCB 使用了一层可学习的 layer_scale,然后将两个分支的输出做 elementwise_add 然后输出。

3.2.2 GroupDWCB

GroupDWCB 是基于 DWCB 的一个轻量化改进, 相比 DWCB,GroupDWCB 将主分支的第一个 pointwise 卷积改为了 pointwise group 卷积,以此来达到提速的目的。我们在实验中观察到,当满足 ① channel 数量不太小 ② 较浅的位层 两个条件时,GroupDWCB 可以达到精度无损,同时提速的效果,推测可能是 low_level feature 的性质决定的。在 TinyM 中,我们在第二个 stage 使用 GroupDWCB 来构建(g=2)。

3.2.3 AltDWCB

AltDWCB 是基于 DWCB 的一个变种,相比 DWCB,AltDWCB 将主分支的 depthwise 卷积的 kernel 改为了(1,5)或者(5,1),根据 block 所在层次位置交替使用。在我们的实验中,使用 AltDWCB 构建第三个 stage 将带来一定的定能提升。我们推荐在层数较多的 stage 尝试交替使用 AltDWCB。

3.2.4 S2DDown

S2DDown (Space2Depth Downsample) 使用一个 space to depth 操作进行降采样,以 stride = 2 为例,降采样后,feature 的空间维度将变为原来的 1/2,channel 维度将变为原来的 4 倍。对应的代码实现为:

markdown 复制代码
N, C, H, W = x.size()  # self.bs = 2
x = x.view(N, C, H // self.bs, self.bs, W // self.bs, self.bs)  # (N, C, H//bs, bs, W//bs, bs)
x = x.permute(0, 3, 5, 1, 2, 4).reshape(N, C * (self.bs ** 2), H // self.bs, W // self.bs)  # (N, C*bs^2, H//bs, W//bs)

地平线征程 6 系列芯片对于 tensor layout 相关操作的高效支持,这一降采样操作得以以较快的速度完成。

四、HENet_TinyE

HENet_TinyE 结构与 TinyM 类似,以下是总体的结构配置:

markdown 复制代码
# ---------------------- TinyE ----------------------
depth = [3, 3, 8, 6]
block_cls = ["DWCB", "GroupDWCB", "AltDWCB", "DWCB"]
width = [48, 96, 192, 384]
attention_block_num = [0, 0, 0, 0]
mlp_ratios, mlp_ratio_attn = [2, 2, 2, 3], 2
act_layer = ["nn.GELU", "nn.GELU", "nn.GELU", "nn.GELU"]
use_layer_scale = [True, True, True, True]
final_expand_channel, feature_mix_channel = 0, 1024
down_cls = ["S2DDown", "S2DDown", "S2DDown", "None"]

五、使用建议

5.1 总体结构使用建议

  1. 针对输入输出相近的场景,或者作为主 backbone 使用的场景,我们推荐直接使用 TinyM / TinyE 原生结构。针对其他场景,我们建议参考 TinyM 的基础 block 结构,灵活构建模型。
  2. 对于感知模型中的多 camera backbone,我们推荐针对不同类型的 camera 使用不同量级的 backbone,比如对于 front/rear camera,推荐使用较强的结构,对于 side camera,推荐使用较轻量的结构

5.2 基础 block 使用建议

  1. 如需快速构建 baseline,建议先全局使用 DWCB,然后尝试 GroupDWCB、AltDWCB 等结构提升速度精度
  2. 建议在满足 ① channel 数量不太小 ② 较浅的位层 两个条件的 stage 尝试使用 GroupDWCB(例如 stage 2)
  3. 建议在层数较多的 stage 尝试交替使用 AltDWCB
  4. 建议在 backbone 最开始的降采样中谨慎使用 S2DDown,优先尝试带有 overlap 的降采样方法(例如 k=2,s=3 的 conv)
相关推荐
wyiyiyi27 分钟前
【笔记分享】集合的基数、群、环、域
人工智能·笔记·算法·数学建模·学习方法·抽象代数
秋说1 小时前
【PTA数据结构 | C语言版】后缀表达式求值
c语言·数据结构·算法
Eloudy1 小时前
cuDNN 的 IMPLICIT_GEMM 算法
算法·gpu·gemm
盛寒1 小时前
等价矩阵和等价向量组
线性代数·算法·矩阵
mit6.8241 小时前
youtube图论
c++·算法
DoraBigHead2 小时前
🧠 小哆啦解题记 —— 谁偷走了我的快乐?
算法
想躺平的咸鱼干2 小时前
JVM的垃圾回收算法和多种GC算法
java·jvm·算法·垃圾回收算法·jvm体系结构
满分观察网友z2 小时前
从 Null 到 Next:我如何用 O(1) 空间“点亮”了 UI 树的导航路径(117. 填充每个节点的下一个右侧节点指针 II)
后端·算法
Murphy_lx2 小时前
较为深入的了解c++中的string类(2)
java·c++·算法