如何用 GitHub Actions 触发数据→训练→评估→部署全链路?
解读
面试官想验证三件事:
- 你是否能把大模型特有的重算力、长耗时、合规敏感等特点融入 CI/CD;
- 能否在国内网络与合规环境下(GPU 机器在阿里云/华为云/本地机房、数据不出境、模型需备案)把 GitHub Actions 当“调度器”而非“执行器”;
- 是否具备LLMOps 分层理念:数据版本、模型版本、Prompt 版本、指标版本四线并行,任何一条变更都能触发最小闭环。
知识点
- workflow 触发器:push、pull_request、workflow_dispatch、schedule、repository_dispatch,以及国内常用的企业微信机器人 webhook;
- 矩阵与缓存:strategy.matrix 区分 pytorch2.1+cuda11.8 与 pytorch2.2+cuda12.1,actions/cache 缓存 transformers 模型快照与 pip 依赖;
- 自托管 Runner:在阿里云 ebmgn7i 裸金属或华为云 Ai1 实例上注册 runner,labels 设为 gpu-a100-80g×8,解决 GitHub 官方机器无 GPU 痛点;
- 分层制品:数据层用 DVC+OSS 做lfs 替代,模型层用 ModelScope-Hub 或 HuggingFace-Mirror 做私有仓,指标层用 MLflow 写SQLite+MinIO;
- 安全与合规:
- 使用阿里云 OIDC 连接,避免把 AK/SK 写进 GitHub secret;
- 训练日志通过脱敏脚本自动过滤手机号、地址等敏感实体;
- 部署前调用网信办算法备案接口做模型哈希校验,哈希值写入 release note;
- 长任务策略:训练 job 拆成 setup→train→checkpoint-push 三阶段,train 阶段用 nohup+systemd 守护,Actions 仅轮询状态,防止 6 小时 Job 超时;
- 评估关卡:引入模型安全评分卡(SafetyScore≥0.92)与业务指标( Rouge-L≥42、C-SCORE≥3.8),任何一项不过则阻断下游;
- 部署模式:
- 小流量灰度:通过阿里云 SAE 多版本做 5% 金丝雀;
- 大流量热更:使用 TorchServe+KServe 的 rolling_batch=continuous 模式,实现零中断切换;
- 通知与回滚:企业微信推送带模型版本二维码的卡片,一键回滚通过 repository_dispatch 触发 rollback.yml,30 秒内完成。
答案
给出一个可直接落地的最小可运行(MVP)方案,兼顾国内合规与 GPU 资源现状:
-
仓库结构
.github/workflows/ ├── data_pipeline.yml # 数据校验+版本标记 ├── train.yml # 训练+checkpoint 上传 ├── eval.yml # 评估+安全扫描 ├── deploy.yml # 服务化+灰度 └── rollback.yml # 应急回滚 data/ ├── raw.dvc # DVC 指针文件 model/ └── pretrained/ # 基线模型 src/ ├── train.py # 支持 deepspeed+accelerate ├── eval.py # 输出 jsonl 指标 └── deploy.py # 生成 k8s yaml -
自托管 Runner 注册(阿里云 ebmgn7i)
# 在 GPU 机器上 docker run -d --gpus all --restart=always \ -e RUNNER_TOKEN=*** \ -e RUNNER_WORKDIR=/actions-runner \ -e LABELS=gpu-a100-80g×8 \ summerwind/actions-runner:latest -
data_pipeline.yml(触发器:data/ 变更)
- 使用 dvc repro 生成新数据版本;
- 计算数据指纹(sha256),写入
data/meta.json; - 通过 repository_dispatch 触发下游 train.yml,附带
data_version参数。
-
train.yml(触发器:repository_dispatch & workflow_dispatch)
- job 级别:
runs-on: self-hosted, gpu-a100-80g×8; - 缓存:
/root/.cache/huggingface与/root/.cache/pip; - 训练命令:
deepspeed --num_gpus=8 src/train.py \ --data_version ${{ github.event.client_payload.data_version }} \ --output_dir /tmp/ckpt \ --save_steps 500 \ --hub_private_repo True \ --hub_model_id modelscope://mycompany/Llama3-8B-cn - 每 500 步自动 git push 一个 checkpoint tag,格式
ckpt-{sha}; - 训练结束写 MLflow run_id 到
train_run_id.txt作为制品上传。
- job 级别:
-
eval.yml(触发器:tag 以 ckpt- 开头)
- 拉取对应 checkpoint,运行 eval.py 输出:
metrics.json:rouge、bleu、csocre;safety_report.json:敏感词命中率、拒答率;
- 使用 github-script 读取指标,若 SafetyScore<0.92 或 Rouge-L<42,则
core.setFailed()阻断; - 通过 actions-ecosystem/action-add-labels 给 PR 自动打
eval-pass。
- 拉取对应 checkpoint,运行 eval.py 输出:
-
deploy.yml(触发器:eval-pass 标签添加)
- 构建 TorchServe 镜像:
FROM pytorch/torchserve:latest-gpu COPY model-store/ /home/model-server/model-store ENV TORCHSERVE_MODEL_NAME=llama3-8b-cn - 推送到阿里云 ACR 企业版(vpc 域名,免公网流出费);
- 调用 SAE OpenAPI 创建新版本,灰度 5% 流量;
- 写入部署单据到飞书多维表格,包含模型版本、哈希、灰度比例、操作人。
- 构建 TorchServe 镜像:
-
持续监控
- 在 SAE 日志规则里配置关键字“OutOfMemory”/“CUDA error”,一旦命中通过 webhook 触发 rollback.yml;
- rollback.yml 把流量瞬间切回上一版本,并打
rollback标签,禁止该模型版本再次进入部署流程。
-
合规收尾
- 每次正式部署后,GitHub Actions 调用网信办算法备案接口,上传模型指纹与用途说明,返回备案号写进 release body;
- 训练与部署日志统一转存到阿里云 OSS 合规 bucket(开启 OSS 合规保留 WORM,保存 180 天)。
拓展思考
- 多基线并发:如果业务需要同时维护 13B 通用模型与 7B 垂直模型,可在 strategy.matrix 里加
model_size维度,共用一套 eval 与 deploy 逻辑,但显存配额与灰度策略需隔离; - 训练故障自愈:当 NCCL 超时导致训练中断,可在 runner 里集成 auto-resume 脚本,检测到
/tmp/ckpt/latest存在时自动--resume_from_checkpoint,Actions 无需重跑整个 job; - Prompt 版本管理:把系统级 prompt 抽成独立仓库,prompt 变更通过 submodule 方式引入主仓库,触发 light-eval(只跑 200 条对抗样本),实现小时级上线;
- 成本优化:利用阿里云抢占式 GPU 实例(spot)跑训练,Actions 先检查当前 spot 价格,若低于 on-demand 60% 才启动 runner,否则延迟到夜间;
- 国产化替代:若代码需托管在码云 Gitee,可把 GitHub Actions 换成 Gitee Go,但 runner 仍复用本地 GPU 机器,接口层用 go-github 做双向同步,保证upstream 在 GitHub、合规备份在 Gitee。
掌握以上要点,即可在面试中把“GitHub Actions 只是无 GPU 的编排器”这一国内现实讲透,同时展示你对大模型长任务、合规、安全、灰度、成本的体系化思考,轻松拿到高分。