共计 4723 个字符,预计需要花费 12 分钟才能阅读完成。
导言
BEVFormer 是一种纯视觉的主动驾驶感知算法,通过交融环视相机图像的空间和时序特色显式的生成具备强表征能力的 BEV 特色,并利用于上游 3D 检测、宰割等工作,获得了 SOTA 的后果。咱们在 EasyCV 开源框架(https://github.com/alibaba/Ea…)中,对 BEVFomer 算法进行集成,并从训练速度、算法收敛速度角度对代码进行了一些优化。同时,咱们进一步应用推理优化工具 PAI-Blade 对模型进行优化,相比于原始模型在 A100 配置下能获得 40% 的推理速度晋升。本文将从以下几个局部进行介绍:1、BEVFormer 算法思维 2、训练速度和算法收敛速度优化 3、应用 PAI-Blade 优化推理速度。
BEVFormer 算法思维
如上图所示,BEVFormer 由如下三个局部组成:
- backbone:用于从 6 个角度的环视图像中提取多尺度的 multi-camera feature
- BEV encoder:该模块次要包含 Temporal self-Attention 和 Spatial Cross-Attention 两个局部。
- Spatial Cross-Attention 联合多个相机的内外参信息对对应地位的 multi-camera feature 进行 query,从而在对立的 BEV 视角下将 multi-camera feature 进行交融。
- Temporal self-Attention 将 History BEV feature 和 current BEV feature
- 通过 self-attention module 进行交融。通过上述两个模块,输入同时蕴含多视角和时序信息的 BEV feature 进一步用于上游 3D 检测和宰割工作
- Det&Seg Head:用于特定工作的 task head
BEVFormer 训练优化
训练减速优化
咱们从数据读取和缩小内存拷贝耗费等角度对训练代码进行优化。
- 数据读取
- 应用更高效的图片解码库 turbojpeg
- BEVFormer 在训练过程中,须要时序上的数据作为输出,将串形的读取形式优化为并行读取。
- 先做 resize 再做其余预处理,缩小了额定像素带来的计算开销
- 内存拷贝优化
- 应用 pin_memery=True,并修复了 mmcv DataContainer pin_memory 的 bug
- 将代码中的 numpy 操作替换为 torch.tensor,防止不必要的 h2d 拷贝
- other
- 应用 torch.backends.cudnn.benchmark=True(ps:须要保障在输出数据没有动态性的状况下应用,否则反而会减少训练耗时)
- 修复了 torch.cuda.amp 混合精度在 LayerNorm 层生效的 bug
咱们在 A100 80G 的机器上,应用 fp16 比照吞吐量如下:
精度收敛优化
咱们应用额定的数据增广形式和不同的损失函数来优化模型。同时退出额定的训练策略来进一步晋升模型收敛速度及精度。
- 数据增广形式
- rand scale(采纳不同分辨率的输出进行训练,试验中发现该操作会引入至多 20% 的额定训练工夫,因而在下述试验中,均没有采纳)
- rand_flip(以 50% 的概率随机翻转图片)
- 损失函数
- 应用 smooth l1 loss 或 balance l1 loss 代替 l1 loss。(在 mini dataset 的试验中,这两个损失都能够晋升精度,上面的试验中采纳 balance l1 loss)
训练策略
1. 应用 one2many Branch
这个做法来自于 H -Deformable-DETR,在 DETR 系列的检测模型中采纳 one2one 的匹配形式来调配 GT Boxes,这种做法尽管让模型在测试的时候,可能防止冗余的 NMS 后处理操作,然而只有多数的 Query 会被调配给正样本,导致训练时模型收敛速度相比于 one2many 的形式会慢很多。因而,在训练过程中退出 auxiliary Query,同一个 GT Box 会匹配多个 auxiliary Query,并应用 attention mask 将 one2one branch 和 one2many branch 的信息隔离开。通过这样的形式,可能显著的晋升训练过程中的收敛速度,同时在测试过程中只须要放弃 one2one branch 进行预测。(在试验中,应用额定退出 1800 个 auxiliary Query,每个 GT box 匹配 4 个 query 进行训练)
- CBGS in one2many Branch
咱们的试验是在 NuScenes 数据集上进行的,在该数据集的 3D 检测工作上有 10 类标签,然而这 10 类标签之间的样本极度不平衡,很多算法会采纳 CBGS 操作进行类间样本平衡,然而这个操作会将整个数据集扩充 4.5 倍,尽管有肯定的精度晋升,然而也带来了微小的训练老本。咱们思考在 one2many Branch 上进行样本平衡操作,即对于实例数量较多的样本应用较少的 auxiliary Query 进行匹配,而对于长尾的样本应用较多的 auxiliary Query 进行匹配。通过 CBGS in one2many Branch 的形式,训练工夫和 base 保持一致的根底上会进一步晋升收敛速度,最终的精度也有肯定的晋升。(试验中匹配框数量变动:[4, 4, 4, 4, 4, 4, 4, 4, 4, 4] -> [2, 3, 7, 7, 9, 6, 7, 6, 2, 5])
咱们在单机 8 卡 A100 80G 下进行试验,如下表所示:
模型收敛速度如下图所示:
由上图能够看出,应用上述优化形式能够大幅晋升模型收敛速度,仅须要 75% 的训练工夫就能够达到 base 的最终精度。同时最终的 NDS 相比于 base 也有 0.8 的晋升。
具体配置,训练 log 和模型权重,参考:https://github.com/alibaba/EasyCV/blob/master/docs/source/model_zoo_det3d.md
在阿里云机器学习平台 PAI 上应用 BEVFormer 模型
PAI-DSW(Data Science Workshop)是阿里云机器学习平台 PAI 开发的云上 IDE,面向各类开发者,提供了交互式的编程环境。在 DSW Gallery 中 (链接),提供了各种 Notebook 示例,不便用户轻松上手 DSW,搭建各种机器学习利用。咱们也在 DSW Gallery 中上架了 BEVFormer 进行 3D 检测的 Sample Notebook(见下图),欢送大家体验!
应用 PAI-Blade 进行推理减速
PAI-Blade 是由阿里云机器学习平台 PAI 开发的模型优化工具,能够针对不同的设施不同模型进行推理减速优化。PAI-Blade 遵循易用性,鲁棒性和高性能为准则,将模型的部署优化进行高度封装,设计了对立简略的 API,在实现 Blade 环境装置后,用户能够在不理解 ONNX、TensorRT、编译优化等技术细节的条件下,通过简略的代码调用不便的实现对模型的高性能部署。更多 PAI-Blade 相干技术介绍能够参考 [PAI-Blade 介绍]。
PAI-EasyCV 中对 Blade 进行了反对,用户能够通过 PAI-EasyCV 的训练 config 中配置相干 export 参数,从而对训练失去的模型进行导出。
对于 BEVFormer 模型,咱们在 A100 机器下进行进行推理速度比照,应用 PAI-Blade 优化后的模型能获得 42% 的优化减速。
环境筹备
咱们提供一个 PAI-Blade + PAI-EasyCV 的镜像包供用户能够间接应用,镜像包地址:easycv-blade-torch181-cuda111.tar
用户也能够基于 Blade 每日公布的镜像自行搭建推理环境 [PAI-Blade 社区镜像公布]。
自行搭建环境时须要留神:BEVFomer-base 应用 resnet101-dcn 作为 image backbone,DCN 算子应用的是 mmcv 中的自定义算子,为了导出 TorchScript,咱们对该接口进行了批改。所以 mmcv 须要源码编译。
1.clone mmcv 源码
$ git clone https://github.com/open-mmlab/mmcv.git
2. 替换 mmcv 文件
替换时请留神 mmcv 的版本,留神接口要匹配。mmcv1.6.0 版本已验证。
参考 easycv/thirdparty/mmcv/ 目录下的批改文件。用 mmcv/ops/csrc/pytorch/modulated_deform_conv.cpp 和 mmcv/ops/modulated_deform_conv.py 去替换 mmcv 中的原文件。
3. 源码编译
mmcv 源码编译请参考:https://mmcv.readthedocs.io/en/latest/get_started/build.html
导出 Blade 模型
导出 Blade 的模型的配置能够参考文件 bevformer_base_r101_dcn_nuscenes.py 中的 export 字段,配置如下:
export = dict(
type='blade',
blade_config=dict(
enable_fp16=True,
fp16_fallback_op_ratio=0.0,
customize_op_black_list=[
'aten::select', 'aten::index', 'aten::slice', 'aten::view',
'aten::upsample', 'aten::clamp'
]
)
)
导出命令:
$ cd ${EASYCV_ROOT}
$ export PYTHONPATH='./'
$ python tools/export.py configs/detection3d/bevformer/bevformer_base_r101_dcn_nuscenes.py bevformer_base.pth bevformer_export.pth
Blade 模型推理
推理脚本:
from easycv.predictors import BEVFormerPredictor
blade_model_path = 'bevformer_export.pth.blade'
config_file = 'configs/detection3d/bevformer/bevformer_base_r101_dcn_nuscenes.py'
predictor = BEVFormerPredictor(
model_path=blade_model_path,
config_file=config_file,
model_type='blade',
)
inputs_file = 'nuscenes_infos_temporal_val.pkl' # 以 NuScenes val 数据集文件为例
input_samples = mmcv.load(inputs_file)['infos']
predict_results = predictor(input_samples)
print(predict_results)
NuScenes 数据集筹备请参考:NuScenes 数据集筹备
瞻望
咱们在 EasyCV 框架中,集成了 BEVFormer 算法,并从训练减速、精度收敛和推理减速角度对算法进行了一些改良。近期,也涌现了许多新的 BEV 感知算法,如 BEVFormerv2。在 BEVFormerv2 中通过 Perspective Supervision 的形式,让算法可能不受限于应用一些在深度预计或 3D 检测上的预训练 backbone,而间接应用近期更无效的大模型 BackBone(如 ConvNext、DCNv3 等),同时采纳 two-stage 的检测形式进一步加强模型能力,在 Nuscenes 数据集的 camera-based 3D 检测工作获得 sota 的后果。
原文链接
本文为阿里云原创内容,未经容许不得转载。