Day 123 — 模型部署 — 图解
1. 模型部署架构
┌─────────────────────────────────────────────────────────────────┐
│ ML 模型部署架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 训练阶段 部署阶段 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Jupyter │ 导出模型 │ API 服务 │ │
│ │ 训练代码 │───────────────▶ │ (FastAPI) │ │
│ └─────────────┘ └──────┬──────┘ │
│ │ │
│ ┌───────────┼───────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Docker │ │K8s集群 │ │Serverless│ │
│ │ 容器 │ │ │ │ │ │
│ └────────┘ └────────┘ └────────┘ │
│ │
│ 监控: Prometheus + Grafana │
│ 日志: ELK Stack │
│ 告警: AlertManager │
└─────────────────────────────────────────────────────────────────┘
2. Flask vs FastAPI 对比
Flask 模型服务 FastAPI 模型服务
┌──────────────────┐ ┌──────────────────┐
│ 同步处理 │ │ 异步处理 │
│ ──────────── │ │ ──────────── │
│ 请求 → 阻塞等待 │ │ 请求 → 非阻塞 │
│ → 返回响应 │ │ → 返回响应 │
└──────────────────┘ └──────────────────┘
优点: 优点:
✅ 简单易学 ✅ 高性能
✅ 生态成熟 ✅ 自动 API 文档
✅ 文档丰富 ✅ 类型安全
✅ 异步支持
缺点: 缺点:
❌ 同步阻塞 ❌ 学习曲线略高
❌ 无自动文档 ❌ 生态较新
❌ 不支持异步
适用: 原型验证 适用: 生产环境
3. 模型格式对比
Pickle 格式 ONNX 格式
┌──────────────────┐ ┌──────────────────┐
│ Python 对象 │ │ 计算图 │
│ ──────────── │ │ ──────────── │
│ pickle.dump() │ │ 标准化算子 │
│ pickle.load() │ │ 跨语言推理 │
└──────────────────┘ └──────────────────┘
特点: 特点:
🔒 Python only 🌍 多语言支持
📦 模型较大 📦 模型较小
🐢 推理较慢 🚀 推理更快
⚠️ 安全风险 🔒 安全
兼容: 兼容:
sklearn, pytorch sklearn → onnx
(通过 torch.jit) pytorch → onnx
tensorflow → onnx
4. Docker 容器化流程
开发环境 生产环境
┌─────────────┐ ┌─────────────┐
│ 代码 │ │ Docker │
│ + 模型 │ ──build──▶ │ 镜像 │
│ + 依赖 │ │ (自包含) │
└─────────────┘ └──────┬──────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│容器 1 │ │容器 2 │ │容器 3 │
│:8000 │ │:8001 │ │:8002 │
└────────┘ └────────┘ └────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────┐
│ Nginx 负载均衡 │
│ (轮询/加权/IP Hash) │
└─────────────────────────────────┘
5. 模型版本管理
models/
├── v1/
│ ├── model.onnx # ONNX 模型文件
│ ├── model.pkl # Pickle 备份
│ ├── metadata.json # 模型元数据
│ └── metrics.json # 评估指标
├── v2/
│ ├── model.onnx
│ ├── model.pkl
│ ├── metadata.json
│ └── metrics.json
├── current → v2/ # 符号链接指向当前版本
└── rollback → v1/ # 符号链接指向上一版本
灰度发布流程:
┌──────┐ ┌──────┐ ┌──────┐
│ v1 │────▶│ v1+v2│────▶│ v2 │
│ 100% │ │ 50/50│ │ 100% │
└──────┘ └──────┘ └──────┘