0


MLOps:构建生产机器学习系统的最佳实践

你可能已经听过很多次了,但只有一小部分机器学习模型投入生产。部署和运行机器学习模型对于大多数已经开始将ML应用于用例的行业来说都是一个挑战。在这篇文章中,我将分享一些MLOps的最佳实践和技巧,它们将允许您在生产环境中使用您的ML模型并正确地操作它。在我们开始之前,让我们讨论一下我们可能都知道的典型的ML项目生命周期。

ML项目生命周期

一个典型的ML生命周期可以概括为以下图表,主要由三个阶段组成。

在第一阶段,我们深入研究数据之前做好准备是很重要的。因此与业务专家一起,我们需要仔细定义我们的问题和业务目标!我们需要回答一些重要的问题,这些问题使我们能够对模型和生产线的设计进行培训和服务决策。例如:

理想的结果是什么?

我们的评估指标是什么?我们如何定义ROI?

成功和失败的标准是什么?

推理速度要求是什么?我们能否让每个功能都满足要求?…

在第二阶段,我们建立了我们的第一个ML模型,我们进行ML可行性研究。

我们使用第一阶段中定义的度量来证明ML业务价值。ML工程规则第1条的最佳实践是«保持第一个模型简单,并获得正确的基础模型»。最初的模型为我们的产品提供了最大的提升,所以它不需要一开始就成为最花哨的模型。

在第三阶段,我们进入生产阶段。这是本文的主要主题,因此我们将在接下来的小节中对此进行更详细的介绍。一旦我们的生产管道准备好并设计好了,我们便能够更快更有效地收集见解并迭代新想法。

数据科学家现在主要在做什么?

今天,大多数ML将机器学习模型投入生产的步骤都是差不读。作为数据科学家,它从ML用例和业务目标开始。有了这个用例,我们开始收集和探索来自不同数据源的相关数据,以理解和评估它们的质量。

一旦我们对数据有了感觉,我们就会开始设计一些我们认为对我们的问题感兴趣的功能。然后我们进入建模阶段并开始处理一些实验。在这个阶段,我们定期手动执行不同的实验步骤。对于每个实验,我们都要做一些数据准备,一些特性工程和测试。然后我们对我们认为特别有前途的模型或模型架构进行一些模型训练和超参数调优。

最后但并非最不重要的是,我们将评估所有生成的模型,针对准备好的测试数据集测试它们,评估不同的指标,查看性能,并将这些模型与其他模型进行比较,看看哪个模型最有效,哪个模型产生最高的评价指标。整个过程是迭代的,并且会一遍又一遍地手动执行,直到我们得到具有最佳性能的最漂亮的模型。

一旦我们获得了性能最好的模型,我们通常会把它放在某个存储中,然后把它扔给it和运营团队,他们的工作是将模型作为预测服务部署到生产环境中。

ML操作陷阱——这种方法有什么问题?

下面是上述方法的错误之处。

手动:这些步骤非常手动,每次都是从头开始编写的。每次数据科学家需要进行新的实验时,他都需要查看他的笔记本,更新它们并手动执行它们。如果模型需要用新的训练数据刷新,数据科学家需要再次手动执行他的代码。

耗时:此手工流程耗时且效率不高。

不可重用:在笔记本中编写的自定义代码只能由作者自己理解,不能被其他数据科学家或其他用例重用或利用。即使是作者自己有时也会发现,在一段时间后,很难理解他们的作品。

不可复现:复现性是指被重新创建或复制的能力。在机器学习中,能够复制精确的模型是很重要的。使用这里的手工流程,我们可能无法复制模型的旧版本,因为底层数据可能已经更改,代码本身可能已经被覆盖,或者依赖项及其确切版本可能没有被记录。因此,在出现问题的情况下,任何回滚到模型的旧版本的尝试都可能是不可能的。

易出错:这个过程会导致很多错误,比如训练偏差,模型性能下降,模型偏差,基础设施崩溃……

  • 训练偏差:当我们部署模型时,有时会注意到模型的在线性能完全低于我们在保留数据集上预期和测量的性能。对于可操作的机器学习模型,这种现象非常常见。训练和线上渠道之间的差异会导致偏差。训练的偏差可能很难检测到,并且会使模型的预测完全无用。为了避免出现此问题,我们需要确保在训练和线上服务数据上都完成了精确的处理功能,随时监控训练和线上服务数据的分布,并监控模型的实时性能并将其与离线性能进行比较。
  • 模型衰减:在大多数情况下,数据配置文件是动态的,并且会随时间变化。当基础数据发生变化时,模型性能会下降,因为现有模式已不再是最新的。静态模型很少继续发挥作用。我们需要确保使用新数据定期更新模型,并监控所提供模型的实时性能以触发模型衰减。下图显示了部署的模型如何随时间衰减,以及不断需要用新模型更新模型。

  • 模型偏差:在医学和金融领域,人工智能可以协助进行医学诊断,或测试某人的贷款资格。这些应用程序看起来很实用,但是在此类系统中任何偏差的影响都可能是有害的并且造成严重的后果。因此,未来AI系统的一个重要特性是对所有人的公平性和包容性。因此对于任何机器学习模型,衡量跨敏感功能(性别,种族等)的公平性都非常重要。敏感功能取决于上下文。即使对于不敏感的功能,评估AI系统在不同子组上的性能也很重要,以确保在部署模型之前,我们知道所有表现不佳的子组。

  • 可扩展性:可扩展性在机器学习中很重要,因为训练模型可能需要很长时间,因此优化需要数周训练的模型是不可行的。例如模型太大以致无法容纳在训练设备的工作内存中。即使我们决定垂直扩展也要比水平扩展更昂贵。在某些情况下,数据量可能不大一开始可能不需要扩展性,但是我们应该考虑,如果通过连续训练我们期望接收的训练数据量是否会随着时间增加并可能产生问题。

机器学习系统的主要组成部分

在本节中,我们将描述ML系统的主要组成部分以及围绕它们的最佳实践,这将使我们避免上述陷阱。

提供集成的ML系统并在生产中持续运行的过程涉及以下步骤:

让我们详细讨论每个组件。

1、数据集成:

该组件通常位于用例的ML管道之外。在成熟的数据处理过程中,数据工程师应该优化连续的数据获取和转换,以不断地向组织内的不同数据分析实体提供最新的数据,这些实体期待发现数据驱动的见解和更好的决策

2、数据验证:

在这个组件中,我们的重点是验证输入到管道的数据。我们不能低估这个问题在ML系统中的重要性。无论采用何种ML算法,数据中的错误都可能严重影响生成模型的质量。正如一个流行的数据科学概念所说的“垃圾进,垃圾出”。因此,尽早发现数据错误是至关重要的。

无错误数据可以发挥的另一个作用是模型输出分析。这个组件允许我们正确地理解和调试ML模型的输出。因此,数据在ML系统中必须被视为头等公民,就像算法和基础设施一样。在ML管道的每次执行时,都必须对其进行持续监视和验证。

这个步骤也用于模型训练之前,以决定我们是否应该重新训练模型或停止管道的执行。

下面是数据验证组件的典型行为:

它计算并显示关于数据的描述性统计信息,它还可以显示连续数据跨度的描述性统计信息(例如,当前管道执行N和上次管道执行N-1之间的数据),以查看数据分布是如何变化的。

它可以推断出表示使用中的数据的数据模式。

检测数据异常。它应该检查数据集是否与预定义的经过验证的模式匹配。它应该检测连续数据跨度之间的数据漂移(即当前流水线执行N和最后流水线执行N-1之间的数据漂移),比如不同天数的训练数据之间的数据漂移。它还应该通过比较训练数据和在线服务数据来检测训练和线上的偏差。

在生产中,下面是一个示意图展示在通过不断的训练的情况下,视图如何生成关于新到数据的统计信息、验证它并生成异常报告:

3、数据ETL

在这个步骤中,为ML任务准备数据。这包括数据清理、过滤、数据转换和特性调整。它应该做一些事情,比如为整数映射生成特性。此外,该组件准备可能在训练组件中需要的特征元数据(例如,这包括特征规范化训练步骤中需要的元参数,分类变量编码所需的字典,等等)。这些称为转换工件;它们帮助构建模型输入。

重要的是,生成的任何映射都必须保存并在服务时重用(当训练过的模型用于进行预测时)。如果不能始终做到这一点,就会导致我们之前谈到的培训服务倾斜问题。

4、模型训练

模型训练组件负责训练我们的模型。在大多数用例中,模型可以训练数小时、数天甚至数周。优化一个需要数周训练的模型是不可行的。在其他情况下,用于训练模型的数据甚至无法装入内存。

在这种情况下,模型训练组件应该能够支持数据和模型并行性;并扩大到大量工作线程。它还应该能够处理内存不足的数据。

理想情况下,ML系统的所有组件都应该是可伸缩的,并运行在支持可伸缩性的基础设施上。

这个模型训练组件还应该能够在训练时自动监视和记录一切。我们不能训练一个机器学习模型很长一段时间,而不去观察它的运行情况,并确保它的正确配置能够随着迭代次数的增加而最小化损失函数。最后,训练组件还应该支持超参数调优。

5、模型分析

在模型分析组件中,我们对训练结果进行深入分析,并确保导出的模型具有足够的性能,可以推向生产。

这一步帮助我们保证模型只有在满足框架阶段预设的质量标准时才会被提升服务。标准必须包括与以前部署的模型相比的性能改进,以及在不同数据子集/切片上的性能。在下面的图中,我们在特性切片trip_start_hour上显示我们训练过的模型的性能。

该步骤的输出是一组性能指标,以及是否将模型推广到生产环境的决策。

6、模型服务部署

与训练组件相反,我们通常关注的是数据和模型复杂性的缩放。在服务部署组件中,我们感兴趣的是通过最小化响应延迟和最大化吞吐量来响应可变的用户需求。

因此,服务组件应该具有较低的延迟以快速响应用户、高效率以便在需要时可以同时运行多个实例、水平扩展、可靠和健壮地应对故障。

我们还需要我们的服务组件能够轻松地更新到模型的新版本。当我们获得新的数据或触发新的管道运行,或测试新的模型架构思想时,我们将希望推出模型的新版本,并希望系统无缝地过渡到这个新版本。

7、监控

正如我们前面提到的,由于不断变化的数据配置文件,部署的ML模型的性能会随着时间的推移而下降,我们需要确保我们的系统正在监视并响应这种下降。

因此,我们需要跟踪数据的汇总统计数据,并监控模型的在线性能,以便发送通知、在值偏离预期时进行回滚,或者潜在地调用ML流程中的新迭代。

因此,在线监控是检测性能退化和模型过时的关键。它作为一个线索,以新的实验迭代和再训练模型的新数据。

我们刚才描述的步骤的自动化水平定义了我们的ML系统的成熟度,它也反映了由模型衰退或给定的新数据触发的新模型的训练速度。

管道编排组件:目前,手工流程在许多用例中非常普遍。当模型由于静态数据分布而很少更改时,这可能就足够了。但在实践中,这种情况很少发生。数据通常是动态的,模型在实际部署时经常会中断。静态模型肯定不能适应描述环境的数据的变化。

手工处理也可能是危险的,因为它会导致ML训练和ML服务之间的断开。它将创建模型的数据科学家和作为预测服务操作模型的工程师分开。而这一过程会导致训练服务的倾斜问题。

业务流程组件的目标是连接系统的不同组件。它按顺序运行管道,并根据定义的条件自动从一个步骤移动到另一个步骤。这是自动化的第一步,因为我们现在可以使用基于实时管道触发器的新数据自动培训生产中的新模型。

我们需要注意的是,在生产环境中,我们并没有将训练过的模型部署为预测服务。我们实际上正在部署一个完整的训练管道,它会自动且反复地运行,以作为预测服务来服务训练过的模型。

管道的元数据存储:管道元数据存储的作用是记录ML管道执行的所有细节。这对于保持组件之间的沿袭和在任何需要的时候重新生成已部署的模型非常重要。它还可以帮助我们调试遇到的任何错误。

每次执行管道时,存储都会记录所有关于管道执行的细节,例如:

  • 我们的管道和组件的版本被执行的源代码。
  • 传递给我们管道的输入参数。
  • 管道中每个执行组件产生的工件/输出,如原始数据的路径、转换的数据集、验证统计数据和异常、训练的模型……
  • 模型评估度量标准,以及关于模型部署的模型验证决策,这些决策是在模型分析和验证组件期间产生的……

CI / CD管道自动化

到目前为止,我们只讨论了如何自动化ML管道的持续执行,以基于新数据的可用性或模型衰减来捕捉新出现的模式等触发器来重新训练新模型。

但是,如果我们想测试一个新的特性,一个新的模型架构,或者一个新的超参数呢?这就是自动化CI/CD管道的意义所在。CI/CD管道让我们能够快速探索新的想法和实验。它允许我们自动构建、测试和部署新管道及其组件到预期的环境。

以下是CI/CD流水线自动化如何补充连续ML流水线自动化:

  • 如果给定新的实现/代码(新的模型架构、特性工程和超参数……),一个成功的CI/CD管道会部署一个新的连续ML管道。
  • 如果给定新的数据(或模型衰减触发器),成功的自动连续管道将部署新的预测服务。要用新数据训练新的ML模型,需要在新数据上执行之前部署的ML管道。

完整的端到端自动化管道应该如下所示:

  • 我们迭代地尝试了新的ML想法,其中对一些管道组件进行了更新(例如,引入新功能将看到我们更新数据转换组件……)。此阶段的输出是新ML管道组件的源代码,然后将其推送到目标环境的源存储库中。
  • 新源代码的存在将触发CI / CD管道,而CI / CD管道将反过来构建新的组件和管道,运行相应的单元和集成测试,以确保一切均已正确编码和配置,最后将新管道部署到目标环境是否通过所有测试。机器学习系统的单元测试和集成测试本身值得一篇独立的文章。
  • 根据计划,新训练数据的存在或响应触发器,新部署的管道将在生产中自动执行。此阶段的输出是经过训练的模型,该模型被推送到模型注册中心并进行连续监视。

为什么Tensorflow ?

在这最后一节中,我想谈谈为什么Tensorflow是我开发集成ML系统时首选的框架。当然,TensorFlow可能并不适合并适用于所有的用例,有时甚至可能是一种过度使用,特别是在不需要深度学习的情况下。然而,我倾向于在可能的情况下使用Tensorflow,原因如下:

Tensorflow自带Tensorflow Extended (TFX)。TFX使我们能够专注于优化ML管道,同时减少对每次重复的样板代码的关注。像数据验证和模型分析这样的组件可以很容易地完成,而不需要开发自定义代码来读取数据并在两次管道执行之间检测异常。使用TFX,只需要很少几行代码就可以完成,从而节省了大量开发管道组件的时间。数据验证和模型分析组件中的截图来自TFX。

我们可以设计自定义模型,我们可以使用TF layers API、TF losses API、....来构建这些模型如果我们正在构建一些相当标准的东西,TensorFlow有一组我们可以尝试的预估器。Tensorflow 2可以很好地与Keras模型一起工作。随着数据和培训时间的增加,我们的需求也会增加。检查点允许我们在需要时暂停并恢复训练,如果预先设定的时间不够,则继续训练。

Tensorflow设计了一个数据集API,可以很好地处理内存不足的数据集。

模特训练需要几个小时,有时几天。我们不能在不检查模型是否按预期运行的情况下对模型进行长时间的训练Tensorboard是TensorFlow的可视化工具包。TensorBoard提供了机器学习实验所需的可视化和工具。它允许我们将在训练期间实时生成的TensorFlow关键指标显示出来,并将它们可视化在训练和验证集上,以便查看我们的模型是否正确地配置为收敛。如果情况不是这样,我们可以停止训练。

我们可以将TensorFlow分布在一个集群上以使它更快。从一台机器到多台机器可能听起来很复杂,但有了Tensorflow,我们就可以开箱即用了。TF为训练和评估抽象了分布式执行的细节,同时也支持跨本地/非分布式和分布式配置的一致行为。

作者:Maggie MHANNA

原文地址:https://towardsdatascience.com/mlops-practices-for-data-scientists-dbb01be45dd8

deephub翻译组

标签:

“MLOps:构建生产机器学习系统的最佳实践”的评论:

还没有评论