深度学习模型部署实战:从训练到上线
模型训练只是第一步,将模型高效、稳定地部署到生产环境才是真正的挑战。本文分享从模型导出、推理优化到容器化部署的完整实践经验。
模型导出与格式转换
训练框架(PyTorch/TensorFlow)的原生模型不适合直接部署,需要导出为标准化格式。
- ONNX:跨框架的开放格式,支持从 PyTorch、TensorFlow、sklearn 等导出,是部署中最通用的中间表示。
- TorchScript:PyTorch 原生方案,适合纯 PyTorch 生态的部署场景,无需额外依赖。
- 选择建议:需要跨框架或使用推理引擎加速时选 ONNX;纯 PyTorch 且简单部署时选 TorchScript。
推理优化
ONNX Runtime
ONNX Runtime 是微软开源的推理引擎,支持多种硬件后端(CPU、CUDA、TensorRT、OpenVINO)。通过图优化和算子融合,通常能比原生 PyTorch 推理快 1.5-3 倍。
TensorRT
NVIDIA 的推理加速库,通过量化(FP16/INT8)、层融合、内核自动调优等手段,在 GPU 上可获得 3-10 倍的推理加速。代价是转换过程复杂,部分算子可能不支持。
量化技术
将模型权重从 FP32 降低到 FP16 或 INT8,能大幅减小模型体积和推理延迟。需要注意精度损失评估,可接受范围内(通常 1-2%)即可上线。
容器化部署
Docker 是目前模型部署的标准方案,优势在于环境一致性、易于扩缩容和版本管理。
FROM python:3.11-slim
RUN pip install fastapi uvicorn onnxruntime
COPY ./model.onnx /app/model.onnx
COPY ./main.py /app/main.py
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
API 服务设计
- 异步推理:对于耗时的推理任务(如视频处理),使用异步任务队列(Celery + Redis),避免阻塞 API 响应。
- 批处理:利用 GPU 并行能力,将多个请求合并为一个 batch 进行推理,提升吞吐量。
- 健康检查与监控:实现 /health 端点,集成 Prometheus + Grafana 监控推理延迟和资源使用。
- 优雅降级:模型服务不可用时,返回缓存结果或降级响应,不影响核心业务。
踩坑记录
- PyTorch 和 ONNX Runtime 的版本必须兼容,opset 版本也要匹配
- 动态 shape 输入在 ONNX 导出时需要特殊处理,否则推理时会报错
- GPU 显存不足时,ONNX Runtime 默认回退到 CPU,不会报错——排查时容易遗漏
- 容器内存限制建议设为模型大小的 3 倍以上,预留推理时的中间张量空间