如何用 GitHub Actions 触发数据→训练→评估→部署全链路?

解读

面试官想验证三件事:

  1. 你是否能把大模型特有的重算力、长耗时、合规敏感等特点融入 CI/CD;
  2. 能否在国内网络与合规环境下(GPU 机器在阿里云/华为云/本地机房、数据不出境、模型需备案)把 GitHub Actions 当“调度器”而非“执行器”;
  3. 是否具备LLMOps 分层理念:数据版本、模型版本、Prompt 版本、指标版本四线并行,任何一条变更都能触发最小闭环。

知识点

  1. workflow 触发器:push、pull_request、workflow_dispatch、schedule、repository_dispatch,以及国内常用的企业微信机器人 webhook
  2. 矩阵与缓存:strategy.matrix 区分 pytorch2.1+cuda11.8 与 pytorch2.2+cuda12.1,actions/cache 缓存 transformers 模型快照pip 依赖
  3. 自托管 Runner:在阿里云 ebmgn7i 裸金属华为云 Ai1 实例上注册 runner,labels 设为 gpu-a100-80g×8,解决 GitHub 官方机器无 GPU 痛点;
  4. 分层制品:数据层用 DVC+OSS 做lfs 替代,模型层用 ModelScope-Hub 或 HuggingFace-Mirror 做私有仓,指标层用 MLflow 写SQLite+MinIO
  5. 安全与合规
    • 使用阿里云 OIDC 连接,避免把 AK/SK 写进 GitHub secret;
    • 训练日志通过脱敏脚本自动过滤手机号、地址等敏感实体;
    • 部署前调用网信办算法备案接口模型哈希校验,哈希值写入 release note;
  6. 长任务策略:训练 job 拆成 setup→train→checkpoint-push 三阶段,train 阶段用 nohup+systemd 守护,Actions 仅轮询状态,防止 6 小时 Job 超时;
  7. 评估关卡:引入模型安全评分卡(SafetyScore≥0.92)与业务指标( Rouge-L≥42、C-SCORE≥3.8),任何一项不过则阻断下游
  8. 部署模式
    • 小流量灰度:通过阿里云 SAE 多版本做 5% 金丝雀;
    • 大流量热更:使用 TorchServe+KServerolling_batch=continuous 模式,实现零中断切换
  9. 通知与回滚:企业微信推送带模型版本二维码的卡片,一键回滚通过 repository_dispatch 触发 rollback.yml,30 秒内完成。

答案

给出一个可直接落地的最小可运行(MVP)方案,兼顾国内合规与 GPU 资源现状:

  1. 仓库结构

    .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
    
  2. 自托管 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
    
  3. data_pipeline.yml(触发器:data/ 变更)

    • 使用 dvc repro 生成新数据版本;
    • 计算数据指纹(sha256),写入 data/meta.json
    • 通过 repository_dispatch 触发下游 train.yml,附带 data_version 参数。
  4. 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_idtrain_run_id.txt 作为制品上传。
  5. 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
  6. 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% 流量;
    • 写入部署单据到飞书多维表格,包含模型版本、哈希、灰度比例、操作人。
  7. 持续监控

    • SAE 日志规则里配置关键字“OutOfMemory”/“CUDA error”,一旦命中通过 webhook 触发 rollback.yml;
    • rollback.yml 把流量瞬间切回上一版本,并打 rollback 标签,禁止该模型版本再次进入部署流程。
  8. 合规收尾

    • 每次正式部署后,GitHub Actions 调用网信办算法备案接口,上传模型指纹与用途说明,返回备案号写进 release body;
    • 训练与部署日志统一转存到阿里云 OSS 合规 bucket(开启 OSS 合规保留 WORM,保存 180 天)。

拓展思考

  1. 多基线并发:如果业务需要同时维护 13B 通用模型7B 垂直模型,可在 strategy.matrix 里加 model_size 维度,共用一套 eval 与 deploy 逻辑,但显存配额灰度策略需隔离;
  2. 训练故障自愈:当 NCCL 超时导致训练中断,可在 runner 里集成 auto-resume 脚本,检测到 /tmp/ckpt/latest 存在时自动 --resume_from_checkpoint,Actions 无需重跑整个 job;
  3. Prompt 版本管理:把系统级 prompt 抽成独立仓库,prompt 变更通过 submodule 方式引入主仓库,触发 light-eval(只跑 200 条对抗样本),实现小时级上线
  4. 成本优化:利用阿里云抢占式 GPU 实例(spot)跑训练,Actions 先检查当前 spot 价格,若低于 on-demand 60% 才启动 runner,否则延迟到夜间;
  5. 国产化替代:若代码需托管在码云 Gitee,可把 GitHub Actions 换成 Gitee Go,但 runner 仍复用本地 GPU 机器,接口层用 go-github 做双向同步,保证upstream 在 GitHub合规备份在 Gitee

掌握以上要点,即可在面试中把“GitHub Actions 只是无 GPU 的编排器”这一国内现实讲透,同时展示你对大模型长任务、合规、安全、灰度、成本的体系化思考,轻松拿到高分。