0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何提高自动驾驶汽车感知模型的训练效率和GPU利用率

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 2024-04-29 09:12 次阅读

由于采用了多摄像头输入和深度卷积骨干网络,用于训练自动驾驶感知模型的 GPU 内存占用很大。当前减少内存占用的方法往往会导致额外的计算开销或工作负载的失衡。

本文介绍了 NVIDIA 和智能电动汽车开发商蔚来的联合研究。具体来说,文中探讨了张量并行卷积神经网络(CNN)训练如何有助于减少 GPU 内存占用,并展示了蔚来如何提高自动驾驶汽车感知模型的训练效率和 GPU 利用率。

自动驾驶的感知模型训练

自动驾驶感知任务采用多摄像头数据作为输入,卷积神经网络(CNN)作为骨干(backbone)来提取特征。由于 CNN 的前向激活值(activations)都是形状为(N, C, H, W)的特征图(feature maps)(其中 N、C、H、W 分别代表图像数、通道数、高度和宽度)。这些激活值需要被保存下来用于反向传播,因此骨干网络的训练通常会占据显著的内存大小。

例如,有 6 路相机以 RGB 格式输入分辨率为 720p 的图像,批大小(batchsize)设置为 1,那么骨干网络的输入形状为(6, 3, 720, 1280)。对于如 RegNet 或 ConvNeXt 这样的骨干网络而言,激活值的内存占用是远大于模型权重和优化器状态的内存占用的,并且可能会超出 GPU 的内存大小限制。

蔚来汽车自动驾驶团队在这一领域的研究表明,使用更深的模型和更高的图像分辨率可以显著提高感知精度,尤其是对尺寸小和距离远的目标的识别;同时,蔚来 Aquila 超感系统搭载 11 个 800 万像素高清摄像头,每秒可产生 8GB 图像数据。

GPU 内存优化需求

深度模型和高分辨率输入对于 GPU 内存优化提出了更高的要求。当前解决激活值 GPU 内存占用过大的技术有梯度检查点(gradient checkpointing),即在前向传播的过程中,只保留部分层的激活值。而对于其他层的激活值,则在反向传播的时候重新计算。

这样可以节省一定的 GPU 内存,但会增加计算的开销,拖慢模型训练。此外,设置梯度检查点通常需要开发者根据模型结构来选择和调试,这给模型训练过程引入了额外的代价。

蔚来还使用了流水线并行技术,将神经网络按照 GPU 内存开销进行平均分段,部署到多个 GPU 上进行训练。此方法虽然将存储需求平分到多个 GPU 上,但是因为计算不平衡,会导致明显的 GPU 间负载不均衡现象,一些 GPU 的计算资源无法被充分利用。

基于 PyTorch DTensor 的张量并行 CNN 训练

综合考虑以上因素,NVIDIA 和蔚来合作设计并实现了张量并行(Tensor Parallel)卷积神经网络训练方案,将输入值和中间激活值切分到多个 GPU 上。而对于模型权重和优化器状态,我们采用和数据并行训练相同的策略,将其复制到各个 GPU 上。该方法能够降低对单个 GPU 的内存占用和带宽压力。

PyTorch 2.0 中引入的 DTensor 提供了一系列原语(primitives)来表达张量的分布如切片(sharding)和重复(replication),使用户能够方便地进行分布式计算而无需显式调用通信算子,因为 DTensor 的底层实现已经封装了通信库,如 NVIDIA 集合通信库 (NCCL)

有了 DTensor 的抽象,用户可以方便地搭建各种并行训练策略,如张量并行(Tensor Parallel),分布式数据并行(Distributed Data Parallel)和完全切片数据并行(Fully Sharded Data Parallel)。

实现

以用于视觉任务的 CNN 模型 ConvNeXt-XL 为例,我们将展示 Tensor Parallel 卷积神经网络训练的实现。DTensor 放置方式如下:

模型参数:Replicate

重复放置在各个 GPU 上,模型包含 3.50 亿个参数,以 FP32 存储时占据 1.4GB GPU 内存。

模型输入:Shard(3)

切分(N, C, H, W)的 W 维度,将输入分片放到各个 GPU 上。例如,在 4 个 GPU 上对形状为(7, 3, 512, 2048) 的输入执行 Shard(3) 会生成四个切片,形状为 (7, 3, 512, 512)。

激活值:Shard(3)

切分(N, C, H, W)的 W 维度,将激活值分片放在各个 GPU 上

模型参数的梯度:Replicate

重复放置在各个 GPU 上。

优化器状态:Replicate

重复放置在各个 GPU 上。

上述配置可以通过 DTensor 提供的 API 来实现,且用户只需指明模型参数和模型输入的放置方式,其他张量的放置方式会自动生成。

而要达成张量并行的训练,我们需要给卷积算子 aten.convolution 和 aten.convolution_backward 注册传播规则,这将根据输入 DTensor 的放置方式来确定输出 DTensor 的放置方式:

aten.convolution

Input 放置方式为 Shard(3),weight 和 bias 放置方式为 Replicate,output 放置方式为 Shard(3)

aten.convolution_backward

grad_output 放置方式为 Shard(3),weight和 bias 放置方式为 Replicate,grad_input 放置方式为 Shard(3),grad_weight 和 grad_bias 方式方式为 _Partial

放置方式为 _Partial 的 DTensor,在使用其数值时会自动执行规约操作,默认规约算子为求和。

接下来,我们便要给出张量并行的卷积算子前向和反向的实现。由于将激活值切分到了多个 GPU 上,1 个 GPU 上的本地卷积可能需要相邻 GPU 上激活值的边缘数据,这就需要 GPU 之间进行通信。在 ConvNeXt-XL 模型中,其降采样层的卷积不存在该问题,而 Block 中的逐深度卷积则需要处理该问题。

如果无需交换数据,用户可以直接调用卷积的前向和反向算子,传入本地张量即可。如果需要交换本地激活值张量边缘数据,则使用如图 1 和图 2 所示的卷积前向算法和反向算法,省略了图中的 N 和 C 维度,并假设卷积核大小为 5x5,padding 为 2,stride 为 1。

3e402744-0575-11ef-a297-92fbcf53809c.png

图 1 张量并行卷积前向算法示意图

如图 1 所示,当卷积核大小为 5x5,padding 为 2,stride 为 1 时,每个 GPU 上的本地 input 都需要取用相邻 GPU 的宽度为 2 的输入边缘,并将收到的边缘数据拼接到自身上。换句话说,需要 GPU 间的通信来确保张量并行卷积的正确性。这种数据交换,可以通过调用 PyTorch 封装的 NCCL 发送接受通信算子来实现。

值得一提的是,在多个 GPU 上存在激活切片时,卷积算子的有些 padding 是不需要的。因此本地卷积前向传播完成后,需要切除 output 中由不需要的 padding 引入的无效像素,如图 1 中的蓝色条所示。

图 2 显示了张量并行卷积的反向传播。首先,在梯度输出上应用 zero padding,这与前向传播过程中的输出切除操作相对应。对本地输入同样要进行数据交换、拼接和 padding 操作。

之后,通过调用每个 GPU 上的卷积反向算子,即可获得权重梯度、偏置梯度和梯度输入。

3e60a0aa-0575-11ef-a297-92fbcf53809c.png

图 2 张量并行卷积反向传播工作流程

权重梯度和偏置梯度的 DTensor 放置方式是 _Partial,因此使用时会自动对它们的值进行多 GPU 规约操作。梯度输入的 DTensor 放置方式是 Shard(3)。

最后,本地梯度输入的边缘像素会被发送到邻近 GPU 并在相应位置累积,如图 2 中的橙色条所示。

除了卷积层之外,ConvNeXt-XL 还有一些层需要处理以支持张量并行训练。例如我们需要为 DropPath 层使用的 aten.bernoulli 算子传播规则。该算子应被置于随机数生成追踪器的分布式区域内,以保证各个 GPU 上的一致性。

所有代码已经并入了 PyTorch GitHub repo 的主分支,用户使用时直接调用 DTensor 的上层 API 便可实现张量并行的卷积神经网络训练。

使用张量并行训练 ConvNeXt 的基准效果

我们在 NVIDIA DGX AI 平台上进行了基准测试,研究 ConvNeXt-XL 训练的速度和 GPU 内存占用。梯度检查点技术和 DTensor 是兼容的,并且结合两项技术,GPU 的内存占用能够更显著地降低。

测试的基线是在 1 个 NVIDIA GPU 上使用 PyTorch 原生 Tensor,输入大小为(7, 3, 512, 1024)时的结果:不使用梯度检查点时 GPU 内存占用为 43.28 GiB,一次训练迭代时间为 723 ms;使用梯度检查点时 GPU 内存占用为 11.89 GiB,一次训练迭代时间为 934 ms。

全部测试结果如图 3 和图 4 所示:全局输入形状为 (7,3,512,W),其中 W 从 1024 到 8192 不等。实线为未使用梯度检查点时的结果,虚线为使用梯度检查点时的结果。

3e775002-0575-11ef-a297-92fbcf53809c.png

图 3 各种测试条件下的 GPU 内存占用

3e887f9e-0575-11ef-a297-92fbcf53809c.png

图 4 各种测试条件下一次训练迭代耗时

如图 3 所示,使用 DTensor 切分激活值可以有效降低 ConvNeXt-XL 训练的 GPU 内存占用,并且同时使用 DTensor 和梯度检查点,ConvNeXt-XL 训练的 GPU 内存占用可以降到很低的水平。如图 4 所示,张量并行方法有很好的弱扩展性;在问题规模足够大时,也有不错的强扩展性。下面是不使用梯度检查点时的扩展性:

全局输入(7, 3, 512, 2048)给 2 个 GPU 时,一次迭代时间为 937 ms

全局输入(7, 3, 512, 4096)给 4 个 GPU 时,一次迭代时间为 952 ms

全局输入(7, 3, 512, 4096)给 8 个 GPU 时,一次迭代时间为 647 ms

结论

蔚来自动驾驶开发平台(NADP)是蔚来专门用于研发核心自动驾驶服务的平台。该平台可提供高性能计算和全链工具,用来处理每天成千上万的日常推理和训练任务,以确保主动安全和驾驶辅助功能的持续演进。使用 DTensor 实现的张量并行 CNN 训练能够有效提高 NADP 上的训练效率。

该关键性的方案使得 NADP 能够进行万卡规模的并行计算,它提高了对 GPU 的利用率,降低了训练模型的成本,支持了更灵活的模型结构。基准测试显示,在蔚来自动驾驶场景下,该方法表现良好,有效解决了视觉大模型的训练难题。

基于 PyTorch DTensor 的张量并行 CNN 训练可显著减少内存占用并保持良好的可扩展性。我们预计该方法将充分利用多个 GPU 的算力和互连功能,使感知模型训练更加普及。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    4687

    浏览量

    102119
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4511

    浏览量

    127563
  • 自动驾驶
    +关注

    关注

    776

    文章

    13249

    浏览量

    164147
  • pytorch
    +关注

    关注

    2

    文章

    774

    浏览量

    12906

原文标题:使用张量并行技术进行自动驾驶感知模型训练

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LeddarTech和Immervision达成合作,加速ADAS和AD感知模型训练

    近日,汽车技术领域的两家领军企业LeddarTech和Immervision宣布达成合作,共同推动高级驾驶辅助系统(ADAS)和自动驾驶(AD)感知
    的头像 发表于 05-11 10:44 205次阅读

    LeddarTech 和 Immervision 联合宣布 合作加速 ADAS 和 AD 感知模型训练

    宣布了一项合作,旨在简化感知模型训练过程,使其更快、更具成本效益并减少数据密集度。LeddarTech 是一家汽车软件公司,为高级驾驶辅助系
    的头像 发表于 05-09 10:54 331次阅读
    LeddarTech 和 Immervision 联合宣布 合作加速 ADAS 和 AD <b class='flag-5'>感知</b><b class='flag-5'>模型</b><b class='flag-5'>训练</b>

    理想汽车自动驾驶端到端模型实现

    理想汽车感知、跟踪、预测、决策和规划等方面都进行了模型化,最终实现了端到端的模型。这种模型不仅完全模型
    发表于 04-12 12:17 234次阅读
    理想<b class='flag-5'>汽车</b><b class='flag-5'>自动驾驶</b>端到端<b class='flag-5'>模型</b>实现

    未来已来,多传感器融合感知自动驾驶破局的关键

    巨大的进展;自动驾驶开始摒弃手动编码规则和机器学习模型的方法,转向全面采用端到端的神经网络AI系统,它能模仿学习人类司机的驾驶,遇到场景直接输入传感器数据,再直接输出转向、制动和加速信号。模仿学习人类
    发表于 04-11 10:26

    FPGA在深度学习应用中或将取代GPU

    、笔记本电脑或机架式服务器上训练神经网络时,这不是什么大问题。但是,许多部署深度学习模型的环境对 GPU 并不友好,比如自动驾驶汽车、工厂、
    发表于 03-21 15:19

    台积电晶圆厂产能利用率将全面提高

    消息来源表示,TSMC 8英寸及12英寸晶圆工厂的利用率已分别回升至70-80%和80%。尤其值得注意的是,28纳米制程的利用率已重返80%的常态范围;而7/6纳米与5/4纳米制程的利用率更分别达到75%以及接近饱和状态。
    的头像 发表于 01-17 13:56 369次阅读

    LabVIEW开发自动驾驶的双目测距系统

    精确的距离信息,从而提高车辆的主动安全性能。这一系统的开发和应用有望在自动驾驶领域取得更多突破性进展。 ​ 这是LabVIEW的一个功能介绍,更多的使用方法与开发案例,欢迎登录官网,了解更多信息。有需要LabVIEW项目合作开发,请与我们联系。
    发表于 12-19 18:02

    自动驾驶中的多感知源/单感知源提升方案

    自动驾驶中的视觉感知是车辆在不同交通条件下安全、可持续地行驶的关键部分。然而,在大雨和雾霾等恶劣天气下,视觉感知性能受到多种降级效应的极大影响。
    发表于 10-23 10:26 269次阅读
    <b class='flag-5'>自动驾驶</b>中的多<b class='flag-5'>感知</b>源/单<b class='flag-5'>感知</b>源提升方案

    【KV260视觉入门套件试用体验】八、VITis AI自动驾驶多任务执行MultiTask V3

    是一种模型,旨在同时执行自动驾驶场景中的不同任务,同时实现优异的性能和效率。这些任务包括对象检测、分割、车道检测、可行驶区域分割和深度估算,这些都是自动驾驶
    发表于 09-26 16:43

    NVIDIA 自动驾驶实验室:基于剪枝的 AI 模型优化

    训练模型,以最大限度地提高计算利用率。在使用 NVIDIA DRIVE Orin 的道路测试中,它始终优于其他方法。 观看本期自动驾驶实验
    的头像 发表于 09-19 20:20 612次阅读

    频分复用可以提高通信线路的利用率

    频分复用可以提高通信线路的利用率?  频分复用,英文名为Frequency Division Multiplexing(FDM), 是一种多路复用技术,它可以将多个低速信号合成成一个高速信号进行传输
    的头像 发表于 09-01 15:38 1015次阅读

    华为盘古大模型如何赋能自动驾驶

    华为盘古大模型如何赋能自动驾驶?  随着智能时代的到来,自动驾驶已成为许多汽车制造商和科技公司的追求,华为作为智能时代的领导者之一,自然也积极布局并投入大量资源研发
    的头像 发表于 08-31 10:18 1624次阅读

    CVPR上的新顶流:BEV自动驾驶感知新范式

    BEV自动驾驶感知好比一个从高处统观全局的“上帝视角”,将三维环境信息投影到二维平面,以俯视视角展示环境中的物体和地形。在路径规划、障碍物检测、自动驾驶决策等方面,BEV感知都展现出了
    的头像 发表于 08-23 14:51 831次阅读
    CVPR上的新顶流:BEV<b class='flag-5'>自动驾驶</b><b class='flag-5'>感知</b>新范式

    浅析自动驾驶视觉感知算法

    环境感知自动驾驶的第一环,是车辆和环境交互的纽带。一个自动驾驶系统整体表现的好坏,很大程度上都取决于感知系统的好坏。目前,环境感知技术有两
    发表于 07-25 10:36 428次阅读
    浅析<b class='flag-5'>自动驾驶</b>视觉<b class='flag-5'>感知</b>算法

    点云标注在自动驾驶中的实践应用与挑战

    光照、环境、传感器等因素的影响,导致数据质量下降或不确定性增加。因此,需要开发更加鲁棒的标注算法和模型,以应对实际应用中的挑战。 其次,点云标注的效率和准确性需要进一步提高。在实际应用中,自动
    的头像 发表于 07-18 17:00 380次阅读