GitHub Actions 的机器学习推理上线,推进测试部署高度自动化

简介: 在看到最近新推出的 GitHub Actions 后,我的第一个想法是创建一个简单的示例项目,在这个项目中,我们“部署”一个使用了这个新特性的机器学习模型。当然,这不是一个“真正的部署”,但是可用此模型在存储库中测试你的模型,而不需要任何额外的编码。

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

在看到最近新推出的 GitHub Actions 后,我的第一个想法是创建一个简单的示例项目,在这个项目中,我们“部署”一个使用了这个新特性的机器学习模型。当然,这不是一个“真正的部署”,但是可用此模型在存储库中测试你的模型,而不需要任何额外的编码。

GitHub Actions 是一个用于构建、测试和部署的自动化工具。举个例子快速了解下它是什么:每次你创建一个 Pull Request(带有某个标签)时,都会触发新的应用程序构建,然后它可以向高级开发人员发送消息,让他们快速查看代码。

项目地址:
https://github.com/gaborvecsei/Machine-Learning-Inference-With-GitHub-Actions

我们将创建什么?

在存储库上创建一个自定义操作和自动化工作流,你可以在其中使用经过训练的模型,并在某个问题有了新评论时触发它。你还可以找到模型训练和推理代码。我想要超级硬核,所以我选择了 Iris 数据集和随机森林分类器。这个树集成模型经过训练,可以根据萼片和花瓣的长度和宽度来识别花朵。

这个模型的训练是在 Jupyter Notebook 上完成的。这些代码训练并序列化我们将用于预测的模型。当问题收到评论时,GitHub Actions 工作流将被触发。如果评论包含前缀 /predict,那么我们就开始解析评论,然后我们做一个预测并构造一个回复。最后一步,该消息由机器人在相同的问题下发回给用户。为了把事情做得更好,整个自定义操作将在 Docker 容器中运行。

3A1469CC_0DC2_4eb4_8AF7_2CA25BDF5DFD

我们将找出工作流中的步骤,并为某些步骤创建单独的操作。一个工作流可以包含多个操作,但是在这个项目中,我们将使用单个操作。

创建一个操作

第一步,我们应该在名为 action.yaml 的根文件夹中创建操作。在这里,我们可以描述 inputs、outputs 和运行环境。

name: 'Prediction GitHub Action Test'
description: 'This is a sample with which you can run inference on a ML model with a toy dataset'
inputs:
  issue_comment_body:
    required: true
    description: 'This is the Github issue comment message'
  issue_number:
    required: true
    description: 'Number of the Github issue'
  issue_user:
    required: true
    description: 'This user send the comment'
outputs:
   issue_comment_reply:
     description: 'Reply to the request'
runs:
   using: 'docker'
   image: 'Dockerfile'
    args:    
        - ${{ inputs.issue_comment_body }}
        - ${{ inputs.issue_number }}
        - ${{ inputs.issue_user }}  

从上到下,你可以看到定义好的 3 个输入和 1 个输出。最后,runs 键描述了我们的代码将要在其中运行的环境。这是一个 Docker 容器,其输入将作为参数传入。因此,容器的入口点应该按照定义的顺序接受这 3 个参数。

容器

如果我们仔细查看 Dockerfile,就可以看到我们的运行环境是如何构建的。首先,我们安装所有 Python 需要的东西。然后复制 entrypoint.sh 并使其可执行,这样它就可以在容器内运行了。最后,序列化的 sklearn 模型文件被复制到容器中,这样,我们就可以使用它来进行预测。(在真实的场景中,不应该将模型文件存储在存储库中。这只是为了可以快速演示。)

FROM python:3.6

# Install python requirements
COPY requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

# Setup Docker entrypoint script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Copy the trained model
COPY random_forest_model.pkl /random_forest_model.pkl

ENTRYPOINT ["/entrypoint.sh"]

定义工作流

1637063A_401F_4a60_B1A2_763926359CAD

没有工作流就不能使用操作。它定义了你希望在管道中采取的不同步骤。

name: Demo
on: [issue_comment]

jobs:
    my_first_job:
        runs-on: ubuntu-latest
        name: Just a simple demo job
        steps:
            - name: Checkout
              uses: actions/checkout@master
            - name: See full payload (for debugging)
              env:
                  PAYLOAD: ${{ toJSON(github.event) }}
              run: echo "FULL PAYLOAD:\n${PAYLOAD}\n"
            - name: Run the container and make a prediction
              if: startsWith(github.event.comment.body, '/predict')
              uses: ./
              id: make_prediction
              with:
                  issue_comment_body: ${{ github.event.comment.body }}
                  issue_number: ${{ github.event.issue.number }}
                  issue_user: ${{ github.event.comment.user.login }}
            - name: Print the output from the container(for debugging)
              run: echo "The reply message is ${{steps.make_prediction.outputs.issue_comment_reply}}"
            - name: Send reply to issue for user
              env:
                GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
              run: bash issue_comment.sh "steps.makeprediction.outputs.issuecommentreply""{{ github.event.issue.number }}"

首先,on: [issue_comment] 定义了我希望在接收到某个问题的评论(任何人提出的任何问题)时触发这个流。然后,我通过 runs-on: ubuntu-latest 定义了运行的 VM 类型(它可以是自托管的,也可以是由 GitHub 提供的)。接下来是有趣的部分,我之前提到的步骤。

  • 签出步骤:在这个步骤中,我们将移到存储库中所需的分支上(这也是一个 github 操作)。
  • 查看有效负载:我在这里把它用于调试。在问题下收到评论后,它显示整个有效负载,包括这个容器、评论、问题编号、留下评论的用户等等。
  • 做出预测:这是我们的自定义动作。代码行 if: startsWith(github.event.comment.body,’/predict’) 确保只有在出现有效的预测请求时才运行这个步骤(包含前缀 /predict)。你可以看到,输入是在 with 关键字下定义的,而值是通过它们的键(如 github.event.comment.body)从负载中添加的。
  • 打印应答:构造的应答被回显到日志。它使用前面的步骤中定义的输出:steps.make_prediction.output .issue_comment_reply。
  • 发送应答:创建的应答中包含预测,将使用脚本 issue_comments .sh 作为应答发送。

每个步骤都在指定的运行器 ubuntu-latest 上运行,但是我们的操作在创建的容器中运行。此容器是在工作流被触发时构建的。(我本来可以缓存它,这样每次流运行时就可以使用以前构建的映像,但是我还是懒得将它添加到这个示例中)。

做出预测

有一件事我没有谈到:预测是如何做出的?你可以通过查看 main.py 脚本轻松地解决这个问题。
model = load_model("/random_forest_model.pkl")

try:
    sepal_length, sepal_width, petal_length, petal_width = parse_comment_input(args.issue_comment_body)
    predicted_class_id = make_prediction(model, sepal_length, sepal_width, petal_length, petal_width)
    predicted_class_name = map_class_id_to_name(predicted_class_id)
    reply_message = f"Hey @{args.issue_user}!<br>This was your input: {args.issue_comment_body}.<br>The prediction: **{predicted_class_name}**"
except Exception as e:
    reply_message = f"Hey @{args.issue_user}! There was a problem with your input. The error: {e}"

print(f"::set-output name=issue_comment_reply::{reply_message}")

看到上面的内容,可能你就会觉得这太简单了:输入、数据集、模型、模式存储、如何处理请求等等。例如,对于图像输入,你可以从一个 base64 字符串解码,然后通过存储在 GitLFS 中的深度学习模型运行它。那么,就动手实际操作下吧。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-03-31
本文作者:Gábor Vecsei
本文来自:“InfoQ”,了解相关信息可以关注“InfoQ

相关文章
|
10月前
|
人工智能 自然语言处理 运维
【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型
月之暗面发布开源模型Kimi K2,采用MoE架构,参数达1T,激活参数32B,具备强代码能力及Agent任务处理优势。在编程、工具调用、数学推理测试中表现优异。阿里云PAI-Model Gallery已支持云端部署,提供企业级方案。
583 0
【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型
|
机器学习/深度学习 人工智能 JSON
【解决方案】DistilQwen2.5-R1蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式的机器学习和深度学习平台,对DistilQwen2.5-R1模型系列提供了全面的技术支持。无论是开发者还是企业客户,都可以通过 PAI-ModelGallery 轻松实现 Qwen2.5 系列模型的训练、评测、压缩和快速部署。本文详细介绍在 PAI 平台使用 DistilQwen2.5-R1 蒸馏模型的全链路最佳实践。
|
机器学习/深度学习 人工智能 自然语言处理
Cosmos on PAI系列一:PAI-Model Gallery云上一键部署NVIDIA Cosmos Reason-1
本篇文章介绍 Cosmos 最新世界基础模型 Cosmos Reason-1 如何在阿里云人工智能平台 PAI 上进行快速部署使用。
|
人工智能 JSON 算法
【解决方案】DistilQwen2.5-DS3-0324蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践
DistilQwen 系列是阿里云人工智能平台 PAI 推出的蒸馏语言模型系列,包括 DistilQwen2、DistilQwen2.5、DistilQwen2.5-R1 等。本文详细介绍DistilQwen2.5-DS3-0324蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践。
|
人工智能 运维 API
PAI-Model Gallery云上一键部署阶跃星辰新模型Step1X-Edit
4月27日,阶跃星辰正式发布并开源图像编辑大模型 Step1X-Edit,性能达到开源 SOTA。Step1X-Edit模型总参数量为19B,实现 MLLM 与 DiT 的深度融合,在编辑精度与图像保真度上实现大幅提升,具备语义精准解析、身份一致性保持、高精度区域级控制三项关键能力;支持文字替换、风格迁移等11 类高频图像编辑任务类型。在最新发布的图像编辑基准 GEdit-Bench 中,Step1X-Edit 在语义一致性、图像质量与综合得分三项指标上全面领先现有开源模型,比肩 GPT-4o 与 Gemin。PAI-ModelGallery 支持Step1X-Edit一键部署方案。
|
10月前
|
人工智能 自然语言处理 运维
【新模型速递】PAI-Model Gallery云上一键部署gpt-oss系列模型
阿里云 PAI-Model Gallery 已同步接入 gpt-oss 系列模型,提供企业级部署方案。
|
人工智能 自然语言处理 测试技术
UGMathBench:评估语言模型数学推理能力的动态基准测试数据集
近年来,人工智能蓬勃发展,自然语言模型(LLM)进展显著。语言模型被广泛应用于自动翻译、智能客服、甚至医疗、金融、天气等领域。而研究者们仍在不断努力,致力于提高语言模型的规模和性能。随着语言模型的蓬勃发展,评估一个语言模型的性能变得越来越重要。其中一个重要的评估指标,就是衡量语言模型的推理能力和解决数学问题的能力。
574 38
|
机器学习/深度学习 人工智能 自然语言处理
【新模型速递】PAI-Model Gallery云上一键部署MiniMax-M1模型
MiniMax公司6月17日推出4560亿参数大模型M1,采用混合专家架构和闪电注意力机制,支持百万级上下文处理,高效的计算特性使其特别适合需要处理长输入和广泛思考的复杂任务。阿里云PAI-ModelGallery现已接入该模型,提供一键部署、API调用等企业级解决方案,简化AI开发流程。
|
机器学习/深度学习 人工智能 JSON
DistilQwen-ThoughtX 蒸馏模型在 PAI-ModelGallery 的训练、评测、压缩及部署实践
通过 PAI-ModelGallery,可一站式零代码完成 DistilQwen-ThoughtX 系列模型的训练、评测、压缩和部署。
|
人工智能 自然语言处理 运维
【新模型速递】PAI一键云上零门槛部署DeepSeek-V3-0324、Qwen2.5-VL-32B
PAI-Model Gallery 集成国内外 AI 开源社区中优质的预训练模型,涵盖了 LLM、AIGC、CV、NLP 等各个领域,用户可以通过 PAI 以零代码方式实现从训练到部署再到推理的全过程,获得更快、更高效、更便捷的 AI 开发和应用体验。 现阿里云PAI-Model Gallery已同步接入DeepSeek-V3-0324、Qwen2.5-VL-32B-Instruct两大新模型,提供企业级部署方案。