BEVFormer-accelerate:基于 EasyCV 加速 BEVFormer

本文介绍了如何在EasyCV框架中优化BEVFormer算法,包括训练速度和精度收敛的提升。通过使用PAI-Blade,实现了在A100配置下40%的推理速度提升。此外,还分享了在阿里云机器学习平台PAI上的BEVFormer模型使用和推理加速的方法。
摘要由CSDN通过智能技术生成

导言

BEVFormer是一种纯视觉的自动驾驶感知算法,通过融合环视相机图像的空间和时序特征显式的生成具有强表征能力的BEV特征,并应用于下游3D检测、分割等任务,取得了SOTA的结果。我们在EasyCV开源框架(https://github.com/alibaba/EasyCV)中,对BEVFomer算法进行集成,并从训练速度、算法收敛速度角度对代码进行了一些优化。同时,我们进一步使用推理优化工具PAI-Blade对模型进行优化,相比于原始模型在A100配置下能取得40%的推理速度提升。本文将从以下几个部分进行介绍:1、BEVFormer算法思想 2、训练速度和算法收敛速度优化 3、使用PAI-Blade优化推理速度。

BEVFormer算法思想

如上图所示,BEVFormer由如下三个部分组成:

  1. backbone:用于从6个角度的环视图像中提取多尺度的multi-camera feature
  2. BEV encoder:该模块主要包括Temporal self-Attention 和 Spatial Cross-Attention两个部分。
    1. Spatial Cross-Attention结合多个相机的内外参信息对对应位置的multi-camera feature进行query,从而在统一的BEV视角下将multi-camera feature进行融合。
    2. Temporal self-Attention将History BEV feature和 current BEV feature通过 self-attention module进行融合。
    3. 通过上述两个模块,输出同时包含多视角和时序信息的BEV feature进一步用于下游3D检测和分割任务
  3. 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%)

精度收敛优化

我们使用额外的数据增广方式和不同的损失函数来优化模型。同时加入额外的训练策略来进一步提升模型

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误信息是PowerShell给出的错误提示,表明系统无法识别“accelerate”这个命令或者功能。根据这个错误提示,我们可以猜测可能是以下几种原因导致: 1. 该命令或功能不存在:在PowerShell中输入命令时,需要确保命令或功能已经安装或者已经在系统中注册。如果该命令或功能不存在,系统就会提示无法识别。 2. 命令或功能未正确输入:在使用PowerShell输入命令时,需要确保命令或功能的拼写准确无误。如果输入错误,系统也会提示无法识别该命令或功能。 3. 命令或功能所在位置未加入系统环境变量中:在使用PowerShell输入命令时,需要确保该命令所在的位置已经加入系统环境变量中。如果未加入环境变量,系统就会提示无法识别。 针对以上情况,我们可以进行以下解决办法: 1. 确认该命令或功能是否已经正确安装或者注册。 2. 确认命令或功能的拼写是否正确。 3. 对于第三种情况,可以通过添加系统环境变量的方式,将该命令所在的位置加入环境变量中,具体方法可参考系统设置操作说明。 需要注意的是,在使用PowerShell时,要时刻注意输入的命令或者功能的拼写准确无误,这样才能避免类似无法识别的问题。 ### 回答2: “accelerate : 无法将‘accelerate’项识别为 cmdlet、函数、脚本文件或可运行程序” 这个错误提示通常出现在Windows系统中使用PowerShell(一种命令行解释器)时。它意味着你使用了一个无法被识别的命令。 这个错误通常的解决办法是检查您输入的命令是否拼写正确或正确执行。很可能是命令输入错误。如果您确认命令正确,就需要检查您的系统是否拥有相应的软件。如果你想使用某个程序或脚本,需要先安装相应的软件或者模块才能正常加载。 在这个具体的问题中,你需要检查你输入的命令是否正确拼写, 看看是否应该使用全名(accelerate.exe)来运行程序(而不是使用缩写加.exe的方式),或者是否存在前缀路径。 另外,还要确保你已经安装了程序或软件包,或者相应软件包已加入到系统环境变量中。这也是出现这种错误的常见原因之一。 最后,如果你还是找不到问题所在,可以尝试在网上搜索相关的解决方法,或者询问相应的IT专业人员来得到更好的解决方案。 ### 回答3: 这个错误提示是Windows PowerShell(一种任务自动化和配置管理框架)给出的,意思是它无法识别“accelerate”作为一条命令。 通常,当我们在PowerShell命令行界面中输入命令时,它会查找已注册的命令或函数,然后执行我们的命令。但是,如果出现类似于“无法识别”、“不可识别”的错误提示时,这可能有以下几个原因: 1. 拼写错误。我们输入的命令可能存在拼写错误,因此无法识别。此时,我们需要仔细检查命令的拼写并进行修正。 2. 命令未安装或未导入。如果我们尝试运行未安装或未导入的模块、脚本或其他程序,PowerShell也无法识别我们的命令。这时,我们需要确保已正确安装和导入需要使用的程序。 3. 命令不存在。如果我们输入的命令并不存在于PowerShell或其他应用程序中,则会出现此类错误。这时,我们需要重新检查我们的命令是否正确,并查找合适的命令。 综上所述,无法将“accelerate”项识别为cmdlet、函数、脚本文件或可运行程序的错误提示表明我们输入的命令无法被识别,并存在上述的几种可能原因。为了消除此类错误提示,我们需要认真检查命令拼写是否正确,并确定我们已正确安装和导入了所需的程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值