地平线高效 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)
相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法