文/Danilo Sato、Arif Wider、Christoph Windheuser
译/白发川、沈建军、王登宇
机器学习在行业中的应用变得越来越流行,然而相对于传统软件开发,例如Web服务或者Mobile应用来说,这类程序的开发、部署和持续改进也变得更加的复杂。它们的功能改变通常由以下三个维度驱动:
- 代码本身的修改
- 模型的修改
- 数据的改变
这类程序的表现行为通常是非常复杂、难以预测、难以测试、不具备可解释性、很难去改进的。机器学习下的持续交付(CD4ML)是开发机器学习应用时可以遵循、参照的原则和最佳实践。
前言简介
在 Google 2015年发出的著名论文《机器学习系统中隐藏的技术债》中,重点突出了在实际的机器学习系统中,机器学习的代码在系统中只占了很小的比重,周边有非常多的基础设施和流程来支持系统的演进,同时也提到了这种不断被积累下来的技术债的多种来源,其中有些技术债的来源与数据的依赖关系、模型的复杂度、可再现性、测试、监控和外部响应变化有着非常大的联系。
传统软件开发系统流程也存在许多人们同样关心的问题,而持续交付一直以来用自动化、高质量和规律性的方法,在生产环境中实践这种可靠且可复现的软件开发方式。在他们的创造性著作中,Jez Humble 和 David Farley 强调:
“持续交付具有改变一切的可能性——包括新的特性,可控制的改变,各种BUG的修复以及实验项目——为了生产环境,或者说是为了用户,能够以一种可持续的软件开发方式快速安全的构建项目。”
除了代码外,对ML模型的改变以及训练它们使用的数据是另一种需要我们去管理和融入软件交付流程的改变(图1)。
(图1:三个维度的改变对ML应用的影响——数据、模型和代码——以及一些它们影响改变的原因)
顺着这个思路,我们可以扩展持续交付的定义,以此来包含存在于现实世界ML系统中的新元素和挑战,一种我们称之为“机器学习下的持续交付(CD4ML)的方法”。
机器学习下的持续交付(CD4ML)是一种可以在短期适应周期中随时再现和可靠地发布的软件工程方法,其中由跨职能团队以小而安全的增量生成基于代码、数据和模型的机器学习应用程序。
这个定义包含了以下这些基本原则:
- **软件工程的方法:**它使得团队能够高效高质量的完成软件开发。
- **具有跨职能的团队:**在数据工程、数据科学、机器学习工程开发、运营和其他知识领域拥有不同技能和工作流程的专家们在一起协同工作,这里强调每个团队成员的技能和优势。
- **基于代码、数据和机器学习模型的软件开发:**ML软件生产过程的所有组件都需要不同的工具和工作流程,我们必须对其进行版本控制和管理。
- **微小且安全的增量:**对软件每个组件的发行都分为微小的小步增量,使得在每个不同的输出环节都可视可控,这样做在整个流程上增加了安全性。
- **可复现的且可靠的软件版本发行:**发行ML软件的整个流程是可再现且可靠的,这需要我们尽可能的利用自动化。
- **软件随时发布:**ML软件能够随时被投入生产环境是非常重要的。即使组织没有想要随时发布软件,但是它也应该一直保持一种可发布的状态。这使得发行的决定更容易首商业的影响而不是技术上的影响。
- **短暂的适应周期:**短暂的周期意味着开发时间只有天或者小时,而并不是周或者年为单位。所以自动化的流程和高质量的构建是达成这些的关键。这样也将创建一个反馈循环,允许你通过学习其在生产环境的行为来调整你自己的模型。
这篇文章将讲述在实现CD4ML时我们发现的重要技术组件,我们使用一个ML样例应用来解释概念,同时演示怎样把不同的工具放在一起来使用进而实现一个完整的端到端的流程。在合适的情景下,我们将会突出我们所选择的可代替的工具。也将使用我们在行业上的成熟实践经验来讨论未来的开发和研究的领域。
一个对销售进行预测的机器学习应用
自从2016年以来,我们就已经开始思考如何将持续集成带到机器学习领域。之前我们已经发布和介绍过了我们的一个客户项目,一个使用了AutoScout构建的用来预测在他们自己平台上发布汽车价格的项目。
由于我们无法使用真实的客户项目上的代码作为示例,所以我们决定构建一个基于公共问题和数据的样例ML应用来说明CD4ML的实现过程。这个应用解决了一个许多零售商都会遇见的共同问题:试图使用历史销售数据来预测未来某种商品的销售量。我们为一家大型的厄瓜多尔杂货零售商Favorita公司在Kaggle上创建的问题构建了一个简单的解决方案。为了我们的目的,我们已经组合和简化了他们的数据,因为我们的目标不是找到最佳的预测————这种工作最好交给你的数据科学家————而是演示怎样实现CD4ML。
用一种监督学习算法和Python流行的scikit-learn库,我们使用标注好的数据训练了预测模型,并且将这个模型整合到一个已经被部署到云端的简单web应用中。图2展示了整个大致的流程。
(图2:训练我们的ML模型的初始化过程,整合它到一个web应用,最后将它部署到生产环境中。)
一旦我们部署了,我们的web应用(图3)会允许用户去选择一个想要预测的产品和日期,然后这个模型将会预测输出在那天将会卖出多少产品。
(图3:演示我们的模型的工作的web UI)
共同的挑战
实现这个端到端的流程已经能够遇见两个挑战了,不过同时对于我们的讨论来说也是一个好的起点。第一个挑战来自于我们的组织架构:不同的团队或许拥有不同部分的工作流程,这就会存在一个工作交接的问题————通常来说,“扔过墙(打破障碍)”——并没有明切的目标去指导它们如何直接跨越这个界限(图4)。数据工程师或许正在搭建pipelines来使得他人可以获取数据,与此同时,数据科学家正在关心ML模型的构建和改进。然后机器学习工程师或者开发者在关注怎样去把模型整合