皮尔·保罗·伊波利托(PierPaoloIppolito),数据科学家翻译|陆新旺评论|实践和可重复使用的解决方案。在数据科学和软件开发、架构设计等学科中,存在大量反复出现的问题,因此尽量对最常见的问题进行分类,并提供不同形式的规划蓝图,以便于识别和解决这些问题,为更多的人带来巨大的利益。在软件开发中使用设计模式的思想最早是由ErichGamma等人提出的。在《设计模式:可重用面向对象软件要素》(设计模式:可重用面向对象软件的元素)[1]。此外,根据SaraRobinson等人的文章《机器学习设计模式》(机器学习设计模式)[2],设计模式也应用于机器学习过程。在本文中,我们将探索构成MLOps的不同设计模式。MLOps(机器学习->操作,机器学习->操作)是一组旨在将实验性机器学习模型转化为可以在现实世界中做出决策的生产性服务的过程。MLOps的核心是基于与DevOps相同的原则,但更侧重于数据验证和持续培训/评估(图1)。图1:DevOps和MLOps(图片来自作者)MLOps的一些主要优势:缩短上市时间(更快部署)增强模型稳健性(更容易识别数据漂移、重新训练模型等)训练/比较更灵活不同的ML模型其他一方面,DevOps强调软件开发的两个关键概念:持续集成(CI)和持续交付(CD)。持续集成的要点是使用中央存储库作为团队协作项目的一种方式,并在不同团队成员添加新代码时尽可能自动化地添加、测试和验证新代码。通过这种方式,可以随时测试应用程序的不同部分是否正确地相互通信,并快速识别任何类型的错误。持续交付侧重于平稳地更新软件部署,将任何类型的停机时间降至最低。MLOpsDesignPatternWorkflowPipeline机器学习(ML)项目由许多不同的步骤构建(图2):图2:关键ML项目步骤(图片来自作者)在制作新模型的原型时,通常使用单个脚本(单个script)来写整个流程,但是随着项目越来越复杂,团队成员越来越多,需要将项目的各个不同步骤拆分成一个单独的脚本(微服务)。因此,采用这种方法可能有一些好处:更容易尝试对不同步骤的编排进行更改根据定义使项目具有可扩展性(可以轻松添加和删除新步骤)每个团队成员都可以专注于流程的中间部分每个不同步骤的步骤都可以获得一个分散模型输出的工作流流水线设计模式,其目的是定义一个计划蓝图来创建ML流水线。ML管道可以用有向无环图(DAG)表示,其中每个步骤都由一个容器表示(图3)。图3:有向无环图(DAG)示例(图片来自作者)按照这种结构,可以创建可重用和可管理的ML流程。使用工作流管道的一些好处是:通过在管道中添加和删除步骤,可以创建复杂的实验,通过单独保存每个不同步骤的输出来测试不同的预处理技术、机器学习模型和超参数。如果在最后的步骤中应用了任何更改,请避免在管道的开头重新运行步骤(从而节省时间和计算能力)如果出现错误,使用CI部署后很容易确定哪些步骤需要更新和修改/CD在生产环境中,可以根据不同的因素(如时间间隔、外部触发、ML指标变化等)安排流水线重新运行FeaturePlatformFeaturePlatform是为机器学习过程设计的数据管理层(图4).这种设计模式的主要目的是简化组织管理和使用机器学习功能的方式。这是通过创建某种形式的中央存储库来实现的,该存储库存储公司为构建ML管道而创建的所有功能。这样,如果数据科学家需要为不同的ML项目提供相同的特征子集,他们就不需要将原始数据多次转换为处理后的特征,这可能会更耗时。最常见的两种开源特征平台解决方案是Feast和Hopsworks。图4:特征平台设计模式(图片来自作者)更多关于特征平台的内容请参考(https://towardsdatascience.com/getting-started-with-feature-stores-121006ee81c9)Transform变换(Transform)设计模式旨在通过将输入、特征和转换作为单独的实体来使机器学习模型更易于在生产中部署和维护(图5)。事实上,原始数据通常需要经过不同的预处理步骤才能用作机器学习模型的输入,并且在对数据进行推理预处理时,需要保存其中一些转换以供重复使用。图5:输入和特征之间的关系(图片来自作者)例如,在训练ML模型之前,通常将归一化/标准化技术应用于数值数据,以处理异常值并使数据看起来更像高斯分布。当提供新数据进行推理时,应保存这些转换以供将来重用。如果不保留这些转换,那么我们将在训练和服务之间出现数据倾斜问题,导致为推理提供的输入数据与用于训练ML模型的输入数据分布不同。为了避免训练模型和服务之间的任何类型的数据倾斜,一种可能的解决方案是使用功能平台设计模式。多模态输入在训练ML模型时,可以使用图像、文本、数字等不同类型的数据,但某些类型的模型只能接受特定类型的输入数据。例如Resnet-50只能将图像作为输入数据,而其他ML模型如KNN(KNearestNeighbor,K最近邻)只能将数字数据作为输入。为了解决机器学习问题,需要使用不同形式的输入数据。在这种情况下,我们需要应用某种形式的转换来为所有不同类型的输入数据创建通用表示(多模式输入设计模式)。例如,如果我们有文本、数字和分类数据的组合,为了训练ML模型,我们可以使用情感分析、词袋或词嵌入等技术将文本数据转换为数字格式,并使用单热编码(one-hot-hot-encoding)转换分类数据。这样,我们就可以将所有的数据以相同的格式(数值)保存起来,用于模型训练。Cascading在某些场景下,仅用一个ML模型是无法解决问题的。在这种情况下,有必要创建一系列相互依赖的ML模型来实现最终目标。例如,假设我们尝试预测推荐给用户的项目的内容(图6)。为了解决这个问题,我们首先创建一个模型来预测用户是小于18岁还是大于18岁。然后,根据模型的响应,路由到两个不同的ML推荐引擎之一(一个向18岁以上的用户推荐产品,以及向18岁以下用户推荐产品的网站)。图6:级联设计模式(图片来自作者)为了创建这个级联ML模型,我们需要确保它们一起训练。事实上,由于它们的相互依赖性,如果第一个模型发生变化(没有更新其他模型),后续模型可能会变得不稳定。我们可以使用工作流管道设计模式来自动化这些过程。结论在本文中,我们探索了一些支持MLOps的最常见的设计模式。如果您有兴趣了解更多有关机器学习中设计模式问题的信息,请参阅ValliappaLakshmanan在AIDVFest20上的演讲和公共领域的书《机器学习设计模式》(机器学习设计模式)。GitHub存储库。参考文献[1]《设计模式:可重用面向对象软件的要素》(Addison-Wesley,1995):www.uml.org.cn/c%2B%2B/pdf/DesignPatterns.pdf[2]《机器学习设计Patterns”(SaraRobinsonet.al.,2020):https://www.oreilly.com/library/view/machine-learning-design/9781098115777/作者:皮尔·保罗·伊波利托(PierPaoloIppolito)毕业于数据科学家来自南安普顿大学。他拥有人工智能硕士学位,对人工智能的发展和机器学习在金融、医学等领域的应用有着浓厚的兴趣。联系方式:如想了解作者最新文章和项目,可通过以下方式联系:LinkedIn个人网站MediumGitHubKaggle译者简介卢新旺,社区编辑,半路出家的90后程序员。做过前端页面,写过业务接口,做过爬虫,学过JS,有幸接触到Golang,参与过微服务架构的改造。目前主要编写Java,负责公司可定制低代码平台数据引擎层的设计和开发。原标题:DesignPatternsinMachineLearningforMLOps,作者:PierPaoloIppolito2022年1月13日发表于TowardsDataScience
