最近在搭AI模型推理自动化部署流程时,我把原先手动部署的每个动作都拆开重看了一遍。结果发现很多“想当然没问题”的环节,恰恰是拖垮稳定性的关键:模型版本和代码版本对不上、手动灌数据测一把就上线、服务进程活着但显存卡死没人知道。这篇文章就围绕模型推理阶段的自动化部署来写,从模型构建、版本管理、流水线编排到健康检查与灰度回滚,把整个链路里的关键决策和落地细节一次讲清楚。适合正在从手动部署转向自动化部署的算法工程团队,也适合刚接触推理服务的后端开发。
1. 推理部署不能照搬训练环境:先想清楚自动化的边界
很多团队第一次接触推理自动化时,最容易犯的错是直接拿 Web 服务的 CI/CD 经验套用到模型推理上。表面看都是“代码提交、构建镜像、部署服务”,但真正跑起来会发现,推理场景的构建物、运行位置和启动方式都跟普通后端服务有本质区别。这个区别不搞清楚,后面做的流水线都会在某个深夜以诡异的方式崩掉。
1.1 训练环境与推理环境为何天然不同
训练阶段跑模型,要求的是“能在 GPU 上跑起来”,对吞吐和延迟的容忍度相对高,一个 PyTorch 容器里可以塞下各种调试工具,环境坏了重装就行。推理阶段完全反过来,模型不只要跑起来,还要跑得稳、跑得快、响应时间可控。这就导致依赖栈从“能跑”变成了“要优化到极致”:ONNX Runtime、TensorRT、Triton Inference Server 这类推理框架会取代原生的 PyTorch 推理循环,甚至会针对特定 GPU 架构做 kernel 层面的调优。
如果把训练环境里的 CUDA 版本、cuDNN 版本、PyTorch 版本原封不动搬到推理服务上,很可能遇到性能压不上去的问题。我见过一个团队用原生 PyTorch 跑服务,单卡 QPS 上不去,换了 TensorRT 之后延迟降了一半还多。所以推理自动化的第一步,不是搭流水线,而是把推理运行时单独锁定成一套稳定的技术栈,跟训练环境解耦。
还有一个关键变量是精度。训练时模型可以用 FP32,推理端为了压性能经常改成 FP16,或者做 INT8 量化。量化后模型的输出分布会变,有些样本的预测结果会跟训练时对不上。自动化部署流程里如果不加对应的精度校验,模型上线后出现预测质量下降,排查起来会非常痛苦。
1.2 推理自动化躲不开的“三个重”
我在设计自动化流程时,最直接的感受是推理服务有“三个重”。
第一,模型文件重。一个 BERT 级别的模型大概几百 MB,CV 大模型动辄几个 GB。如果每发布一个版本都把模型打进 Docker 镜像,镜像体积会膨胀到几 GB,镜像推送时间够你喝两杯咖啡。多模型场景更麻烦,一个服务同时加载十几个模型,镜像仓库会被塞爆。
第二,运行时依赖重。推理服务依赖 CUDA、cuDNN、TensorRT 这些底层库,版本错一个字母都可能加载失败。而且 GPU 驱动版本和容器内 CUDA 版本必须匹配,否则模型加载时直接报“no kernel image is available for execution on the device”,遇到这种问题只能重新选基础镜像再构建。
第三,启动流程重。普通 Web 服务启动就是监听端口,模型推理服务启动还要把权重文件加载进显存,做 warm-up 推理。一个大型模型冷启动可能要花几十秒甚至几分钟。如果还用常规的 readiness 探针配置,服务还没加载完就被 K8s 判定不健康然后反复重启,形成死循环。
这三个“重”决定了推理自动化不能简单套用 Web 的构建测试流程,每一环都要针对模型的特点重新设计。
1.3 手动部署让人头疼的几类问题
讨论自动化前,先把手动部署的痛点列清楚,后面设计流程时才不会漏。
- 模型文件分发的随意性:有人从网盘下载,有人从训练机的本地路径拷贝,传到生产服务器后版本对不对全靠人眼核对。
- 环境差异的不可控性:开发环境用的是 CUDA 11.8,生产机却是 12.1,模型的行为或者性能表现对不上。
- 版本追溯的缺失:某个模型效果变差了,不知道线上跑的是训练日志里的哪个 checkpoint,想回滚都找不到上一个可用版本。
- 并发更新的冲突:多个算法同时提模型上线,手动部署时容易把别人正在跑的服务覆盖掉。
这些坑的共同根源是“人参与了太多容易出错的环节”。自动化的目标不是消灭人,而是把人在链路里承担的角色收敛成两件事:提交版本声明,以及做最终审批。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 把模型当作制品来管理:构建与版本管理是自动化的地基
流水线要想可靠,第一步是把模型本身变成像代码一样有版本、有元数据、可以被追溯和回滚的“制品”。很多团队在这一步偷了懒,最后部署链路再怎么自动化,底子都是虚的。
2.1 模型与代码分开管理,但要建立强映射关系
我在实际项目里推荐的方式是:代码走代码仓库,模型权重走对象存储或者模型仓库,二者通过一个版本描述文件关联起来。
具体来说,模型文件不要直接提交到 Git。几百 MB 甚至几个 GB 的二进制文件会把仓库拖垮,diff 也没有意义。适合的做法是把模型上传到对象存储(MinIO、阿里云 OSS
