2017年9月,我们发表了一篇文章介绍米开朗基罗,Uber的机器学习平台到更广泛的技术社区。那时,我们已经在平台的第一个版本中积累了一年多的制作经验,并与我们的多个团队合作构建、部署和操作他们的机器学习(ML)系统。
随着我们平台的成熟和Uber服务的增长,我们看到了整个公司ML部署的爆炸式增长。在任何给定的时间,平台上的生产环境中都部署了代表数千个模型的数百个用例。每秒钟都有数百万次预测,数百名数据科学家、工程师、产品经理和研究人员在公司内研究ML解决方案。雷竞技是骗人的
在这篇文章中,我们从平台的角度回顾了过去三年ML在Uber的发展。我们回顾了Uber开发米开朗基罗和规模化ML的过程,深入分析了Uber目前开发ML平台的方法和未来目标,并提供了一些一路走来的经验教训。除了平台的技术方面,我们还研究了重要的组织和流程设计考虑因素,这些因素对我们在Uber的ML业务取得成功至关重要。
三年内从0到100
2015年,ML在Uber还没有被广泛使用,但随着我们公司的规模扩大,服务变得更加复杂,ML显然有机会产生转型的影响,在整个公司普遍部署ML的想法很快成为了战略重点。
虽然米开朗基罗的目标从一开始就是在Uber普及ML,但我们从小规模开始,然后逐步构建系统。米开朗基罗最初的重点是实现大规模批量训练和批量预测工作。随着时间的推移,我们增加了一个集中的特征存储、模型性能报告、低延迟的实时预测服务、深度学习工作流、笔记本集成、分区模型以及许多其他组件和集成。
在短短三年时间里,Uber从没有集中的机器学习工作和一些定制的机器学习系统,发展到拥有先进的机器学习工具和基础设施,以及数百个生产机器学习用例。
ML在Uber的用例
Uber将ML用于一系列非常多样化的应用。Uber并没有将机器学习应用于少数关键领域(如广告优化或内容相关性),而是拥有更广泛的机器学习解决方案。在本节中,我们将讨论过去三年出现的几个米开朗基罗用例,突出ML在Uber的多样性和影响:
超级吃
优步外卖使用了许多基于米开朗基罗的机器学习模型,每次打开应用程序时,都能做出数百个预测,优化食客的体验。
ML-powered排名模型会推荐餐厅和菜单项基于历史数据和用户在应用中的当前会话信息(例如他们的搜索查询)。
利用米开朗基罗的技术,Uber Eats还根据预计的时间、历史数据以及餐饮和餐厅的各种实时信号来估计餐点到达时间。
市场预测
优步的市场团队利用了各种时空预测模型它们能够预测未来不同地点和时间的乘客需求和司机合作伙伴的可用性。基于对供需不平衡的预测,优步系统可以提前鼓励司机合作伙伴前往最有机会乘车的地方。
客户支持
优步每天约有1500万次出行。人们经常把钱包或手机落在车里,或者出现其他问题,导致我们的帮助系统每天都要收到数千张支持罚单。这些票被发送给客户服务代表。米开朗基罗设计的机器学习模型大量用于自动化或加速响应和解决这些问题的大部分过程。这些模型的第一个版本基于增强的树,将票务处理时间缩短了10%,客户满意度与之相当或更高。第二个版本基于深度学习模型,额外提高了6%的速度。
旅行支票
自2010年首次使用优步以来,GPS数据一直被用于在地图上显示每一次旅行,这样我们就知道你在哪里、什么时候乘坐,以及谁在开车。但我们可以做得更多:通过利用司机智能手机中的GPS和其他传感器的力量,我们的技术可以检测到可能的碰撞。这项技术还可以标记出除极少数情况下可能发生的事故外的行程异常情况安全风险增加.例如,如果在旅途中出现意外的长时间停车,乘客和司机都将通过我们的Ride Check功能收到通知,在发生碰撞时提供帮助。
预计抵港时间
该公司最重要和最可见的指标之一是乘客接送时间。准确的eta对于积极的用户体验至关重要,这些指标被输入无数其他内部系统,以帮助确定定价和路线。然而,eta是出了名的难搞。
Uber的地图服务团队开发了一个复杂的逐段路由系统,用于计算基本的ETA值。这些基本eta具有一致的误差模式。地图服务团队发现,他们可以使用机器学习模型来预测这些错误,然后使用预测的错误进行修正。随着该模型在一个城市一个城市地推广(过去几年在全球范围内推广),我们看到ETA的准确性有了显著提高,在某些情况下,平均ETA误差减少了50%以上。
一键式聊天
的一键聊天功能通过使用自然语言处理(NLP)模型来预测和显示应用程序内聊天消息最有可能的回复,简化了乘客和司机伙伴之间的沟通。让司机伙伴只需按下一个按钮就可以回复骑手的聊天信息,从而减少注意力的分散。
自动驾驶汽车
优步的自动驾驶汽车系统使用深度学习模型来实现各种功能,包括物体检测和运动规划。建模师使用米开朗基罗的作品Horovod用于在大量GPU机器上对大型模型进行有效的分布式训练。
我们在Uber是如何扩大ML规模的
作为一个平台团队,我们的使命是释放ML的价值,并加速其在公司各个角落的采用。我们通过民主化工具和支持我们的技术团队的需求来做到这一点,即优化开发人员的速度、端到端所有权、软件工程的严谨性和系统的灵活性。
对于数据科学家来说,我们的工具简化了构建和部署ML系统的生产和操作方面,使他们能够端到端拥有自己的工作。对于工程师来说,Uber的ML工具简化了这些系统背后的数据科学(特征工程、建模、评估等),使他们可以轻松地训练足够高质量的模型,而不需要数据科学家。最后,对于构建专业ML系统的经验丰富的工程团队,我们提供米开朗基罗的ML基础设施组件,用于可定制的配置和工作流。
在优步这样的公司,要想成功扩展机器学习,需要的不仅仅是正确的技术,还有组织和流程设计方面的重要考虑。在本节中,我们将讨论跨三个支柱的关键成功因素:组织、流程和技术。
组织
对机器学习问题的广泛不同的需求和有限的专家资源使得组织设计对机器学习特别重要和具有挑战性。Uber的一些机器学习项目由多名机器学习工程师和数据科学家组成的团队拥有,而其他项目则由几乎没有技术专业知识的团队拥有。类似地,有些问题可以由新手用常用的开箱即用算法解决,而其他问题则需要专家用先进的技术进行调查(通常没有已知的解决方案)。
让正确的人处理正确的问题对于构建高质量的解决方案并在生产中持续成功地部署它们至关重要。挑战在于如何分配稀缺的专家资源,并在许多不同的机器学习问题上放大他们的影响。例如,如果一个新项目需要计算机视觉技术,什么样的组织结构可以让优步有效地分配专家资源,并与公司的优先事项保持一致?
经过几次迭代,优步目前的运营主要有以下角色和职责:
让我们来看看一些关键的团队,以及他们如何在生产中共同设计、构建和部署新的ML系统。
产品团队
我们发现,如果产品工程团队拥有他们在生产中构建和部署的模型,那么效果最好。例如,我们的地图服务团队拥有预测优步的eta的模型。产品团队通常拥有使用Uber的ML平台构建和部署模型所需的全套技能。当他们需要额外的专业知识时,他们可以从研究和/或专家团队获得帮助。雷竞技是骗人的
产品组织有时也有专门的团队来帮助解决平台提供的东西和特定产品工程团队需要的东西之间的任何差距。这些团队根据他们的用例调整集中式平台工具,并使用定制的工具和工作流填补功能空白。例如,优步市场部门的许多团队都有类似的工作流程,围绕每个城市和产品进行培训、评估和部署模型。Marketplace团队创建了专门的工具,这些工具位于Michelangelo之上,使得管理这些Marketplace ML项目变得更容易。
专家团队
当产品工程团队遇到需要扩展能力或资源的机器学习问题时,他们可以向内部专家团队寻求帮助。Uber的专家在不同领域都有深厚的专业知识,如NLP、计算机视觉、推荐系统、预测,并与产品工程团队合作,构建量身定制的解决方案。例如,我们的科塔项目是将专业团队与产品团队结合起来,为我们的业务和客户创造巨大影响的努力。
通常情况下,这些项目会持续几周到几个季度。当一个项目去风险,并且接近于在生产中发布时,产品团队通常会增加相关的全职专家来填补专业知识的空白,确保他们能够自己维护系统,并释放专家资源。
雷竞技是骗人的研究团队
专家和产品工程团队经常与优步的人工智能研究团队合作,雷竞技是骗人的人工智能实验室,就问题进行合作,并帮助指导未来的研究方向。雷竞技是骗人的雷竞技是骗人的研究团队通常不拥有产品代码,但他们经常与不同的团队在应用问题上密切合作。当研究人员开发出相关的新技术和工具时,平台工程团队将其集成到全公司范围的平台中,使新技术在整个公司范围内易于利用雷竞技是骗人的。
机器学习平台团队
米开朗基罗平台团队构建并运行通用ML工作流和工具集,产品工程团队直接使用这些工作流和工具集来构建、部署和操作机器学习解决方案。
随着我们的系统变得越来越复杂,我们解决的问题也越来越复杂,对额外的灵活性、可扩展性和特定领域的ML开发经验的需求也在增长。我们正在开发其他一些更特定于领域的平台,以解决米开朗基罗工作流工具无法很好地服务的专业用例。这些新的平台团队重用了大量现有的Michelangelo平台,并向产品团队交付专门的ML开发工作流。例如,正在构建的NLP和特定于计算机视觉的平台包含特殊的可视化工具、预训练的模型、元数据跟踪和其他不适合通用平台的组件。
过程
随着Uber机器学习业务的成熟,许多流程已被证明对我们团队的生产力和效率有用。共享ML最佳实践(例如,数据组织方法、实验和部署管理)和建立更结构化的流程(例如,启动评审)是指导团队和避免重复其他人错误的有价值的方法。内部集中的社区建设工作和透明的规划过程使ML团队在共同的目标下参与和协调。
发射模型
设计可靠的流程以避免常见的开发陷阱并验证预期的模型行为对于在组织中安全地扩展ML至关重要。ML系统特别容易受到意外行为、棘手的边缘情况和复杂的法律/道德/隐私问题的影响。然而,在实践中,风险概况在用例之间有很大的不同,并且需要定制的批准和启动过程。例如,启动一个使用匿名数据的ETA预测模型的自动更新比启动一个新的定价模型需要更少的隐私审查。
出于这些原因,产品组织(例如Uber Eats或Marketplace团队)围绕其ML模型拥有发布流程。这些团队根据一个集中的发布手册调整流程,以适应他们的产品领域,该手册涵盖了围绕ML模型试验和发布的一般产品、隐私、法律和道德主题。产品团队自己最了解不同模型行为的产品含义,最适合咨询相关专家来评估和消除风险。
跨ML团队协调计划
当需求超过了平台团队的路线图时,产品工程团队就会产生分支的愿望,并根据他们的需求构建自己的系统。需要注意的是,确保团队有能力解决自己的问题,同时公司也在进行良好的工程权衡,以避免碎片化和技术债务。在Uber,我们组建了一个由高级领导组成的内部小组,负责监督整个公司机器学习工具的发展,以确保我们做出明智的权衡,并保持长期的架构一致性。这在解决这些棘手和有时敏感的局势方面是非常宝贵的。
社区
在整个公司范围内扩展高质量的ML需要一个相互联系和协作的组织。
为了建立一个内部社区,我们每年都会举办一个名为UberML的内部ML会议。我们最近接待了大约500名员工和50多个团队,就他们的工作进行演讲或张贴海报。这样的活动使从业者能够交换想法,庆祝成就,并为未来的合作建立重要的联系。Uber的团队还组织社区建设活动,包括ML阅读小组、系列谈话,以及为Uber的ML爱好者提供定期的棕色午餐,以便从构建这些项目的个人那里了解我们的一些内部ML项目。
我们对社区的关注超出了我们自己的范围。我们的团队还通过会议、发表论文、贡献开源项目以及与其他公司和学术界合作进行ML项目和研究等方式与外部ML社区密切合作。雷竞技是骗人的多年来,这个社区已经发展成为一个全球性的努力,分享最佳实践,在前沿项目上合作,并总体上改善该领域的状态。
教育
对于ML团队来说,始终学习是很重要的。他们需要掌握机器学习理论的发展,跟踪内部机器学习项目并从中学习,并掌握我们机器学习工具的使用。有效地分享信息和就ml相关主题进行教育的适当渠道至关重要。
Uber ML教育在员工入职的第一周开始,在此期间,我们为所有技术员工举办ML和米开朗基罗训练营的特别课程。当米开朗基罗发布主要的新功能时,我们会为经常使用它们的员工举办特殊培训课程。关键工具和用户工作流程的文档化也有助于鼓励知识共享和平台工具的大规模采用。
公司内以ml为重点的不同小组也会安排办公时间,以便在出现问题时提供支持。这也有助于在Uber从事ML项目的人往往是天生好奇和渴望学习的人。上面提到的许多社区主导的活动都是团队成员跟上内部和外部发展的好方法。
技术
在任何ML系统的技术方面,都有无数的细节需要处理。在Uber,我们发现以下高层领域尤为重要:
-
- 端到端流程: ML不仅仅是训练模型;您需要对整个ML工作流提供支持:管理数据、训练模型、评估模型、部署模型并进行预测,以及监控预测。
- 机器学习作为软件工程:我们发现在ML开发和软件开发之间进行类比是有价值的,然后将软件开发工具和方法中的模式应用到我们的ML方法中。
- 模型开发速度:机器学习模型的开发是一个非常迭代的过程——创新和高质量的模型来自大量的实验。因此,模型开发人员的速度是至关重要的。
- 模块化和分层体系结构:提供端到端工作流对于处理最常见的ML用例很重要,但要处理不太常见和更专门的用例,重要的是拥有可以以有针对性的方式组装的基本组件。
端到端流程
早期,我们认识到,在像Uber这样的大公司,成功的机器学习需要的不仅仅是训练好的模型——你需要对整个工作流程提供强大的、可扩展的支持。我们发现同样的工作流程适用于广泛的场景,包括传统的ML和深度学习;监督学习、无监督学习和半监督学习;在线学习;批处理、在线和移动部署;还有时间序列预测。一个工具提供所有的东西并不重要(尽管我们就是这么做的),但是拥有一套能够处理工作流所有步骤的集成工具是很重要的。
管理数据
这通常是ML过程中最复杂的部分,包括在模型训练期间发生的数据访问、特征发现、选择和转换,以及在部署模型时为这些特征生成管道。在Uber,我们建立了一个功能商店,允许团队共享高质量的功能,并轻松管理这些功能的离线和在线管道,因为模型经过训练,然后进行部署,确保在线和离线版本之间的一致性。
火车模型
在Michelangelo中,用户可以使用我们的web UI或Python来训练模型数据科学工作台(DSW)下手。在DSW中,我们支持GPU集群上深度学习模型的大规模分布式训练,CPU集群上的树和线性模型,以及使用无数可用的Python工具包对大量模型进行低规模的训练。除了训练简单的模型,用户还可以组成更复杂的转换管道、集合和堆叠模型。米开朗基罗还提供可扩展的网格和随机超参数搜索,以及更有效的贝叶斯黑盒超参数搜索。
管理和评估模型
找到数据、算法和超参数的正确组合是一个实验和迭代的过程。快速有效地完成这一过程需要所有实验和结果的自动化。它还受益于良好的可视化工具,用于理解每个单独模型的性能,以及能够相互比较许多模型,以查看配置模式和提高模型性能的特征数据。在米开朗基罗管理的模型是严格管理,版本控制,完全可复制,并具有丰富的可视化模型的准确性和可解释性。
部署模型并做出预测
一旦训练了一个有效的模型,对于模型开发人员来说,能够将模型部署到登台或生产环境中是很重要的。在Michelangelo中,用户可以通过我们的web UI方便地部署模型,也可以通过我们的API与外部自动化工具集成。在部署时,将模型和相关资源打包,然后通过Thrift将其推送到脱机作业以进行预定的批处理预测,或推送到在线容器以进行实时的请求-响应预测。对于在线和离线模型,系统自动为来自特征存储的数据设置管道。
监测数据和预测
对模型进行训练,并根据历史数据进行初步评估。这意味着用户可以知道一个模型在过去工作得很好。但是,一旦你部署了模型并使用它对新数据进行预测,通常很难确保它仍然正确工作。模型会随着时间的推移而退化,因为世界总是在变化。此外,在生产模型的数据源或数据管道中可能存在损坏或错误。在这两种情况下,对生产中模型做出的预测进行监控(并发出警报)是至关重要的。我们有两种方法来监视生产中的模型。最准确的方法是记录在生产中做出的预测,然后将这些预测与我们的数据管道收集的结果结合起来;通过比较预测和实际,我们可以计算出精确的精度指标。在不容易收集结果或者我们不容易将预测与结果结合起来的情况下,第二种选择是监控特征和预测的分布,并随着时间的推移进行比较。 This is a less precise approach, but can still often detect problematic shifts in features and corresponding predictions.
机器学习作为软件工程
米开朗基罗团队研究方法的一个重要原则是思考机器学习作为软件工程.在生产环境中开发和运行ML应该像软件工程一样迭代、严格、测试和方法论。我们发现,在ML和软件开发之间进行类比,并将相应的成熟软件开发工具和方法的见解应用到ML中是非常有价值的。
例如,一旦我们认识到一个模型就像一个编译好的软件库,很明显,我们想要在一个严格的、版本控制的系统中跟踪模型的训练配置,就像版本控制库的源代码一样。跟踪用于创建模型的资产和配置是很重要的,这样以后就可以复制(和/或改进)模型。在深度学习模型中的迁移学习的情况下,我们跟踪整个谱系,以便在需要时可以重新训练每个模型。如果没有良好的控制和工具,我们已经看到模型被建立和部署,但不可能重现的情况,因为数据和/或训练配置已经丢失。
此外,为了确保软件正常工作,在软件部署之前运行全面的测试是很重要的;以同样的方式,我们总是在部署之前根据坚持集评估模型。同样,对软件系统进行良好的监控以确保它们在生产中正确工作也是很重要的;这同样适用于机器学习,您希望监视生产中的模型,因为它们的行为可能与离线评估中的行为不同。
模型开发速度
构建有效的ML系统是一门科学,需要多次迭代才能正确。迭代速度既影响ML如何在整个组织中扩展,也影响团队在任何给定问题上的生产力。米开朗基罗团队的一个高度优先级是使数据科学团队走得更快。我们走得越快,我们能做的实验就越多,我们能检验的假设就越多,我们能得到的结果就越好。
下图展示了我们如何看待标准ML开发过程以及其中不同的反馈循环。我们一直在思考这个过程,并收紧这些循环,以便更容易、更快地进行迭代和敏捷的数据科学。
米开朗基罗的“零比一的速度””或”价值的转换速度”是ML如何在优步传播的关键。对于新的用例,我们将重点放在降低入门门槛上,方法是为具有不同能力的人员微调入门工作流,并拥有一个流线型的流程,以获得一个基本模型,并在良好的默认值下运行。
对于现有项目,我们关注迭代速度,这决定了数据科学家在离线测试或在线实验中迭代和获得新模型或功能反馈的速度。
有一些原则已经被证明在帮助团队快速开发方面非常有用:
- 解决数据问题,让数据科学家不必这样做。
- 处理数据访问、集成、特性管理和管道通常会浪费数据科学家大量的时间。米开朗基罗的特征存储和特征管道对于解决许多数据科学家头疼的问题至关重要。
- 自动化或提供强大的工具来加速常见流程。
- 让部署过程快速而神奇。
- Michelangelo将在生产中部署和监控模型和数据管道的细节隐藏在UI中的一次单击之后。
- 让用户使用他们喜欢的最简单的工具——“去找客户”。
- 米开朗基罗允许在Python、笔记本电脑、cli中进行交互开发,并包括用于管理生产系统和记录的ui。
- 启用协作和重用。
- 同样,米开朗基罗的功能商店对于使团队能够重用其他团队已经确定和构建的重要预测功能至关重要。
- 引导用户完成结构化的工作流程。
面向客户:笔记本和Python
当米开朗基罗开始时,最紧急和影响最大的用例是一些非常大规模的问题,这导致我们围绕Apache Spark(用于大规模数据处理和模型训练)和Java(用于低延迟、高吞吐量的在线服务)构建。这种结构在许多模型的生产培训和部署方面工作得很好,但是在开销、灵活性和易用性方面还有很多需要改进的地方,特别是在早期的原型和实验期间。
为了提供更大的灵活性、易用性和迭代速度,我们将主要的模型构建工作流转移到Uber的DSW。DSW在一个自然的笔记本界面上提供了对Uber数据基础设施和计算资源的灵活和方便的访问。它与我们的云和预置GPU集群集成,允许在笔记本环境中快速原型化Michelangelo-ready ML模型,并轻松将这些模型保存在Michelangelo中,以便部署和扩展服务。我们正在过渡到使用DSW作为米开朗基罗的主要模型探索和原型界面。
为了在笔记本环境中支持我们一直通过UI提供的可伸缩建模,我们发布了一组库(目前是内部发布,但我们希望不久就能开源),这些库扩展了Spark,提供了一组自定义估计量,变压器,管道这些组件公开了用于批处理、流处理和基于请求/响应的评分的接口(后者在Spark的标准版本中不可用)。这些组件可以使用PySpark进行组装,然后上传到Michelangelo,以便使用我们的纯java服务系统进行部署和服务。这将Python的易用性与Spark和Java的规模结合在一起。
纯Python建模具有简单性和访问更丰富的ML生态系统和数据工具包的优势。为了解决这个问题,我们最近将米开朗基罗扩展到适用于任何类型的Python模型从任何来源获得更灵活的建模支持。用户在DSW笔记本电脑(或其他首选的Python环境)中构建模型,然后使用Michelangelo PyML SDK打包并将模型和依赖项上传到Michelangelo进行存储、部署和服务(包括批处理和在线)。
深度学习模型的开发工作流通常与其他机器学习开发工作流有不同的需求。开发人员通常编写更详细的训练代码,并需要专门的计算资源(gpu)。在过去的一年里,我们一直致力于使这一过程更加顺畅和快速。
米开朗基罗现在有了很好的工具,可以在Uber自己的数据中心和各种公共云中的不同GPU机器上提供和运行培训作业。生产TensorFlow模型是由我们现有的大规模Michelangelo模型服务基础设施提供的(现在与TensorFlow服务)或我们的PyML系统.我们有专门的工具来帮助建模师跟踪他们的实验和开发,但一旦一个模型被保存在米开朗基罗,它就像系统中的其他模型一样被对待。
使用AutoTune加速模型开发
AutoTune是Uber新推出的通用优化即服务工具。它已被集成到Michelangelo中,允许建模者轻松使用最先进的黑盒贝叶斯优化算法,更有效地搜索超参数的最优集。它是一个新的推荐的替代方案,而不是我们迄今为止在米开朗基罗中提供的不那么复杂的搜索算法。这意味着在相同的训练时间或更少的训练时间内获得更精确的模型,从而获得高质量的模型。
模块化和分层产品
我们在开发Michelangelo时发现的一个矛盾是,在为最常见的ML工作流提供端到端支持的同时,还提供支持不太常见的工作流的灵活性。
最初,我们的平台和基础设施组件被合并到一个系统中。随着我们的系统变得更加复杂,我们要解决的问题变得更加多样和复杂,对额外的灵活性、可扩展性和特定领域的开发经验的需求也在增长,这超出了单一平台所能提供的范围。
我们能够通过桥接团队解决其中的一些问题,如上所述。但有些团队希望将米开朗基罗的部分作品与他们自己的组件混合搭配,形成新的工作流程。其他团队需要专门的用例开发工具,但从头开始构建这些工具没有意义。我们对Michelangelo架构进行了一些重大更改,以尽可能地利用我们现有的系统,同时随着ML在整个公司的成熟而不断增长的需求而发展:
我们还发现,对于某些问题领域,专门的开发经验是有用的。这可以像应用和评估预测模型的预构建工作流一样简单,也可以是更定制的东西,比如为特定的计算机视觉应用程序构建的交互式学习和标记工具。我们希望通过允许平台开发人员利用米开朗基罗的底层基础设施来支持所有这些用例。
为了解决这些问题,我们正在将米开朗基罗的基础设施分解为一个明确的基础设施层,并使该基础设施可供团队利用,以构建更专业的平台,例如用于NLP或Vision。一旦完成,我们将有两个客户群体:使用Michelangelo平台来构建和部署模型的模型构建者,以及使用Michelangelo基础设施组件来构建定制解决方案或更专业平台的ML系统构建者。
主要经验教训
在过去的三年里,我们建立了米开朗基罗,并帮助在优步扩展机器学习,我们从成功和失败中学到了很多。在某些情况下,我们第一次就把事情做对了,但更常见的情况是,需要几次迭代才能发现最适合我们的方法。
- 让开发人员使用他们想要的工具。在这个领域,我们花了好几年的时间才找到正确的方法。当我们创建米开朗基罗时,我们首先关注的是最大规模的用例,因为这是我们可以产生最大影响的地方。虽然早期对Scala、配置和基于ui的工作流的关注使我们能够支持高规模的用例,但它使我们远离了模型开发人员已经熟练掌握的成熟的、记录良好的编程接口。由于建模工作是非常迭代的,因此关注开发人员的速度(因此快速迭代周期)以及高可伸缩性变得非常重要。我们已经找到了一个混合解决方案,我们提供了一个高规模的选项,有点难使用,和一个低规模的系统,非常容易使用。
- 数据是ML中最难的部分,也是最重要的部分。建模师在训练时花大部分时间选择和转换功能,然后构建管道以将这些功能交付到生产模型。在生产ML系统中,损坏的数据是最常见的问题原因。在Uber,我们的功能商店通过允许建模师轻松地共享高质量的功能,自动部署这些功能的生产管道,并随着时间的推移进行监控,解决了许多这些问题。一旦特征被定义,我们还可以利用Uber的数据质量监控工具来确保特征数据随着时间的推移是正确的。
- 要使开源组件和商业组件大规模地良好工作,可能需要付出巨大的努力。Apache Spark和Cassandra都是流行且成熟的开源项目;然而,在每个案例中,都花费了一年多的持续努力,才能使它们在优步的规模下可靠地运行。我们在早期尝试并最终放弃的商业工具包中也遇到了类似的挑战。
- 基于用户反馈进行迭代开发,并牢记长期愿景。在开发米开朗基罗的过程中,我们几乎总是与客户团队密切合作,开发新功能。我们将首先为一个团队很好地解决问题,一旦它成功地在生产中运行,我们将推广到公司的其他部门。这个过程确保了我们构建的解决方案被实际使用。这也有助于保持团队的参与和领导的支持,因为他们看到了稳定的影响。与此同时,为用户可能看不到的长期赌注预留一些时间也很重要。例如,我们在真正有需求之前就开始研究深度学习工具;如果我们再等,就太晚了。
- 实时ML是一个挑战。大多数现有的数据工具都是为离线ETL或在线流媒体而构建的。目前还没有伟大的工具!-解决实时ML系统所需的混合在线/离线功能(批处理、流式处理和RPC)。作为Uber特色商店的一部分,这仍然是我们关注的一个大领域。
旅程才刚刚开始,还有很多事情要做。这是一个不断发展的领域,将会有更多的经验教训需要学习。如果你对解决机器学习挑战感兴趣,可以考虑申请一个角色在我们队!
Jeremy Hermann和Mike Del Balso是Uber机器学习平台团队的工程和产品经理。







