该示例为参考算法,仅作为在J6上模型部署的设计参考,非量产算法
简介
图像分类是视觉感知的基础任务,也是许多检测、分割等下游任务的 backbone 来源。在车端部署时,分类/特征提取网络既要有足够的精度,又要兼顾 BPU 的算力利用与访存带宽约束,因此通常需要针对芯片计算特性做软硬件协同设计。
MixVarGENet 是地平线自研的面向分类任务的高效 backbone,高度秉承"软硬结合"的设计理念,针对征程6芯片的大算力特性做了定制化设计。本参考算法在 ImageNet 上训练验证,其定制化设计见下文「地平线部署说明」。
性能精度指标
模型 | 数据集 | 输入大小 | 浮点精度(Accuracy) | 定点精度(Accuracy) | J6M-Latency | J6M-FPS |
|---|---|---|---|---|---|---|
MixVarGENet | ImageNet | 1x3x224x224 | 0.717 | 0.714 | 0.36ms | 5464 |
公版模型介绍
MixVarGENet高度秉承了"软硬结合"的设计理念,针对征程6芯片的大算力特性做了一些定制化设计,是一个面向分类任务的参考模型。其设计思路可以总结为:
小channel时使用normal conv,发挥芯片大算力优势;
大channel时引入group conv,缓解带宽压力;
Block内部扩大channel,提升网络算法性能;
缩短feature复用时间间隔,减少SRAM到DDR访存。
模型设计
MixVarGEBlock

并且,head_op 和stack_op都是由BasicMixVarGEBlock(如mixvarge_f2,mixvarge_f4,mixvarge_f2_gb16)这样的基本单元构成。
MixVarGENet模型的主要构成可以用BasicMixVarGEBlock表示:
stage0 | stage 1 | stage2 | stage3 | stage4 | |
head_op | mixvarge_f2 | mixvarge_f4 | mixvarge_f4 | mixvarge_f2_gb16 | mixvarge_f2_gb16 |
stack_op | None | 2x(mixvarge_f4) | 2x(mixvarge_f4) | 6x(mixvarge_f2_gb16) | 2x(mixvarge_f2_gb16) |
注:这里需要指出stage0是不含有stack_op的特殊MixVarGEBlock。
head op和stack op
head op 和stack op 是MixVarGENet中基本的计算单元,共享相同的结构空间,它们都是由BasicMixVarGEBlock组成。
BasicMixVarGEBlock
BasicMixVarGEBlock是构成head_op和stack_op的基本单元,基于J6芯片计算特性对其结构进行了定制化设计。BasicMixVarGEBlock结构示意图如下所示:

BasicMixVarGEBlock的基本结构由两个conv及一个shortcut组成,它在小通道数时使用normal conv,大通道数时使用group conv,还在block内部通过factor扩大通道数来提高模型性能。下面是BasicMixVarGEBlock中的两个conv层的定义代码:
BasicMixVarGEBlock的内部的两个conv层参数mid_channle、conv1_kernel_size、conv1_groups、conv2_kernel_size、conv2_groups都是由类似于"mixvarge_f2"的BasicMixVarGEBlock中的键值对定义的,可以通过配置不同的BasicMixVarGEBlock来组成head op和stack op。
BLOCK_CONFIG
BasicMixVarGEBlock | Block Config |
mixvarge_f2 | {"conv2_kernel_size": 1, "padding": 0, "factor": 2} |
mixvarge_f4 | {"conv2_kernel_size": 1, "padding": 0, "factor": 4} |
mixvarge_f2_gb16 | { "conv2_kernel_size": 1, "padding": 0, "factor": 2, "conv1_group_base": 16, } |
上表中的参数含义是:
- **"conv2_kernel_size"和"padding"**定义了ConvModule2d卷积核的大小和padding的方式;
**"factor"**是Block内部扩大channel的因子,它的取值根据featuremap大小来确定,通常为2的倍数,如果factor=2,那么中间卷积层mid_channle的大小就是in_channels * 2;
**"conv1_group_base"**定义了ConvModule2d组卷积运算参数,它的取值根据芯片的计算模式,通常为8的倍数,这样就不会引入额外的padding;
downsample layers
downsample layers是kernel=3,stride=2的卷积,将当前stage的featuremap下采样,以便后续的stage 的fusion layer使用。如下为downsample layers中卷积层的代码:
fusion layer
fusion layers是pointwise卷积,用于将前几个stage的featuremap映射到当前stage,比如Stride 16的head_op 的fusion_strides包含了Stride 4和Stride 8的下采样结果。fusion layers的示意图如下所示:

量化说明
量化配置要点:
- 全局默认 qint8(ModuleNameTemplate({"": qint8})),Conv 输入/权重均为 qint8,matmul 输入为 [qint8, qint8];
模型量化友好性较好,仅做 Calibration 即可满足量化精度,无需 QAT 训练;如私有数据集上出现量化掉点,可配合精度 debug、敏感度分析工具定位,对敏感算子补充 int16/固定 scale 配置。
configs/mixvargenet_imagenet/qconfig.py
总结与建议
部署建议
- 小通道场景使用 normal conv(mixvarge_f2/mixvarge_f4)发挥算力,大通道场景使用 group conv(mixvarge_f2_gb16,conv1_group_base=16)缓解带宽压力,conv1_group_base 取值通常为 8 的倍数以避免额外 padding。
- Block 内部通过 factor 扩大通道数(mid_channle = in_channels * factor)提升算法性能,factor 取值根据 featuremap 大小确定、通常为 2 的倍数;增大 factor 提升精度但增加计算量,需在精度与性能间平衡。
fusion layer 通过 pointwise 卷积将前几个 stage 的 featuremap 映射到当前 stage,缩短 feature 复用时间间隔、减少 SRAM 到 DDR 访存;fusion_strides 配置需结合实际 stage 结构选取。
- 量化采用全局 qint8,结构对量化友好,通常仅 Calibration 即可满足精度;如出现量化掉点,可对敏感算子补充 int16/固定 scale 配置,并配合精度 debug、敏感度分析工具定位。
附录
参考算法官网(modellabs):https://(待发布)
