你可能已经听过很多次了,但只有一小部分机器学习模型投入生产。部署和运行机器学习模型对于大多数已经开始将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之间的数据漂移),比如不同天数的训练数据之间的数据漂移。它还应该通过比较训练数据和在线服务数据来检测训练和线上的偏差。
在生产中,下面是一个示意图展示在通过不断的训练的情况下,视图如何生成关于新到数据的统计信息、验证它并生成异常报告: