在 Nuro,开发自动驾驶技术不仅仅关乎前沿的机器人技术和人工智能,还在于高效经济的数据处理。每天,我们在 Google Cloud 上运行数百万小时的模拟和数据处理任务。要实现这一点,我们建立了一个内部系统来管理复杂的任务依赖性,并以最大限度地提高资源利用率来优化我们的计算集群。
挑战:超越行业的标准
在追求自主权的过程中,利用大规模数据集非常重要。然而,当前行业的解决方案在扩展以适应我们的需求或提供开发人员所需的功能来深入分析时却显得不足。总的来说,这些解决方案可以分为两大类:
1. 工作流管理工具
像Airflow、Jenkins和Buildkite这样的工具提供了用户友好的界面来直观地展示任务执行情况——监控状态、访问日志等。但它们通常设计用于处理每条流水线中的数千个任务。相比之下,我们的验证过程通常涉及数百万个任务。将这类系统扩展到我们这种规模会面临难以克服的挑战。传统的调度程序每秒难以处理数千个任务,也无法管理包含数百万个节点的有向无环图(DAG)。此外,由于用户界面的限制,在庞大的DAG中识别和交互单个任务变得不切实际,这在用户界面上更是如此。
2. MapReduce 框架 (分布式计算模型)
像 Celery、BigQuery、DataFlow、Ray 和 Pub/Sub 这样的平台在处理大规模数据集方面表现出色。然而,它们被优化用于快速、无状态的操作,缺乏详细的每次调用跟踪记录。没有细粒度的跟踪,诊断单个模拟中的问题非常困难,而没有详细的见解,几乎无法定制资源利用策略。
图1. BATES管理包含数以百万计场景的DAG。
来认识BATES:我们的灵活解决方案!
为克服这些障碍,我们开发了BATES(批量任务执行系统)——一个每天能处理数百万任务的稳定平台。以下是BATES是如何改变我们的工作流程的:
1. 分层次的任务管理
在 BATES 中,每个执行单元都是一个任务(Task),以 protobuf 消息的形式被封装并路由给一个工作者执行。任务可以生成子任务,形成层次结构。无需事先定义整个作业流程图,任务可以根据需要生成新任务,从而实现灵活性和可扩展性。这意味着用户提交的根任务(即作业)无需事先指定每个依赖关系。
2. 高级编排技术和跟踪
我们的BATES服务器利用了结合OLTP(在线事务处理)数据库和Redis来监控任务状态。我们实现了一个自定义的消息队列,可以根据任务大小、开始时间和实时因素(如新任务提交或用户重新设置优先级)自动分配并调整任务优先级。用户可以将元数据附加到任务上,我们将这些元数据导出到可观察性平台(例如Prometheus和Google Cloud BigQuery)进行分析和报警。
图2. 作业安排根据SLA和作业大小来优化周转时间,从而优化作业周转时间。
使用通用工作者简化执行过程
构建和管理工人工作环境是另一个重要的挑战。工程师需要创建特定软件版本的容器镜像,配置工人,以及微调自动扩展和资源分配——这是一项耗时的任务。
集中工人池
为了简化这一点,我们建立了一个通用工作者的池,能够运行大多数工作负载。工人环境与我们工程师的工作环境相似,从而大大减少了设置所需的工作。中央管理让计算基础设施团队可以调节性能和效率,提升整体资源的使用效率。
高效的包处理:
我们使用内容寻址存储(CAS)作为打包格式。不同版本中相同的文件只会存储一次,通过自动去重减少存储需求量。我们自定义构建的文件系统,基于用户空间文件系统(FUSE)构建,仅在执行过程中实际访问到文件时获取。这种按需获取的方法减少了初始化的开销,并提高了任务分配到工作进程的灵活性。
智能任务安排和自动伸缩
自动调整我们的集群对于保持任务周转时间和成本效率之间的平衡至关重要。我们采用的策略会考虑多种因素。
- 最优资源分配
决定工作副本的数量涉及权衡。扩展不足会导致队列等待时间延长和任务延迟,而扩展过度则会导致资源闲置或需要停止多余的节点,从而中断正在进行的任务。我们通过定制的任务分配策略来应对这些挑战。我们的调度器将任务分配给工人以最大化资源利用率。在缩减规模时,我们会智能地选择影响工作负载最小的节点进行终止。
图3. 自动缩放策略考虑作业的SLA和云VM的成本层次。
2. 成本优化: 由于承诺使用折扣和竞价实例等因素,云计算资源的价格各不相同。我们的自动调整器综合多方面的数据,考虑作业SLA、资源成本和可用性。它计算出既能满足性能需求又能节省成本的最佳方案。这一策略为Nuro节省了数百万美元的云成本,同时提升了生产效率。
自适应的资源管理
准确预测动态工作负载的资源需求本身就很具挑战性。分配过多则会造成资源浪费,而分配过少则可能导致性能瓶颈或内存溢出错误。我们的解决方案免去了用户指定详细资源需求的麻烦。用户只需提供少量信息,如需使用GPU,调度程序将利用历史和当前的使用数据来估算并分配相应的资源。这样不仅简化了用户的操作体验,还能够更大范围地规划和优化资源。
结论:推动自主前行
BATES以及我们通用工人的生态系统的发展代表了Nuro在扩展模拟、评估和数据处理效率方面的重要投入。通过克服行业限制等挑战,我们已经做到了以下几点:
- 增强的可扩展性: 在不影响性能的前提下,成功处理了数百万的日任务。
- 提高成本效率: 通过智能调度和资源管理,我们节省了数百万的云费用。
- 提升生产力: 释放了工程师们的时间,让他们能够专注于提升自主性,而不是纠缠于基础设施问题。
我们的旅程强调了创新解决方案在推动自动驾驶汽车未来发展中的重要性。我们为取得的进展感到自豪,并对未来的前景充满期待。
加入我们,一起塑造未来的出行,共创美好明天
所有这些出色的工作都是我们卓越团队的证明。如果你喜欢解决复杂问题并突破技术的界限,我们会很高兴认识你。加入我们团队
由: Peijun Zhu Henry Lancelle Jerry Fan Chuan Qiu
作者在此感谢Aaron Lee、Adam Groner、Hanhong Gao、Iris Sun、Josh Karges、Michael Li、Qi Zhu、Ryan Brown、Sachin Padmanabhan、Yiwei Li以及其他未在此提及的Nuro团队成员提供的帮助和支持。
共同学习,写下你的评论
评论加载中...
作者其他优质文章