构建 CI/CD 流水线

本文档解释了如何构建 CI/CD 流水线,以使用 GitHub Actions 在 BentoCloud 上自动化部署 BentoML 服务

仓库结构

按照以下方式组织您的 GitHub 仓库,这里是一个示例

bentocloud-cicd-example/
├── service.py             # Your BentoML Service
├── deployment.yaml        # Deployment config on BentoCloud
├── requirements.txt       # (Optional) Python dependencies
├── README.md              # Project documentation
└── .github/
    └── workflows/
        ├── code-update.yml         # Handles code or general changes
        └── deployment-config.yml   # Handles Deployment config changes

先决条件

  • 您必须拥有一个 BentoCloud 账户。在此注册(如果您还没有账户)。

  • 创建一个API Token。对于生产流水线,我们建议使用组织 API token 以确保持续性。

  • 在您的 GitHub 仓库中,前往 Settings > Secrets and variables > Actions > Secrets 并添加以下内容

    • BENTOCLOUD_API_TOKEN: 您的 BentoCloud API token。

    • DEPLOYMENT_NAME: 您在 BentoCloud 上的部署名称。

    • DEPLOYMENT_URL: 您的部署的端点 URL。

    • BENTOML_VERSION: (可选)要安装的 BentoML 版本。默认为最新版本。

GitHub Actions

此示例包含两个工作流。触发后,它们将:

  1. 设置环境并安装依赖项

  2. 更新您现有的 BentoML 部署

  3. 等待部署就绪

  4. 执行测试推理

code-update.yml

main 分支发生除 deployment.yaml 外的任何更改时,此工作流会触发。您可以使用它来处理一般的代码更改

code-update.yml
name: Update Code

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths-ignore:
      - 'deployment.yaml'

jobs:
  update-code:
    runs-on: ubuntu-latest

    env:
      BENTOML_VERSION: ${{ secrets.BENTOML_VERSION }}

    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Install BentoML
        run: |
          python -m pip install --upgrade pip
          if [ -z "$BENTOML_VERSION" ]; then
            pip install bentoml
          else
            pip install "bentoml==$BENTOML_VERSION"
          fi
          pip install huggingface_hub

      - name: Log in to BentoCloud
        run: |
          echo "Logging in to BentoCloud"
          bentoml cloud login --api-token ${{ secrets.BENTOCLOUD_API_TOKEN }}

      - name: Deploy and Run Test Inference
        shell: python
        run: |
          import bentoml

          deployment = bentoml.deployment.update(
              name="${{ secrets.DEPLOYMENT_NAME }}",
              bento=".",
          )

          code = deployment.wait_until_ready(timeout=60)
          if code != 0:
              raise RuntimeError("Deployment did not become ready in time.")

          client = deployment.get_client()
          response = client.summarize(text="This is a sample prompt for testing.")
          print(response)

deployment-config.yml

仅当 deployment.yaml 更改时,此工作流才会触发。deployment.yaml 包含 BentoCloud 上的部署配置,例如副本扩缩、GPU 实例类型和更新策略。您只需在该文件中指定要更新的字段。

deployment-config.yml
name: Update Deployment Config

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - 'deployment.yaml'

jobs:
  update-deployment-config:
    runs-on: ubuntu-latest

    env:
      BENTOML_VERSION: ${{ secrets.BENTOML_VERSION }}

    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Install BentoML
        run: |
          python -m pip install --upgrade pip
          if [ -z "$BENTOML_VERSION" ]; then
            pip install bentoml
          else
            pip install "bentoml==$BENTOML_VERSION"
          fi

      - name: Log in to BentoCloud
        run: |
          echo "Logging in to BentoCloud"
          bentoml cloud login --api-token ${{ secrets.BENTOCLOUD_API_TOKEN }}

      - name: Deploy and Run Test Inference
        shell: python
        run: |
          import bentoml

          deployment = bentoml.deployment.update(
              name="${{ secrets.DEPLOYMENT_NAME }}",
              config_file="deployment.yaml",
          )

          code = deployment.wait_until_ready(timeout=60)
          if code != 0:
              raise RuntimeError("Deployment did not become ready in time.")

          client = deployment.get_client()
          response = client.summarize(text="This is a sample prompt for testing.")
          print(response)

构建用于 ML 项目的 CI/CD 流水线

在 ML 项目中,模型通常比代码更改更频繁,这通常是由于新的训练数据或参数调优。

一旦您的新模型保存并推送到 BentoCloud,您需要触发部署工作流。然而,如果在上述示例中您的服务代码或部署配置没有更改,GitHub Actions 不会自动触发。

以下是基于模型更新触发 CI/CD 工作流的常用策略:

  • 在 GitHub 中手动触发工作流。这避免了复杂性,对于轻量级用例效果良好,例如:

    • 您总是使用latest模型版本(例如 model_name:latest

    • 您只管理单个模型/部署

    • 模型更新不频繁或可以手动验证

  • 提交模型元数据文件。对于更灵活和自动化的工作流:

    • 在文件中跟踪模型标签(例如 model_tag.txt

    • 使用模板参数或环境变量将模型标签传递给您的服务

    • 在该文件的提交上触发您的工作流

    这为管理不同的模型、版本或部署目标提供了细粒度的控制。

  • 调用 GitHub API 触发工作流。这使您可以从外部系统(如 ML 训练流水线,例如 Airflow 或自定义脚本)启动工作流。它提供了从训练 → 模型注册 → 部署的完全自动化,并支持版本化或条件部署,而无需提交代码。有关更多信息,请参阅GitHub API 文档

更多资源