MLOps实践:机器学习从开发到生产
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前 言

毫无疑问,在过去的几年里,机器学习(ML)[1]正在逐渐发展成为当今商业和软件工程领域的热门名词,由ML驱动的应用呈爆发式增长,如推荐系统、精准营销、广告系统等。市面上ML方面的图书和文章也越来越多,细心的读者会发现ML相关图书多集中在不同机器学习算法的原理、算法是如何工作的及如何通过数据进行模型训练等方面的理论和实践上,而对于如何构建由ML驱动实际应用的项目工程方面,如数据收集、存储,模型部署、管理及监控运维等方面的书却很少见,这些方面没有得到足够的重视。在企业应用中,除了一线科技巨头公司,也很少看到针对商业问题部署和管理ML的解决方案,而这部分正是本书试图去介绍和实践的内容——MLOps(机器学习运维的简称)。

为了成功地给用户提供ML产品,数据科学家需要做的不仅是简单地训练一个模型,还需要将产品需求转化为ML的问题来思考,并为此不断地收集数据,在模型之间进行有效迭代,在生产中验证模型,并以稳健的方式部署和管理它们。有过ML生产经验的读者能够体会到,学术环境中工作的算法及模型和现实生产系统所需的条件之间存在着显著的差异。在生产过程中,除了需要关注建模时基于的模型假设在现实中的真实表现,还需要关注性能瓶颈及后期模型更新迭代等一系列问题。本书中介绍的概念、技术、工具、框架和方法论都将告诉我们如何面向生产来思考、设计、构建和执行ML项目,进而实现整个ML生产化流水线的最佳实践。

如果你是一名数据科学家或ML工程师,在阅读本书时可能会质疑:“我为什么要关心MLOps?我已经把模型做出来了,线下测试效果都很好,把它们带到生产中不是IT团队的工作吗?”这对于拥有独立IT/数据科学或算法部门的一、二线科技公司来说,你的质疑是没错的,但对于大多数刚开始接触数据科学和ML的公司来说,实际情况是设计算法、训练模型的人也将是部署模型和管理模型的人,而这两部分工作的关注点、知识结构及使用的工具都很不同,数据科学家需要关注数据质量、特征工程、模型的设计与训练等,而部署模型的人更多关注的是工程问题,如服务化、并发、低延时、监控、模型零停机更新、可扩展性等,其中困难之一在于人才的稀缺。即使这些公司能够聘请有才华的ML工程师和数据科学家,在2020年,大多数企业仍然需要花费31~90天的时间来部署一个模型,而18%的公司花费的时间超过了90天,有些公司甚至花费了一年多的时间来实现生产化。

企业在开发ML项目时面临的主要挑战,如模型版本控制、可重复性和扩展性,与其说是工程性的,不如说是科学性的,这使得具备良好MLOps知识和工程化经验变得非常重要和宝贵。

值得庆幸的是,我们可以借鉴软件工程领域DevOps已有的成熟的实践经验和教训。在添加数据和模型元素后,MLOps也将成为ML领域的关键突破。这是一种“机器学习”与“运维”相结合的解决方案,简单地说,就是数据科学家、研发人员和平台工程师之间的协作和沟通实践,可以优化和加速ML项目的生产生命周期。

实践MLOps意味着遵循标准化和流程化路径来自动化运行和监控ML部署工作流程的所有步骤,包括数据和基础设施管理、模型学习、测试、集成、部署、发布和实时监控。与软件开发一样,MLOps需要一套工具和框架生态系统,将ML项目过程标准化,为数据科学家与其他项目成员创建一个协作环境,这是一种缩短将模型全面投入生产所需时间的解决方案。

虽然越来越多的ML从业者开始意识到MLOps的必要性,但出于多种原因,MLOps可能很难在业内迅速普及和应用。

● 这仍然是一个相对较新的领域,市面上还没有大量的学习资源和实践案例。

● 不同于DevOps,这一领域的技术非常复杂且应用广泛,涵盖了ML模型的整个生命周期,从数据到实验、训练、模型管理、服务和监控等,这意味着从何处开始及如何将各个部分组成一个连贯的整体成为一个巨大的挑战。

● 这一领域所需的技能和经验范围同样广泛,这意味着需要对各个领域都有实战经验的“全栈工程师”来推进MLOps的实践,这类人才在一线科技巨头公司之外的公司内并不常见。

笔者在算法领域工作有十多个年头,经历过算法模型在生产化时遇到的各种让人头痛的工程问题,也曾经自行研发和带领团队开发过多个不同侧重点的算法平台来试图解决这些问题。近几年,笔者也在更具覆盖性和迭代性的MLOps领域获得了丰富的实践和落地经验。笔者期望能把自己的实践经验分享给同样在经历“ML生产化痛苦”的同行,这也是写作本书的初衷。

读者对象

本书的读者对象包括那些希望生产化ML项目,为企业提升生产力并改善业务状况的数据科学家、ML算法工程师、分析师、ML软件架构师、ML产品负责人或ML项目经理,以及希望使用MLOps原则和技术在生产中构建、部署和维护ML系统的商业和技术领导者。本书假设读者对ML的基本概念和编程比较熟悉,笔者将主要使用Python语言进行技术举例,并假设读者熟悉其语法和编程。如果你具备一定的编程经验和一些基础的ML知识,并想构建由ML驱动的产品,那么本书将会为你提供从产品创意到生产的整个过程的实战参考;如果你是一名ML产品经理,不懂代码,建议你与数据科学家合作,这样可以跳过一些代码示例,从而理解ML从开发到生产化的过程。

本书特色

本书的重点聚焦在工程化阶段,不会使用编程语言从零开始实现算法,而是通过使用更高层次抽象的库和工具来保持ML项目生命周期的实用性和技术性。笔者将首先构建一个简单的端到端的ML应用实例,以ML项目生命周期为主线,通过逐步增加MLOps功能(组件)的方法,最终呈现MLOps的全貌。

在本书中,为体现实践性和实用性,笔者会使用代码片段来说明一些关键概念和流程。学习ML最好的方法是通过实践来学习,所以笔者也鼓励读者通过本书中的例子,领会实践思路,来构建你自己的用ML驱动的应用程序。

此外,本书是对ML工程实践和设计的全面回顾,对于ML工程经验丰富的读者,你可以按照任何顺序阅读本书各章节,因为它们涵盖了MLOps框架中涉及的不同方面,而且没有直接的依赖关系。对于刚入行的读者,建议按照本书章节顺序阅读,这可以帮助你理解MLOps框架的搭建思路。

本书的整体结构

本书的整体结构可以分为三个部分,其中第一部分是第1~3章,为MLOps框架的实现做了前期准备,该部分主要介绍MLOps框架下ML项目涉及的基础内容及实现MLOps时需要准备的事项。第二部分是第4~8章,是MLOps框架实现的主体部分,该部分通过将实验环境下创建的模型逐步升级至投产所需的功能和能力来展现MLOps从0到1的搭建过程。最后一部分是第9章,该部分对市面上一些相对成熟的MLOps产品进行了对比和总结,并给出了MLOps的一些设计原则与成熟度评估标准以供参考。

第1章 MLOps概述

本章介绍MLOps涉及的基础概念,希望在后续章节用到这些概念的时候大家能拥有共同的理解。另外,本章也简单提到了MLOps框架下的工程化实践所涉及的内容,及其对ML模型真正投入生产时应起到的关键作用。

第2章 在MLOps框架下开展ML项目

本章介绍在MLOps框架下开展ML项目需要了解的基础知识,包括业务范围的界定、研究与探索阶段需要达成的目标、模型开发阶段需要注意的细节,以及在ML项目中,团队需要哪些角色及团队的分工等。

第3章 MLOps的基础准备:模型开发

本章以流失模型为例,展示了常规的业务目标的定义、ML目标的确定、数据处理、特征工程及模型创建的过程。这也是我们常见的在研究阶段做的事情。后面章节从生产的视角,在此基础上逐步增加功能模块,这个逐步升级的过程也可以看成MLOps的搭建过程。

第4章 ML与Ops之间的信息存储与传递机制

本章介绍在ML模型开发与生产之间创建信息传递的机制,该机制将使得ML项目的生命周期更加完整和可管理。在MLOps框架里,ML(模型开发)与Ops(生产)是相对独立的两个过程,这也导致这两个过程之间缺乏传递信息的机制。信息存储与传递机制的建立主要是通过中心化的ML实验跟踪、A/B在线实验、ML模型注册、特征存储等组件来实现的,本章主要围绕这几个组件的设计和实现来搭建MLOps底层的信息“地基”。

第5章 模型统一接口设计及模型打包

本章介绍将实验阶段创建的模型、模型代码及依赖的数据进行标准接口创建的方案。在创建软件时,编写抽象类来帮助定义类可以实现和继承不同接口,这通常是很有用的。通过创建一个基类(接口),可以定义一个标准,简化整个系统的设计,明确每个方法的功能和边界。这样做有利于推理服务的快速生成,方便客户端的调用和使用方的理解,对于后期模型的运维也是有益的。此外,模型的打包是从实验环境向其他环境迁移的必要步骤,也是本章介绍的内容之一。

第6章 在MLOps框架下规模化部署模型

本章介绍如何将实验阶段的ML模型规模化部署到MLOps框架内,通过模型即服务的设计来实现ML模型和将代码自动部署为Docker镜像,自动生成统一的推理服务,并将模型工件提交至中央存储。每个模型都遵循同样的操作方式,进而实现部署的规模化,并在第4章实现的模型注册和中心化存储的基础上实现规模化的管理。

第7章 MLOps框架下的模型发布及零停机模型更新

本章介绍模型部署和发布的关系,从风险控制的角度考虑,将模型部署到生产环境时不会立即接收用户流量,而是要在选择发布策略并进行局部测试后,没有发现问题的情况下,再逐步替换旧版本的模型,以接收全部用户产生的流量。此外,对于模型需要频繁更新的场景,如新闻、电商类的线上推荐,需要实现零停机模型更新机制,避免手动操作影响系统的稳定性。

第8章 MLOps框架下的模型监控与运维

本章介绍ML项目生命周期的最后一个环节,即模型的监控和运维,主要是为解决模型衰退、模型持续训练的触发问题而设立的。通过设计实时识别数据漂移、概念漂移、模型错误、推理服务性能和推理服务健康度等指标,以及记录相关日志信息,来监控模型的性能和服务的健康度,以保证模型在生产中是安全的、健康的和“新鲜的”。

第9章 对MLOps的一些实践经验总结

本章介绍市面上一些成熟的MLOps产品与开源框架的功能,以及各自聚焦的领域,并给出MLOps架构成熟度评估标准,方便开发者依据自己的业务场景进行相应的判断与扩充,并分享了一些笔者在MLOps实践中总结的经验和搭建原则,供读者参考。


[1]ML,Machine Learning的简称,如无特殊说明,本书中的ML均代指机器学习。