BEVFormer-accelerate:基于EasyCV加速BEVFormer

news2025/1/18 8:13:20

作者:贺弘 夕陌 谦言 临在

导言

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

BEVFormer算法思想

image.png
如上图所示,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对比吞吐量如下:

Settingthroughput(samples/s)
BEVFormer-tiny bs=323.55
EasyCV BEVFormer-tiny bs=329.84( +177% )
BEVFormer-base bs=50.727
EasyCV BEVFormer-base bs=50.8( +10% )

精度收敛优化

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

  • 数据增广方式

    • rand scale(采用不同分辨率的输入进行训练,实验中发现该操作会引入至少20%的额外训练时间,因此在下述实验中,均没有采用)
    • rand_flip(以50%的概率随机翻转图片)
  • 损失函数

    • 使用smooth l1 loss或 balance l1 loss代替l1 loss。(在mini dataset的实验中,这两个损失都可以提升精度,下面的实验中采用balance l1 loss)
  • 训练策略

    • 使用one2many Branch

image.png

这个做法来自于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下进行实验,如下表所示:

config settingNDSmAPthroughput(samples/s)
官方 BEVFormer-base52.4441.913.289
EasyCV BEVFormer-base52.6642.133.45
EasyCV BEVFormer-base-one2manybranch53.02(+0.58)42.48(+0.57)3.40
EasyCV BEVFormer-base-cbgs_one2manybranch53.28(+0.84)42.63(+0.72)3.41

模型收敛速度如下图所示:

image.png

由上图可以看出,使用上述优化方式可以大幅提升模型收敛速度,仅需要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(见下图),欢迎大家体验!

image.png

使用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% 的优化加速。

NameBackendMedian(FPS)Mean(FPS)Median(ms)Mean(ms)
easycvTensorRT3.686973.686510.2712260.271259
easycv scriptTensorRT3.81313.798590.2622540.26337
bladeTensorRT5.402485.23383**(+42%)**0.18510.192212

环境准备

我们提供一个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
  1. 替换mmcv文件

替换时请注意mmcv的版本,注意接口要匹配。mmcv1.6.0版本已验证。

参考easycv/thirdparty/mmcv/目录下的修改文件。用mmcv/ops/csrc/pytorch/modulated_deform_conv.cpp和mmcv/ops/modulated_deform_conv.py去替换mmcv中的原文件。

  1. 源码编译

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的结果。

EasyCV(https://github.com/alibaba/EasyCV)会持续跟进业界sota方法,欢迎大家关注和使用,欢迎大家各种维度的反馈和改进建议以及技术讨论,同时我们十分欢迎和期待对开源社区建设感兴趣的同行一起参与共建。

EasyCV往期分享

EasyCV开源地址:https://github.com/alibaba/EasyCV

使用 EasyCV Mask2Former轻松实现图像分割 https://zhuanlan.zhihu.com/p/585259059

EasyCV DataHub 提供多领域视觉数据集下载,助力模型生产 https://zhuanlan.zhihu.com/p/572593950

EasyCV带你复现更好更快的自监督算法-FastConvMAE https://zhuanlan.zhihu.com/p/566988235

基于EasyCV复现DETR和DAB-DETR,Object Query的正确打开方式 https://zhuanlan.zhihu.com/p/543129581

基于EasyCV复现ViTDet:单层特征超越FPN https://zhuanlan.zhihu.com/p/528733299

MAE自监督算法介绍和基于EasyCV的复现 https://zhuanlan.zhihu.com/p/515859470

EasyCV开源|开箱即用的视觉自监督+Transformer算法库 https://zhuanlan.zhihu.com/p/50521999

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL自学之路】第3天——MySQL数据库服务的基本操作

目录 前言 数据库的初始化 添加环境变量 数据库配置文件的编写【my.ini】 初始化MySQL服务 MySQL服务操作 安装一个MySQL服务 删除一个MySQL服务 开启你的MySQL服务 关闭你的MySQL服务 查看电脑中存在的MySQL服务 其他操作 登录数据库 修改密码 登录跳过密码验证…

Hi3861开发遇到的小问题及解决方法和一些小技巧

开发过程中的学习 一、硬件支持开启(替换文件) 😄 在D:\ubuntu2004Harmony镜像中通过vscode 使用编译命令 python build.py wifiiot是存在一个小问题 No option ‘riscv32-unknown-elf-gcc_path’ in section: ndk’ ” 而在E:\鸿蒙资料\鸿蒙…

[附源码]Python计算机毕业设计儿童绘本租赁网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

基于jsp+mysql+ssm工程车辆租赁系统-计算机毕业设计

项目介绍 随着现代工程车租赁的快速发展,可以说工程车租赁已经逐渐成为现代工程车租赁过程中最为重要的部分之一。但是一直以来我国传统的工程车租赁并没有建立一套完善的行之有效的工程车租赁系统,传统的工程车租赁已经无法适应高速发展,无…

Idea制作docker镜像

一、配置docker远程访问 1.在linux系统中查找docker.service文件,使用命令:find / -name docker.service 2.编辑 /usr/lib/systemd/system/docker.service文件,在ExecStart/usr/bin/dockerd后面添加 -H tcp://0.0.0.0:2375 3.重新加载dock…

持续盈利背后,水滴“新增长”难寻?

配图来自Canva可画 近年来随着互联网红利消失,越来越多的互联网企业回归效益,开始将“降本增效”纳入了议事日程之中,这不仅体现在BAT等一众大厂的财报中,就连水滴等互联网领域的“后起之秀”也在争相效法。 作为过去几年有名的…

最受欢迎的工具-从burp到支付和暴破

文章目录一、封神台七1、认识burp2、功能3、burp字体设置4、尝试抓包/改包(支付)5、尝试抓包改包(暴力破解)一、封神台七 1、认识burp 浏览器和相关应用程序的中间拦截、修改、重放数据包的代理工具 2、功能 1、拦截本机8080端…

[译]Ceph性能优化之CPU核数对性能的影响 - Part 1

原文链接 知乎专栏: [译]Ceph性能优化之CPU核数对性能的影响 - Part 1 - 知乎 简介 Ceph在很多方面都做得很好,但从来没有人意识到它有极低的资源消耗。Ceph需要做一些工作来确保数据的一致性,以及如何将数据(PG)放到合适的位置。我们正在努力优化Cep…

制作一个简单HTML传统端午节日网页(HTML+CSS)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

tensorflow学习笔记一

1、tensorflow中的数据类型 import tensorflow as tf import numpy as np# 张量可以是数字、列表、ndarray# 使用列表创建张量 print(tf.constant([2,3])) print(tf.constant([[2,3],[1,4]]))# tensorflow2 默认使用Eager动态图机制 print(type(tf.constant([[2,3],[1,4]])))# …

springcloud(gateway限流)

目录 1. 限流的使用场景2. gateway限流实现 2.1 前提:2.2 导入依赖包2.3 在项目配置文件中配置redis2.4 开发限流需要的Bean2.5 为服务配置限流参数2.6 压力测试3. 熔断 3.1 熔断的使用场景3.2 熔断配置 1. 限流的使用场景 为什么限流 限流就是限制流量&#xff0c…

SQL学习

一、SQL怎么运行的:1、执行顺序2、MySQL 基本架构概览3、Server 层基本组件介绍4、语句分析二、索引(index)1、索引的使用成本2、语法3、删除索引三、分析函数1、聚合分析函数2、排名分析函数3、数学分析函数4、行比较分析函数四、PLSQL五、c…

SpringCloud - 整合Nacos启动报错Consider defining a bean of type IClientConfig

SpringCloud - 整合Nacos启动报错Consider defining a bean of type IClientConfig前言一. 尝试解决Bug的几种不合适方案1.1 添加ribbon依赖1.2 按照提示增加IClientConfig配置1.3 正确答案前言 我写了一套网关服务,一模一样的代码在自己电脑和公司电脑都写了一份。…

(附源码)Springboot网络空间安全实验教学示范中心网站 毕业设计 111454

Springboot网络空间安全实验教学示范中心网站 摘 要 本课题研究的网络空间安全实验教学示范中心网站,主要功能模块包括:实验课程管理、实验报告结果管理、实验课程信息、实验课程报告、联系老师、回复学生等,采取面对对象的开发模式进行软件的…

[附源码]Python计算机毕业设计儿童闲置物品交易网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

SpringBoot:模块探究之spring-boot-actuator

spring-boot-actuator 模块 是 spring-boot 用来查询或监控项目中各种组件、维度的度量指标(如:环境变量信息、日志级别、SpringBean 信息、组件(Redis、Mq、DB)健康状态)时使所用的模块。 此外 spring-boot-actuator …

C++ Http Server 开源库(汇总级整理)

C http server 开源框架 star 统计截止至 2022.12.10 名称说明链接starcpp-httplib(推荐)A C header-only HTTP/HTTPS server and client libraryhttps://github.com/yhirose/cpp-httplib8.2ksougo/workflowC Parallel Computing and Asynchronous Netwo…

【数据结构Note3】- 栈 应用栈求解迷宫路径

文章目录栈求解迷宫路径1. 求解迷宫思想和难点2. 定义迷宫3. 定义方向结构体和数组4. 迷宫路径穷举5. 代码总测试栈求解迷宫路径 本文分为两部分,第一部分让大家整体了解栈求解迷宫路径的整体思路和算法实现,第二部分仔细分析迷宫求解过程。小白门看不懂…

【机器视觉】电脑连接相机配置的二三事

最近手上有个机器视觉项目,现场总是反馈相机拍照取图是取的上一次的图,折腾很久,发现是配置的锅,这里记录下,防止下次再犯。 1.设置网卡固定IP: 举例:第一个网口:100.100.100.100 …

数据可视化 数据分析 常用图 seaborn

本文主要介绍几种数据分析阶段常用的统计图,可以用来验证数据分布,发现数据之间的关系,或进行异常值检测等。 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from scipy import stats im…