1. 写在最前:为什么又要写一篇“端到端”?

2025 年了,网上依旧充斥着“手把手 5 分钟训练大模型”的爽文,结果:

  • 本地 4090 一跑,CUDA OOM;

  • 用云端 A100,一天烧掉 800 元,准确率却 0.3;

  • 终于训练完,发现推理 QPS≈0.2,老板当场裂开。

本文用一次真实企业级 NLP 文本分类项目(小模型 + LLM 微调两条路线)为例,把“数据→训练→评估→压缩→部署→监控”全部拆给你看,代码可直接复现,坑点全部标注。读完你能:

  1. 用 200 元以内预算完成一次 GPU 训练;

  2. 把 PyTorch 模型压到 1/10 体积,推理提速 4×;

  3. 一条 kubectl apply 把模型上到 K8s,自带灰度、监控、回滚。

2. 项目背景与指标定义

任务:某 ToB 客服 SaaS,需对用户工单标题自动打 5 级优先级标签(P0~P4)。
指标:线上宏平均 F1 ≥ 0.88,单条推理 ≤ 60 ms(CPU 4 核),内存 ≤ 1 GB。
数据:脱敏后 21 万条中文短文本,类别极度不平衡(P0 只占 2%)。


3. 数据准备:90% 人第一步就翻车

3.1 标注一致性 → Krippendorff α ≥ 0.81

随机 1 000 条让 3 个标注员交叉,α<0.8 就打回重标,宁可前期慢,拒绝后期返工。

3.2 类别不平衡 → 动态加权 + 伪标签

  • 损失函数用 CrossEntropyLoss(weight=class_weight),权重按有效样本数反比;

  • 对高置信度无标签数据(置信度>0.9)做伪标签,扩充 30% 训练集,F1 提 2.3%。

3.3 数据版本控制

用 DVC(Data Version Control)把原始语料、清洗脚本、划分 ID 全部托管到 OSS,保证任何一次训练可复现

dvc add data/raw.jsonl
git add data/raw.jsonl.dvc
dvc push

4. 方案选型:小模型 vs. 大模型微调

路线 模型 参数量 训练耗时 线上延迟 最终 F1
① 小模型 ALBERT-base-chinese 12 M 25 min 18 ms 0.865
② 大模型微调 Chinese-LLaMA2-7B + LoRA 7 B(训练 0.4 B) 2 h 45 ms(GPU) 0.901

结论

  • 小模型已接近指标,但 LoRA 版 F1 高 3.6%,且后续可 zero-shot 扩展类别;

  • 线上 GPU 资源紧张,采用“小模型兜底 + 大模型异步纠偏”双轨策略。


5. 训练环节:PyTorch 2.2 + Lightning 2.4 最佳实践

5.1 环境一键复现

docker run --gpus all -it \
  -v $(pwd):/workspace \
  pytorch/pytorch:2.2.0-cuda12.1-cudnn8-devel
pip install lightning==2.4 transformers==4.46 datasets==3.1

5.2 超参网格搜索 → Optuna 轻量级版

def objective(trial):
    lr = trial.suggest_loguniform('lr', 1e-5, 1e-3)
    bs = trial.suggest_categorical('bs', [16, 32, 64])
    # 其余代码略
    return trainer.callback_metrics['val_f1'].item()

study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=20)

20 次实验仅花 38 分钟(A10 单卡),最优 lr=2.4e-5,bs=32。

5.3 训练监控

  • TensorBoard + Prometheus Exporter,把 GPU 功率、显存、温度也打进 Grafana;

  • 自定义 ModelCheckpoint 按 F1 保存,而非 loss,避免“loss 好 F1 差”陷阱。


6. 模型压缩:落地必经之路

技术 体积变化 延迟变化 F1 变化 说明
动态量化(INT8) 4× 减小 −15% −0.2% CPU 友好
ONNX Runtime + 图优化 不变 −30% 0 把 LayerNorm 融合
Knowledge Distillation(ALBERT→TinyBERT) 8× 减小 −55% −0.9% 最终采用

最终上线模型 14 MB,单核 CPU 推理 18 ms,F1 0.856,完全符合 SLA。


7. 部署:Docker → CI/CD → K8s 灰度发布

7.1 推理服务 FastAPI + Gunicorn

# app.py
from fastapi import FastAPI
from pydantic import BaseModel
import onnxruntime as ort

app = FastAPI()
sess = ort.InferenceSession("model.onnx")

class Item(BaseModel):
    text: str

@app.post("/predict")
def predict(item: Item):
    input_ids = tokenizer(item.text)['input_ids']
    logits = sess.run(None, {"input_ids": [input_ids]})[0]
    return {"label": int(logits.argmax(-1))}

7.2 Dockerfile 多阶段构建

FROM python:3.11-slim as builder
COPY requirements.txt .
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

FROM python:3.11-slim
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY app.py model.onnx ./
CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "app:app", "-b", "0.0.0.0:8000"]

镜像体积 87 MB,漏洞扫描 0 Critical。

7.3 GitHub Actions 自动 CI

name: ci
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build and push
        run: |
          docker build -t registry.cn-shanghai.aliyuncs.com/xxx/priority-model:${{ github.sha }} .
          docker push registry.cn-shanghai.aliyuncs.com/xxx/priority-model:${{ github.sha }}

7.4 K8s 灰度发布

  • 使用 Argo Rollouts,按 10%→30%→100% 阶梯放量;

  • Prometheus 实时采集 F1 漂移、P99 延迟,一键回滚(kubectl argo rollouts undo)。


8. 线上监控与持续学习

  • 数据漂移:用 EvidentlyAI 每天计算 PSI>0.2 自动告警;

  • 标签回流:用户点“优先级不对”自动写入 Kafka,周末定时重训练;

  • 影子模式:新模型旁路跑 24 h,对比线上真实标签,F1 提升 ≥1% 才转正。


9. 成本账单(真实截图打码版)

项目 费用(CNY)
OSS 存储 100 GB 15 元/月
A10 训练 3 h 63 元
线上 4 核 8 G × 2 Pod 180 元/月
监控日志 40 元/月
合计 ≈ 300 元/月

10. 常见翻车 FAQ

Q1:ONNX 量化后精度掉 5%?
→ 检查量化校准集是否覆盖长尾类别,用 per-channel 量化+ 1000 条校准。

Q2:Gunicorn 4 worker 推理延迟抖动?
→ 把 preload_app = True + worker_class = sync,避免模型重复加载。

Q3:K8s HPA 扩容不及时?
→ 使用 KEDA,按 Kafka 消息 lag 提前扩容,别等 CPU 70%。


11. 一键复现仓库

GitHub(含数据采样版、Dockerfile、K8s yaml):
https://github.com/yourname/ai-pipeline-0to1
记得点个 ⭐ 再跑代码,issues 24h 内回复。


12. 结语:训练只是 20%,工程 + 监控才是 80%

“模型效果 90%→91% 可能只要加数据,
但 91%→92% 却要整个 MLOps 体系不掉链子。”
2025 年,不会 Docker、不会 CI/CD 的算法工程师,
就像 2015 年不会用 Git 一样危险。

把代码跑通只是起点,
让模型在 2 AM 流量洪峰里依然不崩溃,才是真的“实战”。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐