一句话定义:推理预热(Warm-up)是在推理服务正式对外接流量之前,先用几轮"占位"请求把运行环境跑热——CUDA 上下文建好、算子编译完成、显存池分配到位、缓存填上——让真实用户的第一条请求也能拿到正常速度。
为什么第一个请求总是慢
模型服务不是"启动即巅峰"。进程起来、权重读进显存,只是原材料就位,很多开销要等第一次真正跑前向计算才发生:
- 运行时初始化:CUDA 上下文、cuBLAS / cuDNN 这类计算库的句柄,第一次调用要现建。
- 算子编译:不少推理栈会对算子或计算图做即时编译(JIT)和图优化,第一次遇到某种输入形状就得编译一次。
- 显存与缓存:AI 词典:KV Cache">KV Cache 的显存池、前缀缓存(prefix cache)、分词器缓存,都是边跑边长的。
- 动态形状:batch size 或序列长度一变,可能又触发一轮新的编译和重新分配。
打个比方:这就像餐厅开餐。锅是冷的、灶没点火、常用配菜还没切,第一位客人点单就得等很久;等厨房进入状态,后面的单子出得飞快。
预热怎么做
常见做法是在容器启动脚本里加一段:服务把端口监听起来,但先不注册到负载均衡;然后用一批有代表性的输入连续跑若干轮推理,覆盖真实流量的典型形状——短 prompt、接近上限的长序列、不同 batch size。等延迟曲线降下来并稳定住,再把实例标记为就绪(readiness),开始接客。
几个容易踩的坑:
1. 只热了短序列,长序列的算子还是冷的,上线照样抖。
2. 预热本身要花时间,会拉长发布和扩容的时长,滚动发布、自动扩缩容时得把这段算进去。
和相邻概念的区别
| 概念 | 管的是什么 | 与预热的关系 |
|---|---|---|
| 模型加载 | 权重搬进显存 | 是预热的前置步骤,但不等于热 |
| 编译 / 图优化 | 把计算图变成高效可执行形态 | 预热会把它触发掉,但预热不止这一件事 |
| 冷启动 | 实例从零到可用的空窗期 | 冷启动是问题,预热是解法之一 |
| 性能压测 | 测出稳定的吞吐与延迟 | 压测通常自带预热轮次,前几轮数据要丢掉 |
为什么值得在意
对普通用户和产品方,预热决定的是"第一分钟体验":上线、扩容、发布之后的头几分钟,往往是超时和报错最集中的时段。对做工程的人,它影响三件事:容量规划别拿未预热的数字去算;SLO 里 P99 的抖动,很多时候来自没预热;上线检查清单里该有这一项。
具体预热多少轮、超时设多长、有没有现成开关,各家框架与推理服务端的做法不一样,以官方页面为准。
