405. Lyft Motion Prediction for Autonomous Vehicles | lyft-motion-prediction-autonomous-vehicles
首先,我要感谢 Lyft 提供这次精彩的挑战,当然还有他们庞大的数据集。我必须说,训练集中大量的智能体让我有点不知所措,但能够训练且从不重复使用训练数据是一次有趣的体验。嗯,当我们使用预训练模型时确实重复使用了,稍后会详细介绍。
我还要感谢我的队友 @philippsinger、@christofhenkel 和 @nvnnghia 在比赛期间的出色协作。我们配合得很好,建立了一个包含两个代码库(版本控制的自定义 l5kit 和训练库)的流程,并使用 neptune.ai 进行日志记录以跟踪实验。
我们的解决方案是一个由 4 个 EfficientNet 模型组成的集成模型,这些模型使用不同的栅格化参数分别在 train_full.zarr 上训练,并在 validation.zarr 上进行堆叠。在如此庞大的数据集上训练这么多模型的关键,是对原始 l5kit 代码库进行了几项关键改进,以消除 CPU 瓶颈并利用 PyTorch 实现高效的多 GPU 训练。
本次比赛的主要挑战之一是栅格化器速度慢。我们对 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++。主要的加速来自:
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 类型。np.concatenate 在大型数组上很慢,我们在 GPU 上进行此操作。
将 "image": image, 替换为 "image_box": image_box, "image_sat": image_sat, "image_sem": image_sem。更改后使用语义和卫星视图的速度(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