导言
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 BEVFormerPredictorblade_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的后果。
原文链接
本文为阿里云原创内容,未经容许不得转载。