导言
BEVFormer是一种纯视觉的自动驾驶感知算法,通过融合环视相机图像的空间和时序特征显式的生成具有强表征能力的BEV特征,并应用于下游3D检测、分割等任务,取得了SOTA的结果。我们在EasyCV开源框架(https://github.com/alibaba/EasyCV)中,对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对比吞吐量如下:
Setting | throughput(samples/s) |
BEVFormer-tiny bs=32 | 3.55 |
EasyCV BEVFormer-tiny bs=32 | 9.84(+177%) |
BEVFormer-base bs=5 | 0.727 |
EasyCV BEVFormer-base bs=5 | 0.8(+10%) |
精度收敛优化
我们使用额外的数据增广方式和不同的损失函数来优化模型。同时加入额外的训练策略来进一