近年来,机器学习的飞速发展,让进行机器学习实验成为了一件小事。借助scikit-learn和Keras等库,只需几行代码即可创建模型。然而,将数据科学项目转化为有意义的应用程序,例如为团队决策提供信息或整合到产品中的模型,变得越来越困难。传统的机器学习项目涉及许多不同的技能组合,同时掌握所有这些技能即使不是不可能也很困难——既能构建出色软件又能成为工程师的稀有数据科学家是独奏者野兽!随着机器学习领域的成熟,许多工作将融合软件、工程和数学,有些工作已经做到了。引用传奇数据科学家、工程师和批判观察家VickiBoykis在他的博客《数据科学现已不同》中的话:“在繁荣的后期阶段,数据科学越来越多地与工程学融合。显而易见的是,数据科学家所需的技能将变得不那么明显,对数据的依赖性将降低,并且将更偏向于传统的计算机科学课程。”为什么数据科学家需要了解DevOps工程和软件技能那么多,数据科学家应该学什么?我选择DevOps。DevOps是开发和运营的结合,诞生于2009年比利时的一次会议。这次会议旨在缓解技术组织因开发和运营之间长期存在的广泛分歧而产生的紧张局势。软件开发人员需要快速生产和频繁试验,而运营团队则优先考虑服务稳定性和可用性(这些人保持服务器24/7全天候运行)。他们的目标截然相反,他们之间的竞争更加激烈。这不禁让人联想到现在的数据科学。通过实验,数据科学家创造价值:以新的方式建模、组合和转换数据。同时,雇用数据科学家的技术组织更看重稳定性。分歧范围很广:最新的Anaconda数据科学状况报告显示,不到一半(48%)的受访者认为他们可以解释数据科学对其组织的影响。据估计,大多数数据科学家创建的模型都被搁置了。我们目前没有非常可行的方法在建模团队和部署团队之间传输模型。数据科学家、开发人员和实施两者的工程师拥有截然不同的工具、约束和技能。DevOps的出现是为了解决开发人员和运维人员之间的软件僵局,并且取得了巨大的成功:许多团队已经从每隔几个月部署一次新代码变成了每天部署几次。现在面对机器学习和运维的交锋,服务于数据科学的DevOps原则MLOps应运而生。来源:unsplash持续集成DevOps既是理论又是实践。它包括:使一切自动化快速获得对新想法的反馈减少工作流程中的手动交接在一个典型的数据科学项目中,有以下应用:使一切自动化。数据处理、模型训练和模型测试中重复和可预测的部分都可以自动化。获得有关新想法的快速反馈。随着数据、代码或软件环境的变化,在类似生产的环境(即具有依赖性和约束的生产机器)中快速测试它们。减少工作流程中的手动切换。尽可能给数据科学家找机会测试模型,不要等到开发人员在生产环境测试模型效果后再行动。为实现上述目标,DevOps采用的标准是持续集成(CI)。重点是,当你更改项目的源代码时(通常通过git提交),软件会自动构建和测试,每个动作都会得到反馈。通常,CI与Git-flow一起工作,Git-flow是一种软件开发活动模型,可为新功能创建Git分支。功能分支可以通过自动测试合并到主分支中。软件开发过程中CI的示意图由此可以自动化——更改代码触发自动构建,然后进行测试。开发人员可以对代码进行迭代,因为测试结果很快可用,并且可以快速获得反馈。而且,因为一切都是自动的,不需要等待别人的反馈,实现了零交接。那么,为什么我们不使用机器学习中已经存在的CI?我将这部分归因于文化,例如数据科学和软件工程社区的低交叉性。另一部分是技术原因。例如,要了解模型性能,您需要查看准确性、特异性和灵敏度等指标。要了解模型的性能,您需要查看准确性、特异性和灵感等指标。混淆矩阵或损失图等数据可视化可能对此有所帮助。因此,通过/失败不会妨碍反馈。了解模型是否改进需要了解当前的问题领域,因此需要以高效且人类可解释的方式报告测试结果。机器学习项目中的持续集成持续集成系统如何工作?现在,看看典型的CI系统是如何工作的。得益于GitHubActions、GitLabCI等工具,图形界面清晰,并为新手提供详细的操作文档,将学习CI系统的门槛降到最低。由于GitHubActions对于开源项目是完全免费的,我们以它为例:其操作如下:(1)创建GitHub仓库。创建一个名为.github/workflows的目录,在该目录下放置一个特殊的.yaml文件,里面包含要运行的脚本,如:$pythontrain.py(2)更改项目库中的文件,gitcommit更新,提交到GitHub存储库。#Createanewgitbranchforexperimenting$gitcheckout-b"experiment"$edittrain.py#gitadd,commit,andpushyourchanges$gitadd.&&commit-m"Normalizedfeatures"$gitpushoriginexperiment(3)检测到Push,GitHub立即在其中一台电脑上运行.yaml文件函数.(4)GitHub弹出通知,功能是否运行成功。在GitHub存储库的“操作”选项卡中找到以上内容。就这么简单!只需更新代码,将更新提交到数据库,工作流就会自动执行。回到第一步中提到的特殊.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指令有很多,但大部分都是从一个Action到另一个——你可以复制这个GitHubActions指南,记得在“运行”部分填写工作流程。如果文件在项目存储库中,每当GitHub检测到代码更新(通过推送更改)时,GitHubActions将部署一个Ubuntu服务器,尝试执行安装所需的命令并运行Python脚本。请注意,项目存储库中必须有工作流要求的文件——这里是requirements.txt和train.py!获得更好的反馈自动训练很酷,但为所有结果采用易于理解的格式也很酷非常重要。GitHubActions现在允许以纯文本形式访问服务器日志。GitHubActions日志的示例打印输出但是理解模型性能是一件棘手的事情。模型和数据都是高维和非线性的——没有图片都很难理解。我可以展示一种将数据可视化放入CI循环的方法。最近几个月,我在Iterative.ai的团队(做数据版本控制)一直在开发一个工具包,以方便在机器学习项目中使用GitHubActions和GitLabCI,称为连续机器学习(ContinuousMachineLearning,简称CML)。这是开源且免费的。该团队的基本理念是:“使用GitHubActions训练机器学习模型”。我们构建了提供更详细报告而不是成功/失败通知的功能。CML有助于在报告中放置图片和表格,例如SciKit-learn生成的混淆矩阵:在GitHub中点击PullRequest以显示此报告。为了制作报告,GitHubActions执行Python模型训练脚本并使用CML函数使模型准确率和混淆矩阵写入markdown文件。然后CML将markdown文件上传到GitHub。修改后的.yaml文件包含以下工作流程(新添加的行以粗体突出显示)。名称: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#addourconfusionmatrixconfsion-publ_png--mpng>>报告。md#sendthereporttoGitHubfordisplaycml-send-commentreport.md请记住,.yaml现在包含更详细的配置信息,例如特殊的Docker容器和环境变量,以及一些要运行的新代码。每个CML项目中容器和环境变量的细节都是固定的,用户无需操作,只关注代码。通过将这些CML函数添加到工作流中,我们在CI系统中创建了一个更完整的反馈循环:创建一个Git分支,更新分支上的代码。自动训练模型并生成指标(准确性)和可视化(混淆矩阵)。将这些结果嵌入合并请求中的可视化报告中。当你和你的队友还在考虑更新是否有助于实现你的建模目标时,各种参考视觉表盘已经新鲜出炉。此外,该报告通过Git连接到确切的项目版本(数据和代码)、用于训练的服务器以及服务器的日志。难以置信的详细!工作区不再不断浮动与代码无关的图表。这是数据科学项目中CI的基本概念。需要说明的是,这只是使用CI的最简单示例。在实际操作中,很可能会遇到各种比较复杂的情况。CML还具有允许您使用存储在GitHub存储库外部的大型数据集(使用DVC)并在云端而不是默认的GitHubActions服务器中训练它们的功能。这意味着能够使用GPU和其他专门设置。例如,我使用GitHubActions创建了一个项目来部署一个EC2GPU,然后训练一个神经风格迁移模型。这是我的CML报告:你也可以使用自己的Docker容器来进一步模拟CI关于机器学习的最终想法总而言之,DevOps不是一种特定的技术。它既是理论,也是一套对软件开发过程进行彻底再造的原则和实践,其有效性在于解决团队合作和测试新代码的系统瓶颈。未来,随着数据科学越来越成熟,在机器学习项目中掌握DevOps原理的人将更加抢手——薪水可观,组织影响力大。持续集成是DevOps的基础,也是建立具有可靠自动化、快速测试和团队自治的文化的已知最有效方法之一。GitHubActions或GitLabCI等系统启用CI。这些服务可用于构建自动化模型训练系统。它有很多好处:代码、数据、模型和训练基地(硬件和软件环境)都是git版本。自动化工作,进行高频测试并获得快速反馈(使用CML获得可视化报告)。从长远来看,这无疑会加速项目的发展。CI系统允许每个团队成员看到工作进度。您无需绞尽脑汁收集性能最佳的代码、数据和模型。图片来源:一旦unsplash入坑,一键gitcommit即可自动进行模型训练、记录和报告,绝对让你乐在其中。动起来,感觉棒极了!
