推荐序
在始于18世纪60年代的工业革命期间,物理机器的兴起要求组织系统化,形成了工厂、装配线及我们所知道的关于自动化制造的一切,最后实现了以大规模工厂化生产取代个体手工生产的一场生产与科技革命。
类似地,伴随着互联网、移动互联网的浪潮,软件工程也经历了从传统的手工开发运维向敏捷开发的过渡,敏捷系统帮助企业实现了产品生命周期的可运维性,通过减少资源浪费和开发过程的自动化,为持续创新铺平了道路,DevOps也进一步优化了软件生产的生命周期。
这波互联网、移动互联网的浪潮同时催生了人工智能的应用,在全球范围内,人工智能正在作为全新的生产要素加速助力产业转型升级,具体的表现形式为,机器学习(ML)从学术研究领域逐渐移步现实世界中真正的应用领域。这种变化给软件工程带来了更大的挑战,因为相对于传统的软件工程,它引入了新的要素,即数据。而且,ML在学术环境中的工作方式与实际场景生产环境配置的要求之间存在差距和差异。具体的挑战体现在以下两个层面。
(1)依赖层面
通常,我们开发的ML模型依赖于几个要素,如数据、算法和/或参数。在实验过程中,这些要素会随着时间的推移而改变,从而生成不同的版本。不同的版本会导致不同的模型行为,通过特定版本的数据、算法和参数会生成特定的模型。ML项目中拥有多个版本的数据、算法、参数,但没有特定的策略来处理不同的版本,这可能会使我们失去对ML系统的控制。创建数据和参数的版本镜像可以帮助我们跟踪不同的版本,但是版本控制有其自身的成本,例如,随着时间的推移而需要维护多个版本。
传统的软件系统采用模块化设计来维护整个系统,你可以改变一个部分而不干扰其他部分。与传统的软件系统相比,ML系统的组件之间没有如此清晰的界限。ML管道使用数据版本、算法版本和/或不同的参数,前面提到的这些要素的任何更改都会触发新的模型版本的生成。
(2)管理层面
通常生产环境中的ML系统的目标是同时运行和维护数十个或数百个模型,而这会带来管理上的挑战。例如,如何监控模型的整个生产管道?如何更新或分配模型的资源配置?
为了自动化和加速ML生命周期管理,我们需要一个策略或工作流来帮助我们持续跟踪数据、参数、超参数及实验结果等。在某种程度上,它有助于实现更好的管理和协作,因为手动记录实验过程的效率不高且容易出错。
庆幸的是,近几年MLOps开始走进数据科学家的视野,我们也越来越频繁地听到MLOps这个词,这是一个将类似DevOps的实践带入ML领域的概念,是专注于高效且可靠地进行ML模型的规模化开发、部署、管理和运维的过程,以优化和扩展工业环境中的ML生命周期,同时保证ML项目的可重复性和可追溯性。MLOps的实践弥合了开发(学术环境)和运维(生产环境)之间的差距,使运行ML系统的不同团队之间能够更好地协作和沟通。MLOps正在成为企业在现实世界中利用ML优势的必要技能或必经实践。
令人遗憾的是,现在并没有很多资源可以告诉工程师和科学家如何构建可投产的ML模型。市面上的很多书和课程会介绍如何训练ML模型或如何构建软件项目,但很少有书和课程将这两个世界融合起来,介绍如何构建由ML驱动的实际应用。而本书讲解了ML驱动实际应用时所经历的每一步,旨在通过分享笔者和其他有经验的从业者的方法、代码实例和建议,帮助读者完成ML项目的投产(这也是MLOps的核心目标)。本书中的内容将涵盖由ML驱动的应用程序(业务)所需的设计、构建、部署和运维等实用技能,读者可以通过学习本书的内容来践行符合自己业务的MLOps实践,以加快ML项目的交付,减少ML项目所需的劳动力,例如一些人工工作,如手动训练和重新训练模型、跟踪实验结果、手动发布和部署模型等。
如果我们把MLOps集成到ML的开发过程中,那么无须在数据科学家和运维团队之间来回折腾就可以实现更快的模型部署和优化周期,而且在向生产环境添加新模型或更新现有模型时也无须付出巨大的努力。
MLOps可以分为多种实践:自动化基础架构构建,数据科学实验,模型重要部分的版本控制、部署(打包、持续集成和持续部署)、安全和监控。
将MLOps方式带入ML模型开发中,可以确保将模型真正投入生产,使模型部署周期更快、更可靠,减少手动工作和不必要的错误,并将数据科学家的时间从不能体现他们核心能力的工程任务中解放出来。
如果你的ML之旅仍处于早期阶段(如概念验证阶段),那么可以将ML模型的开发方式转变为MLOps方式,MLOps方式能够避免繁重的流程。在MLOps方式或框架下工作,通过将开发工作转移到版本控制上,可以自动执行重新训练和部署的步骤。虽然在这个阶段中强大的开发框架和管道基础设施可能不是最高优先级的,但是早期阶段在自动化开发过程中付出的任何努力都将在以后得到回报,并从长远来看可以有效地减少ML“技术债”。这也是本书希望传达给读者的实践MLOps的有效方式。
刘中华
哈佛大学统计学博士,香港大学博士生导师