译者 | 李睿
审校 | 重楼
51CTO读者成长计划社群招募,咨询小助手(微信号:TTalkxiaozhuli)
尽管人们对应用机器学习的兴趣越来越大,但企业在将机器学习集成到现实应用方面仍然面临着巨大的挑战。大多数的机器学习项目或者在完成之前被放弃,或者无法兑现承诺。
应用机器学习是一个年轻且不断发展的领域。机器学习开发与运维(MLOps)是一个用于部署和维护机器学习模型的新兴实践领域,为机器学习管道提供了许多工具和平台。然而,目前仍有许多工作要做。
加州大学伯克利分校的科学家最近发表的一份研究论文,揭示了在不同组织中运行机器学习的最佳实践。这篇论文基于对不同行业机器学习工程师的调查,包含了成功部署和维护机器学习模型的重要经验,并为未来MLOps工具的开发提供了指导。
1、MLOps管道
MLOps管道是一个由四个任务组成的循环:首先,机器学习团队必须收集、清理和存储数据来训练模型。如果企业正在构建一个有监督的机器学习模型,他们必须人工或使用半自动工具标记数据。
然后,机器学习团队必须进行特性工程和模型实验。在这个阶段,机器学习工程师会尝试采用不同的机器学习算法,并创建与这些模型对应的特征。例如,深度神经网络可能只需要很少或不需要特征工程,但经典的机器学习模型(如线性回归或支持向量机)可能需要额外的工程工作,例如使用降维来选择相关特征的最小集。
第三步是评估和部署。机器学习工程师根据不同的机器学习模型在指定的验证数据集上的性能来比较它们。在应用机器学习管道中,部署通常以分阶段的方式完成:首先将模型推出给用户子集,然后根据当前的生产模型进行评估。如果运行良好,就将其扩展到更多用户,并再次进行测试,以此类推。
最后,机器学习管道需要持续的监控和响应。机器学习团队必须持续监控模型在不同用户和数据子集上的性能,并寻找漂移、退化和其他问题的迹象。与此同时,工程师们需要工具来从用户与模型的交互中收集新的数据。一旦机器学习模型的性能下降到某个水平以下,他们就需要重新启动管道,并收集数据集来训练、验证和部署模型的新版本。
2、MLOps的“3v”
基于对机器学习工程师的采访,加州大学伯克利分校的科学家定义了MLOps管道成功的三个标准:速度(Velocity)、验证(Validation)和版本控制(Versioning)。他们称之为MLOps的“3v”。
速度是指机器学习团队迭代的速度。开发机器学习模型是一个科学的过程,它需要不断的观察、假设、发展和测试。机器学习团队开发、训练和测试新的机器学习原型的速度越快,就能越快地达到最佳解决方案。该论文称,“机器学习工程师将他们的生产力归功于优先考虑更高的实验速度的开发环境和允许他们快速测试假设的调试环境。”
验证是机器学习团队在模型中发现错误的速度。当在实际应用程序中使用机器学习时,企业希望最好在用户接触到错误之前尽早发现并修复错误。
最后,版本控制是保持机器学习模型的多个版本的能力。有时,在验证数据集上工作良好的新机器学习模型最终在生产中表现较差。在这种情况下,机器学习团队必须能够快速切换回老旧模型,直到他们能够调试和更新新模型。
基于这些关键原则以及对机器学习工程师的采访,论文的作者为成功的MLOps管道提供了一些实际的见解。
3、高速迭代
与传统的软件开发相比,机器学习工程更具实验性。因此,相当一部分机器学习模型将无法投入生产是很自然的。
该论文的作者写道:“重要的是确保想法可以快速原型化和验证,这样不好的想法就可以立即被剔除。”
在他们的研究中,记录了一些可以帮助建立高速机器学习管道的有趣策略。一个例子是跨团队合作,数据科学家和主题专家共同合作,选择最好的假设、特征和模型。这有助于在分配开发和计算资源之前,在构思阶段抛弃不可行的假设。
在某些情况下,迭代数据比使用不同的机器学习算法和模型配置提供了更快的结果。
一些团队将他们的机器学习管道设置为在早期阶段扼杀收益最小的想法,以避免浪费未来的时间,并专注于在部署的早期阶段获得最大性能收益的想法。他们通过设置沙盒(通常是Jupyter Notebook)来实现这一点,沙盒可以快速对他们的想法进行压力测试。
另一种有趣的方法是最小化代码更改。为了做到这一点,机器学习工程师开发他们的机器学习模块,通过修改配置文件而不是源代码来切换模型。通过这种方式,他们可以创建多个版本的配置文件,并通过相同的代码快速验证它们。
因为机器学习实验需要考虑很多因素才能得出正确的结果。研究人员在论文中写道,设置随机种子,访问相同版本的代码库,以及数据约束工程师只进行配置更改,这些都可以减少错误的数量。
4、动态验证
机器学习模型必须不断更新,以跟上环境数据、客户需求和业务的变化。为了实现这一目标,企业需要能够适应不断变化的世界的评估过程,避免重复失败,并防止糟糕的机器学习模型投入生产环境。
与机器学习工程师面谈的重要收获之一是定期更新验证数据集。这与学术界的标准实践有所不同,后者是针对固定的验证数据集测试模型。研究人员写道,“动态验证集有两个目标:(1)显而易见的目标是确保验证集尽可能多地反映实时数据,并考虑到关于问题的新知识和总体数据分布的变化;(2)另一个更微妙的目标是解决了子群体可能经历的局部变化(例如,特定标签的准确性较低)。”
一个有趣的策略是使用“影子阶段”,在这个阶段中,候选机器学习模型被集成到生产系统中,但其预测结果不会向用户展示。这使得机器学习工程师能够根据实时数据动态验证他们的模型,而不会给业务带来风险。需要注意的是,带有用户反馈循环的应用程序(例如,推荐系统)不支持影子部署。
最后成功的MLOps验证的一个重要部分是更新验证指标以反映正确的业务目标。随着产品的发展,它们的关键性能指标和增长指标也会发生变化。例如,在某一时刻,企业的目标可能是增加活跃用户的数量,而不考虑他们产生的收入。在之后的阶段,同一家公司可能想要增加付费用户的份额,部署的机器学习模型必须基于它们对这些关键指标的贡献进行评估。这需要机器学习、产品和业务团队之间的密切协调。
5、良好的软件工程
根据加州大学伯克利分校研究团队采访的机器学习工程师的经验,健壮的MLOps需要健全的软件工程和DevOps实践。
例如,定期对机器学习模型进行再训练可以帮助团队保持他们的机器学习模型是最新自版本并避免漂移。这需要软件和数据工程团队建立正确的管道,以持续收集和标记新数据。对这种实践的补充是拥有一个健壮的版本控制系统,该系统跟踪机器学习模型的不同版本及其性能指标。这允许工程师设置自动化或半自动化流程,以便在生产模型的性能下降到某个阈值以下时恢复到旧版本。
在一些应用程序中,软件工程师不得不故意添加一层经典的基于规则的启发式来稳定行为或机器学习模型。这在许多应用程序中非常重要,在这些应用程序中,机器学习模型可能会根据输入向量特征中的错误相关性进行学习和行为。研究人员写道:“现代模型驱动的机器学习和传统基于规则的人工智能的结合表明,除了管理学习模型之外,还需要管理过滤器以及过滤器的版本。”
最后,成功的机器学习项目的一个共同主题是对简单性的偏好。虽然学术界的研究往往专注于突破最先进技术的极限,但在应用机器学习中,使用尽可能简单的模型是一种制胜策略。更简单的模型训练和运行成本更低,而且它们通常更易于解释。在一个有趣的案例中,机器学习工程师报告说他们开发了一种混合方法,其中他们使用神经网络创建一个特征嵌入层,然后将其用作几个简单分类器模型的输入。
6、创建更好的MLOps工具
这篇论文是关于在现实应用中实现机器学习的挑战和教训的有趣研究。研究人员得出结论,成功的MLOps实践围绕着“更高速度,尽早地验证,并维护模型的多个版本以减少生产停机时间”这三个目标进行构建。
因此,构建MLOps堆栈时应该以解决这三个v为目标。
研究人员写道:“MLOps工具构建者可能希望在其产品的开发速度、尽早验证或版本控制方面优先考虑更好的体验。”
原文链接:https://bdtechtalks.com/2022/12/12/successful-mlops/