返回列表

1st Place Solution & L5Kit Speedup

405. Lyft Motion Prediction for Autonomous Vehicles | lyft-motion-prediction-autonomous-vehicles

开始: 2020-08-24 结束: 2020-11-25 自动驾驶决策规划 数据算法赛
第一名解决方案 & L5Kit 加速

第一名解决方案 & L5Kit 加速

简介

首先,我要感谢 Lyft 提供这次精彩的挑战,当然还有他们庞大的数据集。我必须说,训练集中大量的智能体让我有点不知所措,但能够训练且从不重复使用训练数据是一次有趣的体验。嗯,当我们使用预训练模型时确实重复使用了,稍后会详细介绍。

我还要感谢我的队友 @philippsinger@christofhenkel@nvnnghia 在比赛期间的出色协作。我们配合得很好,建立了一个包含两个代码库(版本控制的自定义 l5kit 和训练库)的流程,并使用 neptune.ai 进行日志记录以跟踪实验。

摘要 (TL;DR)

我们的解决方案是一个由 4 个 EfficientNet 模型组成的集成模型,这些模型使用不同的栅格化参数分别在 train_full.zarr 上训练,并在 validation.zarr 上进行堆叠。在如此庞大的数据集上训练这么多模型的关键,是对原始 l5kit 代码库进行了几项关键改进,以消除 CPU 瓶颈并利用 PyTorch 实现高效的多 GPU 训练。

L5Kit 的改进/变更

本次比赛的主要挑战之一是栅格化器速度慢。我们对 l5kit 进行了大量性能分析,并确定了瓶颈所在,将其速度提高了 4 倍以上。之后,我们的实验主要受限于 GPU,多 GPU 实验使我们能够进行“快速”迭代。使用中等规模的模型,在 2 天内跑完 train_full(191,177,863+ 样本)成为可能。

加速措施

更改前仅使用语义视图的速度(i5-3570K 单线程,因此请忽略实际时间):

每个样本的栅格化时间:0.124 s
命中         时间   每次命中   % 时间  行内容
==================================================
9   11147507.0 1238611.9     93.6    rasterizer.rasterize(history_frames, history_agents, history_tl_faces, selected_agent)

所有的加速都是通过纯 Python 实现的,没有使用 C++。主要的加速来自:

  1. 结合 https://github.com/lyft/l5kit/pull/167 的修改对边界框进行批量变换。 据说变换是栅格化器的瓶颈,因为它被调用了很多次。我们在任何可能的地方都使用了向量化变换。
  2. box_rasterizer.py 中,使用小 numpy 数组的 Python 列表代替两个大型 numpy 数组(agent_images, ego_images)。 Python 列表的速度惊人地快!在大型 numpy 数组上使用 np.concatenate 很慢。预分配并写入单个大数组甚至更慢。 列表可以通过 out_im = np.asarray(agents_images + ego_images, dtype=np.uint8) 转换为 numpy 数组。 这样,边界框将保持在 uint8 类型。
  3. 将拼接操作移至 GPU。 由于 np.concatenate 在大型数组上很慢,我们在 GPU 上进行此操作。 将 "image": image, 替换为 "image_box": image_box, "image_sat": image_sat, "image_sem": image_sem
  4. 来自 https://github.com/lyft/l5kit/pull/140 的加速。 随着上述更改,它们现在产生的影响比 PR 中所述的 7-8% 更大。

更改后使用语义和卫星视图的速度(i5-3570K 单线程,因此请忽略实际时间):

每个样本的栅格化时间:0.032 s
命中         时间   每次命中   % 时间  行内容
==================================================
   9    2847054.0 316339.3     84.2  rasterizer.rasterize(history_frames, history_agents, history_tl_faces, selected_agent)

新增/变更

  • 新的栅格化器,结合了卫星和语义视图(py_sem