[编者按]本文是使用持续集成(通过GitHubActions)构建自动化模型训练系统的哲学和实践指南。随着过去几年机器学习(ML)的快速发展,开始尝试ML变得非常容易。得益于scikit-learn和Keras等库,只需几行代码即可创建模型。但比以往任何时候都更难将数据科学项目转化为有意义的应用程序,例如将模型转化为团队决策或成为产品的一部分。一个典型的ML项目涉及许多不同的技能组合,对于任何一个人来说,即使不是不可能,也是具有挑战性的——能够同时开发高质量的软件和游戏工程师是如此困难和罕见数据科学家被称为独角兽!随着该领域的成熟,许多工作将需要软件、工程和数学技能的结合,有些人说他们已经这样做了。引用无与伦比的数据科学家/工程师/评论家VickiBoykis在她的博客数据科学现在不同了:越来越清楚的是,数据科学正在炒作周期的后期接近工程,数据科学家需要的技能不再是基于视觉和统计,但更符合传统的计算机科学课程。为什么数据科学家需要了解DevOps那么数据科学家应该学习哪些工程和软件技能呢?我的钱在DevOps上。DevOps是开发和运营的复合词,它于2009年在比利时的一次会议上正式诞生。召集这次会议的目的是解决历史上经历过深刻分歧的科技公司双方之间的紧张关系。软件开发人员需要快速行动并经常进行试验,而运营团队则优先考虑服务稳定性和可用性(这些人让服务器每天都在运行)。他们的目标不仅仅是对抗,而是竞争。这听起来很像今天的数据科学。数据科学家通过实验创造价值:数据建模、组合和转换的新方法。与此同时,组织有稳定的动机聘请数据科学家。这种划分的后果是深远的:在最新的Anaconda数据科学状况报告中,“不到一半(48%)的受访者认为他们可以证明数据科学对其组织的影响”。据估计,绝对大多数数据科学家创建的模型最终都会被束之高阁。我们还没有在创建模型的团队和部署它们的团队之间转移模型的强大实践。数据科学家以及实施其工作的开发人员和工程师拥有完全不同的工具、约束和技能集。DevOps的出现是为了解决软件中的这种僵局,例如开发人员与运维人员。这是一个巨大的成功:许多团队已经从每隔几个月部署一次新代码转变为每天部署几次。现在我们有了机器学习和操作,是时候考虑MLOps——DevOps的数据科学原则了。引入持续集成DevOps既是一种理念,也是一组实践,包括:自动化所有你能做的事情快速获得对新想法的反馈减少工作流中的手动切换在一个典型的数据科学项目中,我们可以看看对于一些应用程序:能。自动化部分重复和可预测的数据处理、模型训练和模型测试。获得有关新想法的快速反馈。当您的数据、代码或软件环境发生变化时,立即在类似生产的环境(即具有您期望在生产中具有的依赖项和约束的机器)中进行测试。减少工作流程中的手动切换。尽可能多地为数据科学家寻找机会来测试他们自己的模型。不要等到您有开发人员时才看到您的模型在类似生产环境中的行为。实现这些目标的标准DevOps方法称为持续集成(CI)。要点是,当您更改项目的源代码时(通常通过Git提交注册更改),您的软件将自动构建和测试。每个动作都会触发反馈。CI通常与Git-flow一起使用,Git-flow是一种开发框架,新功能构建在Git分支上。当一个特性分支通过自动化测试时,它就成为一个候选分支,被合并到主分支中。软件开发中的持续集成通过此设置,我们实现了自动化——代码更改会触发自动构建,然后进行测试。我们有快速的反馈,因为我们很快就能得到测试结果,所以开发人员可以不断地迭代他们的代码。而且由于所有这一切都是自动发生的,您无需等待其他人获得反馈——少了一个开关!那么为什么我们不在ML中使用持续集成呢?一些原因是文化上的,例如数据科学和软件工程社区之间的低交叉。其他是技术性的——例如,要了解模型的性能,您需要查看准确性、特异性和敏感性等指标。数据可视化可能会对您有所帮助,例如混淆矩阵或损失图。所以通过/失败测试不会减少反馈。了解模型是否有所改进需要一些关于手头问题的领域知识,因此需要以有效且易于理解的方式报告测试结果。机器学习项目中的持续集成是什么样的?CI系统如何工作?现在我们要更实际一点,让我们看看典型的CI系统是如何工作的。对于学习者来说幸运的是,由于GitHubActions和GitLabCI等工具为初学者提供了清晰的图形界面和出色的文档,因此门槛从未降低。由于GitHubActions对公共项目完全免费,因此我们将在本示例中使用它。它是这样工作的:1.您创建一个GitHub存储库。您创建一个名为.github/workflows的目录,并在其中放入一个特殊的.yaml文件,其中包含您要运行的脚本。$pythontrain.py2.您可以以某种方式更改项目存储库中的文件,然后Git提交更改。然后,推送到GitHub存储库。#Createanewgitbranchforexperimenting$gitcheckout-b"experiment"$edittrain.py#gitadd,commit,andpushyourchanges$gitadd.&&commit-m"Normalizedfeatures"$gitpushoriginexperiment3.一旦GitHub检测到推送,GitHub就会部署其中一台计算机来运行.yaml函数在。4.函数运行成功或失败,GitHub都会返回通知。在GitHub存储库的“操作”选项卡中找到它,就是这样!真正的魔力在于您正在使用GitHub的计算机来运行您的代码。您所要做的就是更新代码并将更改推送到存储库,工作流会自动发生。回到我在第1步中提到的特殊.yaml文件——让我们快速看一下其中一个。它可以有任何你喜欢的名字,只要文件扩展名是.yaml并且它存储在.github/workflows目录中。这是一个:#.github/workflows/ci.yamlname:train-my-modelon:[push]jobs:run:runs-on:[ubuntu-latest]steps:-uses:actions/checkout@v2-name:trainingrun:|pipinstall-rrequirements.txtpythontrain.py有许多操作正在进行,但大多数操作都是相同的-您可以复制并粘贴这个标准的GitHub操作模板,但在“运行”字段中填写您的工作流程。如果此文件在您的项目存储库中,每当GitHub检测到您的代码发生更改(通过推送注册)时,GitHubActions将部署一个Ubuntu运行器并尝试执行您的命令以安装要求并运行Python脚本。请注意,您必须在项目存储库中包含工作流所需的文件-这里是requirements.txt和train.py。获得更好的反馈正如我们之前提到的,自动化训练非常酷,但以易于理解的形式获得结果很重要。目前,GitHubActions允许您访问运行的纯文本日志。从GitHub操作日志打印的示例但是了解模型的性能很棘手。模型和数据是高维的,而且通常是非线性的——如果没有图片,这两件事尤其难以理解。我可以向您展示一种将数据可视化放入CI循环的方法。在过去的几个月里,我在Iterative.ai的团队(我们做数据版本控制)一直在开发一个工具包来帮助在机器学习项目中使用GitHubActions和GitLabCI。它被称为连续机器学习,简称CML,它是开源免费的。从“让我们使用GitHub操作来训练ML模型”的基本思想出发,我们构建了提供比通过/失败通知更详细的报告的功能。CML可帮助您将图像和表格放入报告中,例如SciKit-learn生成的混淆矩阵:当您在GitHub中请求Pull时,会出现此报告为了制作此报告,我们的GitHubActions执行了Python模型训练脚本,然后编写了我们的模型使用CML函数将准确性和混淆矩阵转换为降价文档。CML然后将降价文档传递给GitHub。我们修改后的.yaml文件包含以下工作流程(新添加的行以粗体表示以强调):name:train-my-modelon:[push]jobs:run:runs-on:[ubuntu-latest]container:docker://dvcorg/cml-py3:lateststeps:-uses:actions/checkout@v2-name:trainingenv:repo_token:${{secrets.GITHUB_TOKEN}}运行:|#train.pyoutputsmetrics.txtandconfusion_matrix.pngpip3install-requirements.txtpythontrain.py#copythecontentsofmetrics。txttoourmarkdownreportcatmetrics.txt>>report.md#addourconfusionmatrixtoreport.mdcml-publishconfusion_matrix.png--md>>report.md#sendthereporttoGitHubfordisplaycml-send-commentreport.md你可以在这里看到整个项目仓库。请注意,我们的.yaml现在包含更多配置细节,例如特殊的Docker容器和环境变量,以及一些要运行的新代码。容器和环境变量的详细信息在每个CML项目中都是标准的,用户不需要操作,因此请留意代码。在工作流中添加这些CML功能后,我们在CI系统中创建了一个更完整的反馈循环:创建一个Git分支并更改该分支上的代码。自动训练模型并生成指标(准确性)和可视化(混淆矩阵)。将这些结果嵌入到合并请求的可视化报告中。您现在有一个仪表板,您和您的团队成员可以在决定您的更改是否对您的建模目标产生积极影响时检查它。此外,Git还将此报告链接到您的确切项目版本(包括数据和代码)、用于训练的运行器以及该运行的日志。完全没有更多的图形漂浮在您的工作区周围,这些图形很久以前就与代码失去了任何联系。这是CI在数据科学项目中的基本思想。需要明确的是,此示例是使用CI的最简单方法之一。在现实生活中,你可能会遇到相当复杂的场景。CML还具有一些功能,可帮助您处理存储在GitHub存储库外部的大型数据集(使用DVC),并在云实例上进行训练,而不是使用默认的GitHub操作运行器。这意味着您可以使用GPU和其他专门设置。比如我做了一个项目,使用GitHubActions部署EC2GPU,然后训练一个神经类型迁移模型。这是我的CML报告:您还可以使用自己的Docker容器,它可以在生产环境中模拟模型的环境。我将在未来介绍更多此类高级用例。关于CIforML的最终想法总结一下我们到目前为止所说的:DevOps不是一种特定的技术,而是一种哲学,一组用于从根本上重构软件创建过程的原则和实践。它之所以有效,是因为它解决了团队如何工作和试验新代码的系统瓶颈。随着未来几年数据科学的成熟,了解如何将DevOps原则应用于机器学习项目的人将成为有价值的商品——无论是在薪资方面还是在组织影响方面。持续集成是DevOps的主要内容,也是构建具有可靠自动化、快速测试和团队自治的文化的最有效已知方法之一。CI可以通过GitHubActions或GitLabCI等系统实现,您可以使用这些服务构建自动化模型训练系统。好处有很多:您的代码、数据、模型和培训基础设施(硬件和软件环境)都是Git版本化的。您正在自动化工作、频繁测试并获得快速反馈(如果使用CML,则为可视化报告)。从长远来看,这几乎肯定会加快项目的发展。CI系统使团队中的每个人都可以看到您的工作。没有人需要努力寻找您运行最好的代码、数据和模型。我保证,一旦您进入最佳状态,通过一次Git提交自动启动您的模型训练、日志记录和报告会非常有趣。你会觉得很爽。
