本文编辑:Qingquan
版权所属:美团无人配送
背景与挑战
经过数年的积累,美团无人车已经从技术探索进入到业务运营阶段,这个阶段对于自动驾驶车端系统和离线系统都有了新的要求。
在车端系统上,我们更加关注如何构建低成本、低功耗、高稳定性的自动驾驶系统来支撑大规模运营,对此业界常用多片ARM芯片并配合边缘计算技术来实现,这对于上层软件自动驾驶引擎来说也有了新的要求,即需要它能够支撑多计算节点的协作运行。
另外在离线仿真系统上,仿真任务的迅速增长,要求我们需要具备高效管理、运行超大规模仿真任务的能力,由于不同类型的仿真任务对硬件算力的需求并不一样,那么在仿真系统所能使用的硬件资源配比相对固定的情况下,我们就需要将最大化资源所能承载的任务同样作为引擎的优化目标。
美团无人车技术团队如何应对以上挑战,下文将展开讲述。
1)往分布式计算平台的平滑迁移
在从传统IPC向分布式计算平台的过渡过程中,我们希望上层功能模块在移入到分布式计算平台上运行时无需任何适配,功能模块也无需关心它所运行的节点是否跟上下游模块在同一个节点上。
为完成上述目标,我们就需要自动驾驶引擎能够提供运行环境的抽象与隔离,引擎为完成这一层抽象,必须解决三个关键点:分布式环境下高实时性的数据传输、高实时性的调度、关键自动驾驶数据的实时记录。
图1. 引擎需要将算力向端上平滑迁移
2) 拆分调度仿真任务
仿真系统是自动驾驶研发的重要手段,在自动驾驶进入到运营阶段之后,仿真任务也迅速增长,目前美团自动驾驶仿真系统每天执行数百万仿真任务,峰值流量每小时上百万任务,仿真里程每天上千万公里。
前面提到,不同的仿真任务对硬件算力的需求是不一样的,比如感知预测仿真任务必须依赖GPU运行,在硬件资源(或者其硬件资源的配比)是固定的前提下,为摆脱这种仿真任务的硬性依赖进一步提升资源利用率,我们需要将仿真任务中不同的子任务按照计算属性拆分到不同的机器上运行,其中引擎要负责完成同一任务在不同机器间的通信和执行调度,并做到这种拆分对上层仿真任务无感。
图2. 如何在仿真环境中依据任务属性调度任务
在美团,我们打造了统一的自动驾驶引擎来同时满足车端计算平台和离线仿真系统的需求,因此面向运营的分布式引擎也会遵循这一策略,使用统一的架构来满足车端分布式计算平台和离线仿真系统在大规模运营阶段的新需要。
分布式自动驾驶引擎架构
自动驾驶引擎作为车载自动驾驶系统和离线仿真系统的运行调度管理中心,负责构建自动驾驶功能模块(定位、感知、预测、规划等)的运行环境,让上层功能模块的开发者专注于模块的核心功能开发。
而诸如模块的如何稳定执行、上下游的数据如何传输、自动驾驶数据如何可靠记录等问题则由引擎来处理。
在自动驾驶进入运营阶段之后,为应对前述讲到的分布式计算平台的新需求和仿真系统的挑战,自动驾驶引擎需要关注以下关键点:
a).能够提供底层不同硬件平台和计算场景(单IPC/分布式计算平台/仿真集群)的高度抽象与隔离,对上层功能模块提供统一的执行接口,上层模块不需要任何改变就可以运行在不同的业务场景中,这种隔离和抽象是对高效研发的重要支撑。
b).提供高效的自动驾驶各功能模块的数据交互机制,各场景下的通信接口完全一致。
c).统一管理自动驾驶各模块的公共基础依赖,比如配置、地图、环境等,并对上层模块提供统一的接口。
d).提供可靠的自动驾驶系统运行数据记录,并要保证数据完备、一致。
基于以上考量,美团自动驾驶引擎的整体架构如下图所示,后续章节会对架构中关键模块做进一步阐述。
图3. 美团面向运营场景的自动驾驶引擎架构
关键技术
3.1 分布式通信总线
为应对自动驾驶运营阶段的新需求,我们构建了一套基于Pub-Sub模式的可扩展的通信机制,并已经将之扩展到多种通信场景中,比如单节点多进程间的IPC通信、多节点间也根据需要提供了gRPC和PCIe等多种通信方式来满足分布式计算平台和仿真平台上的需要,而上层功能模块在不同场景下均使用统一的通信接口。
下图是分布式通信总线的层次结构示意图。
图4. 分布式通信总线层次结构
通信总线关键组件解释:
a).CallbackManager负责管理上层功能模块订阅者的回调函数及其执行。
b).Dispatcher负责构建通信路由,并根据路由将消息分发到对应的节点,他是通信总线的核心组件,他决定了自动驾驶数据流的完整通路,图5是一个模块间通信的数据流转过程的示例。
c).Channel负责实际的消息传输,并根据不同的场景构建了不同方式的Channel来供上层业务模块选择。
图5. 自动驾驶消息流转过程示例
3.2 自动驾驶数据记录
自动驾驶数据的记录对于我们分析自动驾驶问题至关重要,数据记录的完整性和可靠性直接决定了研发效率的下限。
对于分布式场景下的自动驾驶数据记录来说,我们关心以下几点:
a).数据的高度有序性:各计算节点间的数据按照时间线进行有序统一记录是事后高效数据分析的基础,如何在分布式场景中保证海量数据(100 GB/Hour量级)的有序性是数据记录的一个难点。
b).数据的完整性:自动驾驶的数据要做到不遗漏,不重复,在需要记录的数据中,除了自动驾驶业务模块的数据外,通信链路本身的Trace数据和模块执行数据对于分析系统问题同样重要,实际应用中我们发现这类数据量非常大,一般会达到2-3万条/秒,对这些数据的记录不能影响到自动驾驶系统的平稳运行。
针对这些挑战,我们的解决方案是,采取集中式 主动拉取式的数据记录落盘策略,即通信数据和系统数据统一进入通信总线,使用单一Recorder主动监听总线进行数据记录落盘,最大化减少数据记录对系统正常运行的影响,在主动拉取的工作方式上运用重排机制,解决了分布式场景下可能出现的乱序问题。
下图是一个典型的数据流记录的示例流程。
图6. 自动驾驶关键数据记录流程示例
3.3 分布式环境下地图管理的挑战
自动驾驶地图是自动驾驶系统正常运行不可或缺的一部分,并且它是上层功能模块的一个通用组件,因此分布式引擎也负责管理车端地图。
在自动驾驶进入运营阶段之后,自动驾驶地图的管理有了新的挑战:
a).在运营阶段,ODD的不断快速扩展成为常态,全量地图数据已经无法全部载入内存,显然这是地图管理在运营阶段需要着重解决的主要问题之一。
b).另外在实际大规模化运营过程中,自动驾驶地图类信息更新比较频繁,比如某个交通灯坏掉、车道线更新、路两侧植被环境短时间内变化较大等等,这就要求我们能够支撑高频的自动驾驶地图更新需求。
针对地图数据的不断扩张等问题,我们通过精细化地图服务,使用车辆位置动态加载瓦片地图,很好地解决了这一阻碍。
此外我们引入了动态图层管理,提供了准实时更新高频变化的地图数据的手段,为保证全天候的自动驾驶运营提供了重要支撑。
下图是自动驾驶引擎中地图管理流程的示意图。
图7. 分布式引擎地图服务管理方案示意图
结束语
美团自动驾驶引擎的演进有效支撑了上层业务在不同阶段的需求,为分布式计算平台提供了系统级的软件解决方案,也为仿真系统进一步提升资源利用率扫除了主要障碍,促进了美团无人车规模化快速落地运营的进程。
未来,美团无人车技术团队也将持续深耕末端物流无人配送领域,努力成为构建“帮大家吃得更好,生活更好”美好生活中的重要一环。