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

我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use
我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我