导读:本次分享的主题为打造最可靠的自动驾驶基础架构。主要内容包括如何作 Pony.ai 自动驾驶系统的基础架构,涉及到的技术困难,以及咱们是如何克服的。web
首先先了解下传统互联网公司的基础架构:算法
数据基础设施,会包括大规模的数据库、分布式的文件系统;数据库
计算平台,可能会须要大量的服务器、大数据平台、容器的管理机制;安全
Web 服务管理,同时还会有各类各样的 Web Service,不停的迭代来知足新的业务发展。服务器
这是传统互联网公司要作的事情,可是对于自动驾驶公司和 Pony.ai,在这样的架构基础上咱们还会作哪些事情?架构
这是 Pony.ai 的基础架构,包含了全部传统互联网公司要作的事情,除此以外,还须要作以下事情:app
自动驾驶车载系统,如何支持各类各样的AI技术、算法,如何控制车辆,这都依赖于自动驾驶车载系统来完成。框架
大规模仿真平台,Pony.ai 天天至少会跑 30W 千米的仿真测试(不少自动驾驶公司一年跑的里程可能只有百万级别),这点对于自动驾驶测试来讲很是重要。webapp
车队运营基础平台,Pony.ai 要打造本身的移动出行服务,须要基础平台来支持 Robotaxi 的运营。分布式
可视化平台与人机接口,可视化平台是帮助咱们了解系统究竟是如何思考、运做的,或者当测试工程师作各类测试的时候都依赖于可视化平台;人机接口,自动驾驶车辆最终是要提供出行服务,是有乘客在里面,这时会有一个可视化的界面,来告诉乘客车所感知的周围环境,以及接下来的驾驶操做等等信息,同时还会提供人机交互的功能,让乘客也能控制车辆,好比输入目的地,或者须要停车等等。
......
Pony.ai 的目标是打造自动驾驶移动出行平台,咱们但愿能够在不一样的城市,能够提供大规模自动驾驶车辆的运营,那么咱们的基础架构会面临如下挑战:
车辆数量的增长,目前广州已经有几十辆车在进行测试,同时还在不停的增加着;
运营区域的扩大,刚开始只是在很小的区域进行测试,目前已经在几百平方千米的区域进行测试;
数据量的增加,咱们有不少的传感器,以及车辆和运营区域的增长,都使得数据量的增加很是很是很是大;
工程师数量的增加,目前 Pony.ai 有广深、北京、美国四个 office,工程师的数量每周都在增加,因此致使模块数量和内部代码的数量也在增加。
全部的这些增加都要求咱们的技术栈是具备可扩展性的,来知足快速增加所带来的挑战。
刚刚讲了整个基础架构,其中重要的一点就是车载系统,在讲车载系统以前,先简单介绍下自动驾驶系统:
传感器及其余硬件:激光雷达、高分辨率摄像头、毫米波雷达、GNSS/IMU、运算平台,咱们可看到图中标了不一样的颜色,目前这些传感器是经过 Supplier Partner 来获得的,咱们本身不作传感器,咱们须要去购买他们的产品,可是购买以后须要作数据进一步的分析和整合,而后作后面的处理,而后对于运算平台除了 supplier 的一些应用外,咱们本身也会作一些优化。传感器主要要作的事情就是接收真实世界的数据,而后传递给 Pony.ai 自动驾驶系统中。
自动驾驶系统:首先,要作传感器融合,进行时间同步,将多传感器的数据融合在一块儿;而后是感知模块,用来感知周围的环境有什么样的障碍物和物体;接下来会进行行为预测,预测这样的障碍物或物体以后的行为会是什么样的;而后才到咱们的决策规划模块,按照以前的预测来决定以后车辆的动做,如急刹车、让路、超车等动做;最后,就是咱们的控制模块,他会按照决策规划模块,告知咱们的系统要怎么作,而后决定怎么踩刹车、油门,怎么打方向盘。
车辆,咱们自己是不造车的,因此车辆是由 OEM 提供的,可是整个控制的算法,是咱们自研去作的。
除此以外,还有高精地图与定位模块,以及数据与系统架构(数据的处理,以及控制数据在不一样模块的流动)。
这里介绍的是各个模块,但最后把他们串联起来,靠的是咱们的自动驾驶软件系统,这就是自动驾驶的车载系统。不少自动驾驶企业使用的是 ROS 的一套工业系统,而 Pony.ai 是从第一行代码开始,写了一套 PonyBrain,自研的多层次自动驾驶车载系统,最主要的作的事情有:
多模块的调度运行,全部模块的调度运行都是 Pony.ai 本身去作的。
模块间的消息通讯,如何把数据从激光雷达传递到传感器融合的模块,再把融合的结果放到感知模块中,而后感知的数据怎么告诉行为预测、决策规划等等模块,以及如何拿到高精地图与定位的信息。
车载计算资源的分配与管理,对于自动驾驶来讲反应速度是很是重要的,这就须要咱们对内存、CPU、GPU 等有足够的优化,作到定制化的车载计算资源分配与管理。
日志记录,同时咱们须要完善的日志记录,咱们全部的测试数据回来都须要一整套的 Pipeline 去作自动化的分析,然后帮咱们评判出有意义的数据,给到测试工程师或者研发工程师,进行进一步的分析去使用,而后进一步提高咱们的模型。
监控与报警,保证了咱们自动驾驶的安全性。
车载系统的挑战:
① 可靠性:车载系统必须足够的可靠,不能有任何的内存泄露、代码逻辑的错位,这种都是零容忍的,一旦发生了这样的事情,对整个自动驾驶系统来讲是很是严重的事故,是有可能影响到安全性的,对于 Pony.ai 自动驾驶系统技术的发展来讲,安全永远是咱们的第一位,因此全部影响安全性的事情,咱们都是零容忍的,同时他也会影响车队运营的效率;因此咱们还须要系统监控与异常报警,一旦系统出现任何问题,咱们须要及时提醒安全员,作出车辆接管的操做。
② 高性能:知足模块间通讯的海量数据压力,同时实现低延迟。
③ 灵活性:支持多种不一样类型的计算资源的接入,以及不一样类型模块的接入,须要有灵活的系统来支持计算资源的高速迭代。
车载系统的实践:
可靠性:
① 代码质量要求高:对于可靠性来讲咱们有很是严格的 code review 和 unit test,相信这是在国内互联网公司不太容易见到的一件事情,虽然会很是耗时,可是对可靠性的提高是有很是大的帮助的。
② 合理使用工具帮助发现问题:同时咱们也会使用很是多的工具,如静态分析、ASAN 等等,来作离线的分析,来保证系统的可靠性。
③ 多重系统可靠性检查:包括系统启动前校验,系统运行时实时监控,系统运行后数据分析等。
④ 这是咱们的持续集成与发布的平台:对于每一次代码的修改,咱们都会进行仿真测试;而后对于研发的迭代,咱们每周会有 Release 版本的更新,保障版本的稳定性,同时,刚刚咱们整个测试包括封闭,半封闭,高峰期的测试,整个测试流程怎么持续集成与发布,也是保证系统可靠性的一种方法。
高性能:
① 合理的架构避免大数据拷贝等严重影响性能的逻辑。
② 依据模块逻辑分配合适的计算资源,如内存、CPU、GPU 等。
③ 按期对整个系统 Profile 分析系统的性能瓶颈。
灵活性:
① 定义足够通用的模块公共接口。
② 定义足够通用的消息通讯接口。
为何须要仿真系统?由于仿真系统可使得咱们车尚未上路的时候,就已经作了大规模的自动驾驶测试,无需路测和人力接入就能够评价系统的性能变化;因为没有进行路测,不会引发路面事故;同时,仿真系统还提供了基于数据驱动快速迭代算法的可行性,新的算法能够先在仿真平台上作验证,一些具体的指标和测试的信息都会在仿真平台上有所体现。
仿真系统数据的俩个不一样来源:
① 支持真实路测收集的场景,咱们的路测数据很是的多,数据回来以后,经过 Data Pipeline 自动更新这些有意义和有意思的场景,咱们会根据当时的场景改动相应的模块,而后会在仿真系统重跑当时的场景,来判断新的方法是否 work;
② 支持人工和随机生成的场景,这样的一些仿真的场景,也是很是的重要的,由于虽然咱们在作大规模的路测,可是不表明能够遇到全部的场景,不少场景没法在路测中收集到,这就须要咱们经过人工去创造这样的场景出来,给咱们的系统一些样本,来学习如何处理这样的场景,保证咱们新的 feature 在这样的场景不会出现问题。
仿真平台的挑战与实践:
① 仿真结果的可靠性:首先仿真的结果必须是可靠的,若是不可靠,用它检测出来的结果是没有任何的意义的。整个仿真是在服务端模拟车载环境跑的,同时在服务端构建车辆动力学模型,保证测试的数据足够可靠。
② 仿真数据的选择与管理:固然咱们会选择合适的路测数据来帮助算法的迭代(这里的选择不是人工的选择,是全自动化的选择,帮咱们在茫茫数据中挑选出有意义的数据);另外,咱们还会规范的依据类别管理大规模的仿真数据,好比感知模块的一些改动,到底须要测试哪些数据,才会更加的体现这个改动带来多少影响,这里咱们会有内部的一个分类,咱们不会对全部的数据进行无差异的仿真(这样作意义不大)。
③ 仿真系统的性能:咱们将整个仿真系统并行部署在分布式计算平台中,这才可能知足咱们单天 30W 千米以上的仿真测试,而且这个数据还在不断增加。
数据基础架构:
数据是自动驾驶技术进步的核心驱动力,没有数据,咱们就看不到如今如此多的测试车辆在进行路测,数据自己有几个重要的点:
① 如何存储海量的数据,如何支持快速的访问。
② 如何进行数据处理。
③ 如何进行数据同步,如何把不一样区域、路测数据、车载数据同步到数据集中,如何让不一样办公区的工程师均可以使用这些数据,对数据同步来讲是一个很大的挑战。
核心挑战:
① 数据量大:咱们有 PB 级别的数据,这里只是以摄像头为例,还包括其余传感器数据,以及系统运做的中间数据等等。
② 数据属性不一样于互联网数据:咱们的数据由客户端产生,有大量的传感器数据、大量的模块运行日志,这与互联网数据有本质的区别,因此对整个数据架构的要求也是不同的。
数据存储的挑战:
① 依据特定的使用场景设计合理的存储格式的设计:以便于车载系统记录、大规模数据分析(数据回来以后,须要有方法进行分析,找出有意义的数据)、部分数据访问、文件系统存储(如何高效的利用文件系统)等。
② 选择合适的存储系统:
针对冷/热数据选择不一样方案
选择高可用的存储系统
选择易于水平扩展,由于车辆规模是不停的在变大的,运营时间愈来愈长,数据的增加速度是远超想象的,因此须要易于水平扩展的存储系统。
控制成本,不能用过于昂贵的设备。
数据处理能够帮助收集性能指标,有 MPI(平均每次接管所需里程)、模块运行效率、乘客温馨度体验等,还有就是路测有趣场景的挖掘,如接管、急刹、感知算法识别、不合理的变道策略等用于模型训练和仿真。
数据处理的挑战:
① 减少数据采集处处理的全流程时间:如何以最快的速度把数据从车传到中间处理系统,Data Pipeline 运行完以后,上传到数据中心,这里面咱们作了很是多的工做。
② 依据不一样类型数据处理任务选择合适的处理系统:计算量要求比较高的咱们选择 CPU 密集型系统来处理;更多的会是车载的数据,咱们会选择 IO 密集型系统进行处理。
③ 通用的任务定义以支持灵活的添加新任务:帮咱们检测出来更多有意义的数据。
车队运营基础平台:
咱们有一个 Pony Pilot 项目,在咱们广州全部的内部员工均可以使用,同时在北京和美国加州,也有一样的服务已经上线,那么支持这样的服务,咱们须要作哪些事情:
Fleet Control Center,车队控制中心
Pony Pilot APP
Onboard system
各类各样的 webapp,帮助咱们观察整个车队的运营状况,帮助管理测试的车辆和人员。
车队运营基础平台的挑战:
须要支持复杂需求变化的 web 框架,同时咱们有大量的 web service 的部署与管理,这都须要咱们去完善 web 服务通用组件,例如部署工具、日志记录平台随时排查问题、监控平台保证全部 service 平台的高可容性。
容器与服务调度平台:
经过 Kubernetes 来帮咱们作各类各样的服务调度和集群支持。
可视化平台:
① 目标:方便人类理解无人车系统看到的世界
② 挑战:首先,须要足够的灵活,易于适配不一样需求的工具;其次,须要有高性能的现实,如 3D 实时渲染的高效实现;最后,支持跨平台的可视化框架,如桌面系统、移动系统、Web 等多平台。
人机接口:
方便乘客使用的用户界面,同时能够看到自动驾驶是如何了解世界,如何作决策,如何规划以后的行为等等,给乘客更多的信息和信任。
总结:
① Pony.ai 的基础架构工做包括:
传统互联网公司所须要解决的基础架构挑战。
自动驾驶技术特定的基础架构挑战。
② 在这里工做你能够:
接触自动驾驶系统的各个方面。
设计并实现知足通用需求的单机和分布式系统。
系统的保障自动驾驶技术的持续进步。
这是一个很是有意思的 team,里面有不少有意思的工做,很是欢迎你们与咱们一块儿来工做,推进整个自动驾驶的发展,谢谢你们!
分享嘉宾▬
莫璐怡
Pony.ai | Tech Lead
——END——
DataFun:
专一于大数据、人工智能领域的知识分享平台。