机器学习CI/CD:用GitHub动作测试和部署您的ML模型
回到博客主页

机器学习CI/CD:用GitHub动作测试和部署您的ML模型

CI / CD 2022年6月8日

动机

假设您的公司正在创建一个M雷竞技网址是L驱动的服务。作为一名数据科学家,您可能会尝试不断改进现有的ML模型。

找到更好的模型后,如何确保在部署新模型时服务不会中断?

如果你能创建一个这样的工作流程不是很好吗:

  • 自动测试来自团队成员的pull请求
  • 当所有测试都通过时合并pull请求
  • 将ML模型部署到现有的服务?
https://cdn -图像- 1. - medium.com/max/800/1 * VZLOx6sCq9_Dj1-44mxKOQ.png

在本文中,您将学习如何使用GitHub动作创建这样的工作流。

什么是GitHub动作?

GitHub的行为允许您自动化工作流程,加快构建、测试和部署代码的速度

一般来说,工作流看起来类似于下面的内容:

名称:工作流名称#工作流的名称:push #定义哪些事件可以导致工作流运行jobs: #定义一个作业列表first_job: #作业名称的ID: First job #作业的名称running -on: ubuntu-latest #运行作业的机器名称:steps:…second_job: name: Second Job runs-on: ubuntu-latest steps:…

从上面的代码中有3个重要的概念需要理解:

  • 当一个事件发生(例如push或pull请求)时,a工作流一个或多个的工作将会被激发
  • 工作独立的彼此的。每一个工作是一套步骤它在自己的虚拟机运行程序中或在容器中运行。
  • 步骤依赖并按顺序执行。
https://cdn -图像- 1. - medium.com/max/800/1 * sE4nHMwuBhN2bp4gLdUpvA.png

让我们在接下来的几节中更深入地讨论这些概念。

找到最佳参数

ML项目的第一步包括在非主分支中试验不同的参数和模型。在前一篇文章中,我提到了如何使用MLFlow+DagsHub记录您的实验。

DagsHub:为数据科学家和ML工程师提供的GitHub补充

https://cdn -图像- 1. - medium.com/max/800/1 * AVtGMnz8_2K3dOtQAKCTdQ.png

链接到上面展示的实验。

一旦我们找到了比生产中现有模型性能更好的参数和模型的组合,我们就创建一个pull请求来将新代码与主分支合并。

测试代码,ML模型,和GitHub动作的应用程序

为了确保合并新代码不会导致任何错误,我们将创建一个自动测试提交代码的工作流,只允许通过所有测试的代码与主分支合并。

https://cdn -图像- 1. - medium.com/max/800/1 * hYBqiJuqZ7qL0R6CZrRtgA.png

我们将在下面的YAML文件中编写一个新的工作流.github /工作流

.github├──工作流├──test_code.yaml

指定的事件

在这个工作流中,我们使用要指定工作流只运行:

  • 如果一个事件是一个拉请求。
  • 提交文件的路径是否匹配某些模式。
当一个或多个路径匹配下面列出的模式时运行- config/** - training/** - application/** - .github/workflow /test_code.yaml

指定的步骤

接下来,创建一个名为test_code,它由按顺序执行的几个步骤组成。

test_model: name: Test new model run -on: ubuntu-latest steps:…

最初的几个步骤将在运行代码之前设置环境。

- name: Checkout # Checkout a repo uses: actions/checkout@v2 - name: Environment setup #设置特定版本的Python使用:actions/setup-python@v2 with: Python -version: 3.8 cache: pip - name: cache #缓存依赖使用:actions/cache@v2 with: path: ~/。缓存/pip键:${{runner。os}} pip - $ {{hashFiles (* * / dev-requirements.txt)}} restore-keys: ${{跑步者。os}}-pip- - name:安装包#安装依赖运行:pip Install -r dev- required .txt - name: Pull data #从远程存储获取数据运行:| dvc remote modify origin——local auth basic dvc remote modify origin——local user khuyentran1401 dvc remote modify origin——本地密码MyScretPassword dvc Pull -r origin train_model .txt

以上代码的语法解释:

  • 的名字:你的台阶的名称。
  • 使用选择一个行动,这是一个执行复杂但经常重复的任务的应用程序。你可以从成千上万的行动中选择一个行动GitHub市场
  • 插入操作所需的输入参数。
  • 运行使用shell运行命令行程序。

步骤说明:

https://cdn -图像- 1. - medium.com/max/800/1 * Kce98VX0YywaGtA8mfMhkQ.png
  • 结帐签出存储库,以便工作流可以访问存储库中的文件。
  • 环境设置为您的工作流程设置一个Python环境(我选择了Python 3.8)。
  • 缓存缓存依赖项,这样您就不需要每次运行工作流时都安装依赖项。
  • 安装包安装代码成功运行所需的所有依赖项。
  • 提取数据验证并从远程存储提取数据。这里,我的远程存储DagsHub

注意,将用户名和密码放在每个人都能看到的脚本中是有风险的。因此,我们将使用加密的秘密来隐藏这些机密信息。

加密机密

秘密是在存储库中创建的加密环境变量。要创建秘密,请转到存储库,然后单击设置秘密行动新的存储库的秘密

https://cdn -图像- 1. - medium.com/max/800/1 ied3_lyiwvtoa62a4ghna.png * 1
https://cdn -图像- 1. - medium.com/max/800/1 * wx2B0GMecHvQjfY3KCZ0HA.png

插入秘密的名称和与此名称相关联的值。

https://cdn -图像- 1. - medium.com/max/800/1 * XWj50AopXzQIfT2eE91YKw.png

现在你可以知道这个秘密了DAGSHUB_USERNAME使用${{秘密。DAGSHUB_USERNAME}}

步骤:……—name: Pull data run: | dvc remote modify origin——local auth basic dvc remote modify origin——local user ${{secrets。dvc远程修改来源——本地密码${{secrets. txtdvc pull -r origin train_model

运行测试

https://cdn -图像- 1. - medium.com/max/800/1 * Prnyik5wQ2A5ciZP2NmRhw.png

我们的代码有两部分:训练模型和部署模型。我们将编写一些步骤,以确保这两个部分都能正常运行,没有任何错误,并按预期工作。

下面是测试处理代码和ML模型的步骤:

步骤:……- name:运行培训测试运行:pytest培训/测试

具体来说,我们将测试处理代码和ML模型。

找到所有测试在这里

测试部署代码的步骤包括:

  • 将模型保存到BentoML本地商店
步骤:……—name:保存模型到BentoML本地存储run: python application/src/save_model_to_bentoml.py
https://cdn -图像- 1. - medium.com/max/800/1 * L-A3N2YkY93KVxJ_TwSKfQ.png
  • 在本地运行应用程序并运行测试以确保应用程序如我们预期的那样工作。
步骤:……运行:| bentoml Serve ./application/src/create_service.py:service & sleep 10 pytest application/tests kill -9 ' lsof -i:3000 -t '

注意:在这里,我们使用BentoML

将此工作流添加并提交到GitHub上的主分支。

Git add .github Git commit -m 'add workflow' Git push origin master

添加规则

以确保代码可以被合并只有当工作流成功运行,选择设置分支机构添加规则

https://cdn -图像- 1. - medium.com/max/800/1 * DrkEJHUQnk3vQ6bu_LlaNg.png

添加作为分支名称模式,选中要求在合并之前通过状态检查,然后在下面添加工作流的名称需要的状态检查.最后,点击保存更改

https://cdn -图像- 1. - medium.com/max/800/1 * jfziFo6HMl1qftAQTK22CQ.png

现在,当你创建一个pull request时,GitHub Actions会自动运行工作流测试新模型.如果检查不通过,就不能合并pull请求。

https://cdn -图像- 1. - medium.com/max/800/1 * IGfW1WktyiNDW3oKBhf8BA.png

点击细节将显示运行状态。

https://cdn -图像- 1. - medium.com/max/800/1 * uX7VPXtVLn3rTlFP7F1Chg.gif

测试培训代码的完整代码:

测试新模型:pull_request: paths: - config/** - training/** - application/** - .github/工作流/test_training。yaml jobs: test_model: name: Test new model runs-on: ubuntu-latest steps: - name: Checkout id: Checkout uses: actions/checkout@v2 - name: Environment setup uses: actions/setup-python@v2 with: python-version: 3.8 cache: pip - name: cache uses: actions/cache@v2 with: path: ~/缓存/pip键:${{runner。os}} pip - $ {{hashFiles (* * / dev-requirements.txt)}} restore-keys: ${{跑步者。os}}-pip- - name:安装包运行:pip Install -r dev- requests .txt - name: Pull data运行:| dvc remote modify origin——local auth basic dvc remote modify origin——local user ${{secrets. txtdvc远程修改来源——本地密码${{secrets. txtdvc pull -r origin train_model- name:运行培训测试运行:pytest培训/测试—name:保存模型到BentoML本地存储run: python application/src/save_model_to_bentoml.py运行:| bentoml Serve ./application/src/create_service.py:service & sleep 10 pytest application/tests kill -9 ' lsof -i:3000 -t '

在合并GitHub动作时部署一个ML模型

合并pull请求后,模型应该自动部署到现有服务。让我们创建一个GitHub工作流来做到这一点。

从创建另一个工作流开始deploy_app.yaml

.github├──工作流├──deploy_app.├─yaml└──test_model.yaml

工作流的前几个步骤与前面的工作流相似:

https://cdn -图像- 1. - medium.com/max/800/1 * Kce98VX0YywaGtA8mfMhkQ.png
—主路径:—config/**—training/**—application/**—.github/workflow /deploy_app. name: Deploy App on: push: branch:—主路径:—config/**—training/**—application/**—。yaml jobs: deploy_app: name: Deploy App runs-on: ubuntu-latest steps: - name: Checkout id: Checkout uses: actions/checkout@v2 - name: Environment setup uses: actions/setup-python@v2 with: python-version: 3.8 cache: pip - name: cache uses: actions/cache@v2 with: path: ~/。缓存/pip键:${{runner。os}} pip - $ {{hashFiles (* * / dev-requirements.txt)}} restore-keys: ${{跑步者。os}}-pip- - name:安装包运行:pip Install -r dev- requests .txt - name: Pull data运行:| dvc remote modify origin——local auth basic dvc remote modify origin——local user ${{secrets. txtdvc远程修改来源——本地密码${{secrets. txtdvc pull -r origin train_model—name:保存模型到BentoML本地存储run: python application/src/save_model_to_bentoml.py

我们也使用env向工作流中添加环境变量。环境变量将在工作流的某些步骤中使用。

设置环境变量HEROKU_API_KEY: ${{secrets。HEROKU_EMAIL: ${{secrets。HEROKU_EMAIL}}

接下来,我们使用BentoML对模型进行容器化,然后将其部署到Heroku

https://cdn -图像- 1. - medium.com/max/800/1 * gb37ASDRRILsKJYe3CBFyw.png
步骤:……- name: Build Bentos运行:bentoml Build - name: Heroku登录证书运行:| cat > ~/.netrc <
部署应用程序的完整代码

将此工作流添加并提交到GitHub上的主分支。

Git add .github Git commit -m 'add workflow' Git push origin master

当你合并一个pull请求时,一个工作流叫做部署应用程序将运行。单击,查看工作流的状态行动→最新工作流的名称→部署应用程序

https://cdn -图像- 1. - medium.com/max/800/1 * Xn0lBO9RPTLR_OAGH_iamA.png
https://cdn -图像- 1. - medium.com/max/800/1 * swZBvkbKvUCoejcoPVCLDA.png

现在你应该看到你的工作流正在运行:

https://cdn -图像- 1. - medium.com/max/800/1 w4btvmh-jts1le9kt-4ka.gif * 2

太酷了!的网站对于这个应用程序,现在更新!

https://cdn -图像- 1. - medium.com/max/800/1 * R9DjDXg0ahPbsyTWSOGUSw.png

自从我Streamlit应用向上面的URL发出POST请求来生成预测,应用程序也会更新。

预测=请求。Post ("", header ={"content-type": "application/json"}, data=data_json,).text[0] . json
https://cdn -图像- 1. - medium.com/max/800/1 * puxBBbPXeg-YEP3UhCL95g.gif

结论

恭喜你!您刚刚学习了如何使用GitHub操作创建工作流,自动测试来自团队成员的拉请求,并将ML模型部署到现有服务。我希望这篇文章能激励您使用GitHub Actions自动化您的任务。

本文的源代码可以在这里找到:

khuyentran1401 / employee-future-prediction

参考

使用github动作部署到Heroku.remarkablemark。(2021年3月12日)。2022年5月31日,从https://remarkablemark.org/blog/2021/03/12/github-actions-deploy-to-heroku/

加尔维斯,J.(2020年8月12日)。使用github动作在REST API上进行集成测试.媒介。2022年5月31日,从https://medium.com/weekly-webtips/using-github-actions-for-integration-testing-on-a-rest-api-358991d54a20

Ktrnka。(无日期)。Ktrnka/MLOPS_EXAMPLE_DVC:使用DVC、S3和Heroku的Mlops示例.GitHub。2022年5月31日,从https://github.com/ktrnka/mlops_example_dvc

标签

太棒了!您已经成功订阅。
太棒了!接下来,完成签出以获得完全访问权限。
欢迎回来!您已经成功登录。
成功!您的帐户已完全激活,您现在可以访问所有内容。