bodywork-core
让 ML 工程师专注模型本身,在 Kubernetes 上用 Python 模块一键部署 ML 流水
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
让 ML 工程师专注模型本身,在 Kubernetes 上用 Python 模块一键部署 ML 流水
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一个场景:你的 ML 团队训练好了模型,想要部署到生产环境提供服务,却不得不和 YAML 大战三百回合,学习 Kubernetes 的 Job、CronJob、Deployment、Service、Ingress 一堆概念,还要写 Dockerfile、构建镜像、配置 RBAC。光是把这些跑通,一个星期就过去了。
Bodywork 做的事情,就是把这层复杂度全部吃掉。它是一个命令行工具,让你只需要两样东西:一个 Python 模块(或 Jupyter Notebook)和一个 bodywork.yaml 配置文件。剩下的容器化、编排、调度,全部交给 Bodywork 处理。
图1:Bodywork CLI 终端界面 — 简洁直观的工作流执行日志
Bodywork 将 ML 流水线抽象为两个基本单元:
Batch Job(批处理任务):适用于数据预处理、模型训练、批量推理等一次性工作。Bodywork 会在 K8s 集群上创建一个 Job,完成后自动清理。
Service(在线服务):适用于模型推理服务(Flask/FastAPI 等 Web 服务)。Bodywork 会在 K8s 上创建 Deployment + Service + Ingress,暴露 HTTP 端点供外部调用,并支持多副本水平扩展。
这两种类型的 Stage 可以自由组合成 DAG(有向无环图),用简单的 >> 符号连接,就构成了完整的 ML 流水线。
Bodywork 的架构分为两部分:本地 CLI 层和远程 K8s 执行层。
本地 CLI 层基于 Typer(类似 FastAPI 的 CLI 框架),提供 bw 命令行工具,核心子命令包括:
bw workflow run — 立即执行一个工作流bw cronjob create — 创建定时 ML 流水线(CronJob)bw stage run — 单独运行某个 Stagebw deployment create — 创建一个模型服务bw secret create/update/delete — 管理 K8s Secrets(如数据库密码、API Key)远程执行层通过 Python 的 kubernetes 客户端库直接操作 K8s API。核心文件包括:
src/bodywork/workflow_execution.py — 工作流调度引擎,解析 DAG、管理 Stage 间的数据传递、处理失败重试src/bodywork/stage_execution.py — 单 Stage 执行器,支持 .py 模块和 .ipynb Notebook 两种格式,底层使用 nbconvert 执行 Notebooksrc/bodywork/k8s/batch_jobs.py — K8s Job/CronJob 创建与监控src/bodywork/k8s/deployments.py — K8s Deployment/Service/Ingress 创建与扩缩容src/bodywork/git.py — 从 Git 仓库拉取项目代码(支持 SSH 密钥认证)version: "1.1"
pipeline:
name: my-ml-pipeline
docker_image: bodyworkml/bodywork-core:latest
DAG: stage_1_preprocess >> stage_2_train >> stage_3_serve
stages:
stage_1_preprocess:
executable_module_path: pipeline/preprocess.py
requirements: [pandas, scikit-learn]
cpu_request: 0.5
memory_request_mb: 100
batch:
max_completion_time_seconds: 300
retries: 2
stage_2_train:
executable_module_path: pipeline/train.py
requirements: [scikit-learn, joblib, boto3]
cpu_request: 1.0
memory_request_mb: 500
batch:
max_completion_time_seconds: 1800
retries: 1
stage_3_serve:
executable_module_path: pipeline/serve.py
requirements: [flask, joblib, numpy]
cpu_request: 0.25
memory_request_mm: 100
service:
max_startup_time_seconds: 60
replicas: 2
port: 5000
ingress: true
这个文件就是流水线的全部配置。Stage 的 requirements 字段会自动在容器启动前 pip install,无需手动构建镜像。
图2:Bodywork 项目的标准目录结构 — 只需 Python 模块 + bodywork.yaml
Bodywork 的定位介于"全功能 MLOps 平台"和"手写 K8s YAML"之间:
| 维度 | Bodywork | Kubeflow | Argo Workflows | Airflow |
|---|---|---|---|---|
| 上手难度 | 低 | 极高 | 高 | 中 |
| 占用资源 | 轻量 | 重量级 | 轻量 | 中 |
| 学习曲线 | 陡峭 | 极陡峭 | 陡峭 | 平缓 |
| 适用规模 | 小/中团队 | 大企业 | 中/大团队 | 大团队 |
| Notebook 支持 | ✅ | ✅ | ❌ | ❌ |
| Web UI | 无(CLI 工具) | 完整 | 有限 | 完整 |
Bodywork 的哲学是:让 ML 工程师专注模型本身,而不是 Kubernetes。它不提供复杂的 Web UI 或实验追踪系统(这些可以搭配 MLflow、Weights & Biases 等工具),而是专注于流水线编排这一件事。
Bodywork 核心代码约 7000 行 Python,组织清晰:
typing.cast() 和 Callable[..., None] 装饰器BodyworkWorkflowExecutionError 等),CLI 层有装饰器统一捕获 K8s API 异常不足之处:setup.py 中硬编码了一个遥测 URL(k8s.bodyworkml-dev.com)用于统计安装量,AGPL 许可可能对企业不友好(需注意传染性)。
Bodywork 不是"一键安装"的工具,它是一个CLI 客户端,需要目标环境满足:
kubectl 已配置好上下文pip install bodywork(这只安装客户端)bw workflow run https://github.com/your/project.git对于没有 K8s 集群的用户,建议使用 Minikube 或 Kind 在本地搭建测试环境。
Bodywork 代表了一种 MLOps 民主化的趋势:降低 ML 流水线部署的门槛,让更多团队不需要专门的 DevOps 工程师也能在生产环境跑 ML。随着 Kubernetes 成为事实标准,类似 Bodywork 这样"构建在 K8s 之上的易用抽象层"会越来越受欢迎。从 2020 年发布至今持续维护,GitHub 436 颗星,虽然体量不大,但在 MLOps 工具链中占据了一个清晰的生态位。