Serverless LLM 的冷启动缓解 本节摘要:一个 20 GB 的模型镜像从冷到可服务,要花 510 分钟(7B)到 20 分钟以上(70B)。在真正的 serverless 世界里,这不算预热——这是故障。缓解手段分五层运作:预置节点镜像(AWS 上的 Bottlerocket、双卷架构)、模型流式加载(NVIDIA Run:ai Model Streamer,vLLM 2026 原生支持)、GPU 内存快照(Modal checkpoints,重启快至 10 倍)、暖池( )、分层加载(ServerlessLLM 的 NVMe→DRAM→HBM 流水线,延迟降 10200 倍),外加一条把输入 token(KB)而非 KV 缓存(GB)搬走的实时迁移。
本节摘要:一个 20 GB 的模型镜像从冷到可服务,要花 510 分钟(7B)到 20 分钟以上(70B)。在真正的 serverless 世界里,这不算预热——这是故障。缓解手段分五层运作:预置节点镜像(AWS 上的 Bottlerocket、双卷架构)、模型流式加载(NVIDIA Run:ai Model Streamer,vLLM 2026 原生支持)、GPU 内存快照(Modal checkpoints,重启快至 10 倍)、暖池(
min_workers=1)、分层加载(ServerlessLLM 的 NVMe→DRAM→HBM 流水线,延迟降 10200 倍),外加一条把输入 token(KB)而非 KV 缓存(GB)搬走的实时迁移。Modal 公开 24 秒冷启动为下限;Baseten 默认 510 秒,预热后亚秒级。本节教你怎么测、怎么预算、怎么把这五层叠起来。
对应原课程:Phase 17 · Lesson 10 ·
10-cold-start-mitigation(原英文phases/17-infrastructure-and-production/10-cold-start-mitigation/docs/en.md)。
阅读完本节,你应当能够:
min_workers > 0 变成强制的 SLA 阈值。你的 serverless LLM 端点夜里缩到零。早上 8 点流量飙升。第一个请求等着:
合计:220510 秒(约 38 分钟)才返回一个 token。你的 SLA 是 2 秒。你上个暖池(min_workers=1),问题好像消失了——但现在你 24×7 为一块闲置 GPU 付钱。如果你的服务有 5 个产品各一个暖副本,那就是 5 × 24 × 30 = 每月 3600 GPU 小时,无论有没有用户调过。
冷启动缓解,就是在保住 serverless 经济性的同时,逼近常驻服务的延迟。
在 AWS 上,Bottlerocket 的双卷架构把 OS 与数据分开。把你的容器镜像(已预拉)打进数据卷快照,在 EC2NodeClass 里引用快照 ID。新节点开机时,权重已在本地 NVMe 上——步骤 2 与步骤 3 的一部分消失。与 Karpenter 原生配合。典型节省:大模型每次冷启动省 2~4 分钟。
GCP 等价:自定义 VM 镜像预烘容器层。Azure:托管磁盘快照,同模式。
不等整个文件加载完才应答第一个请求,而是按层把权重流式灌进 GPU 内存,第一个 transformer block 一进 HBM 就开始处理。NVIDIA Run:ai Model Streamer 在 2026 年 vLLM 原生集成,支持 S3、GCS、本地 NVMe。把权重加载时间大致砍半——靠 I/O 与计算初始化重叠。
Modal 在首次加载后对 GPU 状态(权重、CUDA graph、KV 缓存区)打检查点。后续重启直接反序列化进 HBM——比重初始化快 10 倍。这是最接近「2 秒启动一块暖 GPU」的东西。权衡:快照按 GPU 拓扑绑定,若 Karpenter 把你迁到不同 SKU,要重打检查点。
最简单的缓解:始终保一个副本就绪。成本是一块 GPU 的小时费 24×7。算术对小模型残酷(付 0.85~1.50 美元/小时去避免 30 秒冷启动),对大模型友好(付 4 美元/小时避免 5 分钟冷启动)。暖池变强制的 SLA 阈值:典型是 70B+ 模型 TTFT P99 < 60 秒。
ServerlessLLM 把存储当成层次结构:NVMe(快但大)、DRAM(中、可分层)、HBM(小但瞬时)。权重预载到 DRAM,按需载入 HBM。论文报告,相对朴素的盘到 HBM,冷加载延迟降 10~200 倍。生产采用尚早,但已有与 vLLM 的集成。
当一个节点不可用(spot 回收、节点排空),传统模式是冷启另一个副本并排干请求队列。实时迁移把**输入 token(几千字节)**搬到一个已加载模型的目的地,在目的地上重算 KV 缓存。重算比在网上传 GB 级 KV 缓存便宜。适用于分离式部署。
对一个 P99 TTFT SLA 2 秒的服务,问题不是「要不要暖池」,而是「几个暖副本,哪些路径配」。
min_workers=1~2。min_workers,专属容量。70B 模型在全新节点上的冷启动解剖(示意):
| 阶段 | 时间 | 缓解 |
|---|---|---|
| 节点供给 | 50s | Bottlerocket + 预置镜像,暖池 |
| 镜像拉取 | 180s | 预置数据卷(消除) |
| 权重入 HBM | 75s | 模型流式(砍半);GPU 快照(消除) |
| 引擎初始化 | 20s | 持久 CUDA graph 缓存 |
| 首次前向 | 3s | 固有最小延迟 |
| 冷启动总计 | 328s | |
| 加缓解后总计 | 约 15s | 缩减 22 倍 |
原课程 code/main.py 建模带/不带每种缓解的冷启动路径,报告总冷启动时间、暖池成本、以及「暖副本比付冷启动税更划算」的盈亏请求数。下面给最小可读的预算骨架。
def cold_start_total(node_s, image_pull_s, weights_to_hbm_s, engine_init_s, mitigations=None): """叠加各缓解后的冷启动墙钟。 mitigations: 集合,可含 'preseed'(消除镜像拉取 + 砍节点供给) 'stream'(权重加载砍半) 'snapshot'(消除权重加载 + 砍引擎初始化) """ m = mitigations or set() n = node_s * (0.5 if "preseed" in m else 1.0) p = 0 if "preseed" in m else image_pull_s w = 0 if "snapshot" in m else (weights_to_hbm_s * (0.5 if "stream" in m else 1.0)) i = engine_init_s * (0.3 if "snapshot" in m else 1.0) return round(n + p + w + i, 1) def warm_pool_break_even(gpu_hour_cost, cold_start_seconds, sla_ttf_t_seconds, dropped_request_value): """估算暖副本『划算』的最低请求数。 参数: gpu_hour_cost: 单 GPU 每小时成本(美元) cold_start_seconds: 冷启动秒数 sla_ttf_t_seconds: SLA 的 TTFT 阈值 dropped_request_value: 每个超时请求损失(美元) 返回: 每小时至少 N 个超时请求才抵得过暖池成本 """ warm_hourly = gpu_hour_cost # 冷启动期间,所有请求都超时;冷启动相当于一次『故障窗口』 return round(warm_hourly / max(dropped_request_value, 1e-6), 1) # 案例:70B 模型,节点 50s + 镜像 180s + 权重 75s + 引擎 20s base = cold_start_total(50, 180, 75, 20) stacked = cold_start_total(50, 180, 75, 20, {"preseed", "stream", "snapshot"}) print(f"裸冷启动 {base}s → 叠缓解 {stacked}s") print("暖池盈亏(4 美元/h GPU, 每超时请求损失 0.5 美元):", warm_pool_break_even(4, base, 2, 0.5), "次超时/小时")
💡 暖池不是「要不要」的二选一,而是「哪条路径要、要几个」。把交互路径配暖副本、批处理路径缩到零,你就把 serverless 经济性与常驻延迟同时拿到了。
| 层 | 工具/模式 | 解决什么 | 成本/权衡 |
|---|---|---|---|
| 预置镜像 | Bottlerocket 双卷 / 自定义 VM 镜像 | 消除镜像拉取 | 快照维护、SKU 绑定 |
| 模型流式 | Run:ai Model Streamer(vLLM 原生) | 权重加载砍半 | I/O 与计算重叠,无额外成本 |
| GPU 快照 | Modal checkpoints | 重启快 10 倍 | 按 GPU 拓扑绑定,迁 SKU 要重打 |
| 暖池 | min_workers=1 |
路径常驻就绪 | 24×7 付闲置 GPU 钱 |
| 分层加载 | ServerlessLLM(NVMe→DRAM→HBM) | 冷加载降 10~200 倍 | 生产采用尚早,需集成 |
叠加心法:交互路径 = 暖池 + 预置镜像 + 流式/快照;批处理路径 = 仅预置镜像 + 接受冷启动。两层策略比一刀切更省。
本节产出 outputs/skill-cold-start-planner.md(原课程目录)。给定 SLA、模型大小、流量形状,它选出叠哪些缓解:
min_workers 按路径分级,含月度 GPU 小时成本。跑通模拟器:运行 code/main.py。算出「暖副本比付冷启动税更划算」的盈亏请求数。
最小栈:你部署一个 13B 模型,P99 TTFT SLA 3 秒。选出达成它的最少缓解层组合。
快照墙钟:Bottlerocket 预置消除了镜像拉取,但权重仍要从快照 NVMe 读进 HBM。70B 模型、NVMe 读 7 GB/s,墙钟多少?
快照与隐私:你的 serverless 供应商提供 GPU 快照(Modal),团队以「快照泄漏 PII」为由拒绝。两边的论证各是什么?现实风险是什么,缓解有哪些(临时快照、加密、命名空间隔离)?
分层暖池:为付费用户、试用用户、批处理工作负载各设计暖副本数,展示算术。
min_workers=1 保路径就绪,24×7 付 GPU 钱,SLA < 60 秒时强制。下一节,我们把视角拉到全球——看多区域 LLM 服务如何借助 KV 缓存局部性,让一个对话在区域间迁移时不丢上下文。