构建 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¶
此示例包含两个工作流。触发后,它们将:
设置环境并安装依赖项
更新您现有的 BentoML 部署
等待部署就绪
执行测试推理
code-update.yml
¶
当 main
分支发生除 deployment.yaml
外的任何更改时,此工作流会触发。您可以使用它来处理一般的代码更改
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 实例类型和更新策略。您只需在该文件中指定要更新的字段。
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 文档。