究竟什么是MLOps?
这个问题存在了很久,但直到现在,都仅仅只在大型人工智能会议上有几次提及,很少有具体的描述,国内的应用更是尚浅。
如今,科技公司在将机器学习模型商业化落地时所面临的痛点大致有:
- 迁移到云端;
- 创建和管理机器学习工作流;
- 规模化;
- 大规模处理敏感数据;
- 以及大概还有非常多的其他问题。
而这篇文章就是解决这些痛点的答案。
如果我们真的想让模型真正触及现实生活中的商业问题和真实的人,我们必须处理以下要点:
- 获取和清理大量数据;
- 跟踪和迭代实验和模型训练;
- 为投入生产的模型设置部署和监控工作流程。
并且我们需要找到一种方法来扩展我们的机器学习操作以满足业务或机器学习模型用户的需求。
过去,当我们需要扩展传统软件系统以便更多人可以使用它们时,也存在类似的问题。 DevOps的解决方案是一套用于开发、测试、部署和操作大型软件系统的实践,借助DevOps,开发周期变得更短,部署速度加快,系统发布变得可审计且可靠。
这为我们引向了MLOps,它诞生于DevOps、数据工程以及机器学习的交叉融合,与DevOps的概念相似,但执行方式不同。机器学习系统本质上是实验性的,并且具有更多的组件,这些组件的构建和操作显然要复杂得多。
下面就让我们开始吧!
什么是MLOps?
MLOps是用于数据科学家和专业运维人员之间协作和交流的一系列实践。应用这些实践可以提高质量,简化管理流程,并在大规模生产环境中自动部署机器学习和深度学习模型,更容易使模型与业务需求以及监管要求保持一致。
MLOps正在慢慢演变成一种独立的机器学习生命周期管理方法,它适用于整个生命周期——数据收集、模型创建(软件开发生命周期、持续集成/持续交付)、编排、部署、健康、诊断、治理和业务指标。
MLOps的关键阶段是:
- 数据收集
- 数据分析
- 数据转换/准备
- 模型训练与开发
- 模型验证
- 模型服务
- 模型监控
- 模型再训练
DevOps vs MLOps
DevOps和MLOps具有基本的相似之处,因为MLOps源自DevOps,但它们在执行上完全不同:
- 与DevOps不同,MLOps在本质上更具实验性。数据科学家和机器学习/深度学习工程师必须调整各种功能——超参数、参数和模型——同时还要跟踪和管理数据和代码库以获得可重复的结果。除了所有的努力和工具之外,机器学习和深度学习行业仍然在为实验的可重复性而苦苦挣扎。
- 混合团队组成:在生产环境中,构建和部署模型所需的团队不仅仅由软件工程师组成。在机器学习项目中,团队通常包括数据科学家或机器学习研究人员,他们专注于探索数据分析、模型开发和实验,他们可能不是可以构建生产级服务的经验丰富的软件工程师。
- 测试:除了单元测试和集成测试等常规代码测试之外,测试机器学习系统还涉及模型验证、模型训练等。
- 自动部署:为了提供模型在线预测的服务,您不能只将离线训练的机器学习模型部署。您需要一个多步骤工作流来自动重新训练和部署模型。这个工作流增加了复杂性,因为您需要自动化数据科学家在部署之前手动执行的步骤来训练和验证新模型。
- 由于数据配置文件的不断发展或简单的训练和服务偏差导致系统的生产性能下降:生产中的机器学习模型可能会降低性能,这不仅是由于编程实现未达到最优,还因为数据配置文件的不断发展。与传统软件系统相比,模型可能会以更多方式衰减。这可能由以下原因引起:
- 您在训练和服务工作流中处理数据的方式存在差异。
- 在您训练和服务时,数据发生了变化。
- 反馈循环——当您选择错误的假设(即目标)进行优化时,这会使您收集到有偏的数据来训练您的模型。接着,在不知情的情况下,您使用的这个有缺陷的假设又将收集新的数据点,并将其反馈到重新训练/微调模型的未来版本,使模型的偏差更大,并且滚雪球式增长。
- 监控:生产中的模型需要被监控。同理,构建模型的数据的汇总统计信息也需要被监控,以便您可以在需要时刷新模型。这些统计数据会随着时间而改变,当值偏离预期时,您需要通知或回滚过程。
虽然在源代码管理的持续集成、单元测试、集成测试以及软件模块或包的持续交付方面,MLOps和DevOps是相似的,但是,二者在机器学习上存在一些显著差异:
- 持续集成 (CI) 不再只是测试和验证代码和组件,还包括测试和验证数据、数据模式和模型。
- 持续部署 (CD) 不再是关于单个软件包或服务,而应该是一个系统(一个机器学习模型训练的流程),可以自动部署另一个服务(模型预测服务)或从某个模型回滚更改。
- 连续测试 (CT) 是机器学习系统独有的新属性,它与自动重新训练和服务模型有关。
MLOps vs实验跟踪 vs 机器学习模型管理
我们已经定义了MLOps是什么,那么什么是实验跟踪和机器学习模型管理呢?
实验跟踪
实验跟踪是MLOps的一部分(或一个过程),专注于收集、组织和跟踪不同模型结构(超参数、模型大小、数据拆分、参数等)下多次运行的训练信息。
如前所述,由于机器学习/深度学习本质上是实验性的,因此我们使用实验跟踪工具对不同公司、团队或团队成员创建的不同模型进行基准测试。
模型管理
为确保机器学习模型一致并大规模满足所有业务需求,一个合乎逻辑且易于遵循的模型管理策略至关重要。
MLOps方法包括简化模型训练、打包、验证、部署和监控的过程,通过这种方式,您可以始终端到端地运行机器学习项目。
通过为模型管理设置清晰、一致的方法后,组织可以:
- 主动解决常见的业务问题(例如合规性);
- 通过跟踪数据、模型、代码和模型版本以支持可复现的模型;
- 用可重复的配置打包和交付模型,以支持可复用性。
为什么MLOps很重要?
MLOps是基础。机器学习可帮助个人和企业部署解决方案,通过创建更高效的工作流程、利用数据分析进行决策和改善客户体验来解锁以前未开发的收入来源、节省时间并降低成本。
如果没有一个可靠的框架可以遵循,这些目标则很难实现。使用MLOps自动化模型开发和部署,可以使产品进入时间更快、运营成本更低,它可以帮助管理人员和开发人员在决策中更具灵活性和战略性。
无论有什么限制,不管是敏感数据、资源少、预算少等等,MLOps可作为地图,指引个人、小型团队甚至企业实现目标。
您可以决定您希望的地图大小,因为MLOps具有灵活性的实践,您可以尝试不同的设置,来找到最适合您的设置。
MLOps最佳实践
以下涵盖了机器学习工作流程不同组件的最佳实践,即:团队、数据、目标、模型、代码和部署。
团队(以下蓝色为链接)
- 使用协作开发平台
- 竭力避免积压工作与他人沟通、协调和协作
数据
- 对所有外部数据源使用完整性检查
- 跟踪、识别和说明数据源的变化
- 为数据清理和合并,编写可复用的脚本
- 组合和修改现有功能,以人类可理解的方式创建新功能
- 确保在严格控制的过程中执行数据标注
- 使数据集在共享基础设施(私有或公共)上可用
目标(指标和 KPI)
- 不要过度考虑选择直接优化哪个目标,首先要跟踪多个指标
- 为您的第一个目标选择一个简单、可观察且可归因的指标
- 设定治理目标
- 执行公平和隐私
模型
- 保持第一个模型简单并获得正确的基础架构
- 从可解释的模型开始调试更容易
- 训练
- 以易于衡量和理解的指标捕获训练目标
- 主动删除或存档未使用的功能
- 同行评审训练脚本
- 启用并行训练实验
- 自动化超参数优化
- 持续测量模型质量和性能
- 对数据、模型、配置和训练脚本使用版本控制
代码
- 运行自动的回归测试
- 使用静态分析检查代码质量
- 使用持续集成
部署
- 计划启动和迭代
- 自动化模型部署
- 持续监控已部署模型的行为
- 为生产模型启用自动回滚
- 当性能停滞不前时,寻找质量上新的信息来源来添加而不是改进现有信号
- 启用影子部署
- 保持集成简单
- 使用模型版本、代码版本和输入数据进行日志生产预测
- 系统和训练偏差的人工分析
- 您不是典型的最终用户
- 测量模型之间的增量
- 在选择模型时,实用性能胜过预测能力
- 执行不断变化的数据配置文件检查
- 如果您基于 1 月 5 日之前的数据生成模型,请根据 1 月 6 日及之后的数据测试模型
这些最佳实践将作为您构建MLOps解决方案的基础,也就是说,我们现在可以深入研究实施细节。
如何实现MLOps
有3种方法可以实现MLOps:
- 0级MLOps(手动处理)
- 1级MLOps(机器学习流程自动化)
- 2级MLOps(持续集成与持续部署流程自动化)
0级MLOps
这对于刚开始使用机器学习的公司来说很典型,如果您的模型很少更改或训练,则完全手动的机器学习工作流程和数据科学家驱动的流程可能就足够了。
特点
- 手动、脚本驱动、交互过程:每一步都是手动的,包括数据分析、数据准备、模型训练和验证,它需要手动执行每个步骤并从一个步骤手动转换到另一个步骤。
- 机器学习与运维之间的脱节:该过程将创建模型的数据科学家与使用模型提供预测服务的工程师分离。数据科学家给出经过训练的模型,工程团队在其API基础架构上进行部署。
- 发布迭代不频繁:假设您的数据科学团队管理着一些不经常更改的模型(模型更改的情况有:要么更改模型实现,要么使用新数据重新训练模型)。一个新模型版本每年仅部署几次。
- 没有持续集成(CI):假设很少有更改,因此就忽略了持续集成。通常,测试代码是笔记本或脚本执行的一部分。
- 没有持续部署(CD):因为没有频繁的模型版本部署,所以不考虑持续部署。
- 部署是指预测服务(即带有REST API的微服务)
- 缺乏主动性能监控:流程不跟踪或不记录模型的预测和操作。
工程团队可能有自己复杂的API配置、测试和部署设置,包括安全性、回归,以及负载和金丝雀测试。
挑战
在实践中,模型在现实世界中部署时经常会崩溃,因为模型无法适应环境动态的变化或描述环境数据的变化。福布斯对此有一篇很棒的文章:为什么机器学习模型在生产中崩溃。
为了解决这个手动过程的挑战,最好将MLOps实践用于持续集成与持续部署和持续训练。通过部署机器学习训练流程,您可以启用持续训练,并且您可以设置持续集成与持续部署系统来快速测试、构建和部署机器学习流程的新实现。
1级MLOps
1级MLOps的目标是通过自动化机器学习流程来执行模型的持续训练。这样,您就可以实现模型预测服务的持续交付。
对于在不断变化的环境中运行并需要主动应对客户行为、价格和其他指标的变化的解决方案,这种情况可能会有所帮助。
特点
- 快速实验:机器学习实验步骤被编排并自动完成。
- 生产中模型的持续训练:使用基于实时工作流触发器的新数据在生产中自动训练模型。
- 实验-操作对称:在开发或实验环境中使用的工作流程的实现用于预生产和生产环境,这是MLOps实践中与DevOps统一的一个关键方面。
- 组件和工作流的模块化代码:要构建机器学习工作流,组件需要可重用、可组合并且可能跨机器学习工作流共享(即使用容器)。
- 模型的持续交付:模型部署步骤是自动化的,模型部署的目标是让经过训练和验证的模型提供在线预测的服务。
- 工作流部署:在第0级,您将经过训练的模型作为预测服务部署到生产环境;对于第1级,您可以部署一个完整的训练工作流,该工作流会自动循环运行,以将经过训练的模型作为预测服务提供服务。
附加组件
- 数据和模型验证:工作流期望新的实时数据生成一个新的模型版本,该模型版本在新数据上进行了训练。因此,生产工作流中需要自动化数据验证和模型验证步骤。
- 特征库:特征库是一个集中的存储库,您可以在存储库中将用于训练和服务的特征的定义、存储和访问做标准化处理。
- 元数据管理:记录有关机器学习工作流每次执行的信息,以帮助处理数据和工件沿袭、复现和比较,它还可以帮助您调试错误和异常情况。
- 机器学习工作流触发器:为了使用新数据重新训练模型,您可以自动化机器学习生产工作流,具体取决于您使用的情形:
- 随需应变按计划
- 根据新训练数据的可用性
- 当模型性能下降时
- 根据数据分布的重大变化(不断变化的数据配置文件)
挑战
当您基于新数据而不是基于新的机器学习点子部署新模型时,此设置适用。
但是,您需要尝试新的机器学习想法并快速部署机器学习组件的新实现。如果您在生产中管理许多机器学习工作流,则需要持续集成与持续部署设置来自动化机器学习工作流的构建、测试和部署。
2级MLOps
要在生产中快速可靠地更新工作流,您需要一个强大的自动化持续集成与持续部署系统,借助此自动化持续集成与持续部署系统,您的数据科学家可以快速探索有关特征工程、模型架构和超参数的新想法。
这个级别适合那些必须每天(如果不是每小时)重新训练模型、在几分钟内更新它们并同时在数千台服务器上重新部署的技术驱动型公司。如果没有端到端的MLOps循环,这样的组织将无法生存。
此MLOps设置包括以下组件:
- 源代码控制
- 测试和构建服务
- 部署服务
- 模型注册表
- 机器学习特征的存储库
- 机器学习元数据存储
- 机器学习工作流编排器
特点
- 开发和实验:您迭代地尝试新的机器学习算法和新的建模(其中安排了实验步骤),此阶段的输出是机器学习工作流步骤的源代码,然后将其推送到源存储库。
- 工作流持续集成:您构建源代码并运行各种测试,此阶段的输出是将在稍后阶段部署的工作流组件(依赖的包、可执行文件和工件)。
- 工作流持续交付:您将持续集成阶段生成的工件部署到目标环境,此阶段的输出是一个已部署的工作流,其中包含模型的新实现。
- 自动触发:工作流在生产中根据计划或响应触发自动执行,这个阶段的输出是一个新训练的模型,它被推送到模型注册表。
- 模型持续交付:您将经过训练的模型作为预测服务提供,此阶段的输出是已部署的模型预测服务。
- 监控:您根据实时数据收集模型性能的统计信息,此阶段的输出是执行工作流或执行新实验周期的触发器。
在工作流开始新的实验迭代之前,数据分析步骤仍然是数据科学家的手动过程,模型分析步骤也是一个手动过程。