多模型服务的挑战: 你有两个大语言模型,每个都能单独运行在GPU上,但无法同时加载。传统方案迫使您在两个不理想的选择中权衡:

vLLM睡眠模式
vLLM睡眠模式提供了第三种方案: 模型在几秒内进入休眠,快速唤醒——在保持按需加载效率的同时,实现持久化服务的速度。
两种级别都比完整重载快18-200倍,并且无缝支持张量并行(TP)、流水线并行(PP)和专家并行(EP)。
即使拥有即时权重加载能力,每次冷启动仍需支付睡眠模式能够避免的隐藏成本:
成本项 | 描述 | 快速权重加载器 | 睡眠模式 |
|---|---|---|---|
1. 显存加载时间 | 将权重复制到GPU | ✅ 已优化 | ✅ 保留 |
2. 内存分配器设置 | CUDA分配器初始化 | ❌ 每次都要 | ✅ 保留 |
3. CUDA图捕获 | 记录执行图 | ❌ 每次都要 | ✅ 保留 |
4. GPU内核JIT编译 | DeepGEMM、FlashInfer、TorchInductor | ❌ 每次都要 | ✅ 保留(初次预热后) |
5. 缓存预热 | 首次请求开销 | ❌ 每次都要 | ⚡ 快速重新预热 |
通过保持进程活跃,睡眠模式保留了基础设施(2-4),避免了昂贵的重新初始化。这就是为什么基准测试显示睡眠模式推理比冷启动快61-88%。
本文涵盖:
启动两个启用睡眠模式的vLLM服务器:
# 终端1:启动 Phi-3-vision
export VLLM_SERVER_DEV_MODE=1
vllm serve microsoft/Phi-3-vision-128k-instruct --enable-sleep-mode --port 8001
# 终端2:启动 Qwen3-0.6B
export VLLM_SERVER_DEV_MODE=1
vllm serve Qwen/Qwen3-0.6B --enable-sleep-mode --port 8002# 让 Phi-3-vision 进入睡眠(级别2 - 最小内存占用)
curl -X POST 'localhost:8001/sleep?level=2'
# 让 Qwen3-0.6B 进入睡眠(级别2)
curl -X POST 'localhost:8002/sleep?level=2'
# 唤醒 Phi-3-vision 进行推理
curl -X POST 'localhost:8001/wake_up'
curl -X POST 'localhost:8001/collective_rpc' \
-H 'Content-Type: application/json' \
-d '{"method":"reload_weights"}'
# 重要:级别2唤醒后需重置前缀缓存
curl -X POST 'localhost:8001/reset_prefix_cache'
# 现在在 Phi-3-vision 上运行推理...
# (这里是您的推理请求)
# 完成后让它重新睡眠
curl -X POST 'localhost:8001/sleep?level=2'
# 唤醒 Qwen3-0.6B
curl -X POST 'localhost:8002/wake_up'
# (级别1不需要 reload_weights 或 reset_prefix_cache)
# 在 Qwen3-0.6B 上运行推理...Note 对于级别2睡眠,唤醒后必须调用
reload_weights和reset_prefix_cache。级别1睡眠不需要这些额外步骤。Warning 安全性:
/sleep、/wake_up、/collective_rpc和/reset_prefix_cache端点需要设置VLLM_SERVER_DEV_MODE=1,且只应在可信网络中暴露。这些管理端点可能会干扰服务,仅适用于训练集群或后端应用等封闭环境。
让我们看看睡眠模式相比传统模型重载的性能表现。
下方的交互式图表显示了执行5次模型切换的总时间:在模型A上运行推理,切换到模型B,在模型B上运行推理,然后重复这个模式(A→B→A→B→A→B)。
使用睡眠模式: 模型在切换间休眠/唤醒,保留基础设施。 不使用睡眠模式: 每次切换需要完整的vLLM重启和重载。

模型 A: Qwen3-235B-A22B-Instruct-2507-FP8 (TP=4) | 模型 B: Qwen3-Coder-30B-A3B-Instruct (TP=1) GPU: A100 | vLLM 0.11.0 | Sleep Level: 1 | 编译: cudagraph_mode: FULL_AND_PIECEWISE
除了更快的模型切换,睡眠模式还带来更快的推理时间。因为模型从睡眠中唤醒时已经预热,跳过了影响新加载模型的冷启动开销。

推理时间对比显示唤醒模式(已预热)与冷启动(刚加载)的差异。 推理时间 = 预填充 + 解码(唤醒/加载后的首次请求)。每个请求使用不同问题以避免缓存,输出限制为100个token。 误差棒显示多次运行中的最小/最大变化。数值直接标注在柱形图上。 GPU:A100 | vLLM 0.11.0 | 休眠等级:1 | 编译:cudagraph_mode: FULL_AND_PIECEWISE
61-88%的推理加速并非来自更快的权重加载——而是来自保留昂贵的基础设施,这些是冷启动必须从头重建的。
睡眠模式保留的组件:
组件 | 是否保留? | 冷启动必须支付 |
|---|---|---|
内存分配器(CuMemAllocator) | ✅ 是 | ❌ 每次重新初始化 |
CUDA图 | ✅ 是 | ❌ 每次重新捕获 |
进程状态(Python、CUDA上下文) | ✅ 是 | ❌ 每次重启 |
GPU内核JIT缓存 | ✅ 是(初次预热后) | ❌ 每次重新编译 |
关键区别:
Note 时间因模型大小、GPU代次和配置而异。详见预热的影响章节,显示无预热时有5-7倍的减速。
睡眠模式最显著的优势体现在模型切换时间上。唤醒休眠模型比加载全新的vLLM实例快18-20倍。

模型切换时间:从睡眠唤醒 vs 冷启动(全新加载)。误差线显示多次运行的最小/最大变化。柱状图上显示数值。GPU: A100 | vLLM 0.11.0 | 睡眠级别:1 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE
睡眠模式的优势不局限于高端GPU。以下是在A4000 GPU上使用较小模型的相同工作负载,展示了性能提升在不同硬件层级和模型规模上的可扩展性。

模型A: Qwen3-0.6B | 模型B: Phi-3-vision-128k-instruct GPU: A4000 (TP=1) | vLLM 0.11.0 | 睡眠级别:1 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE

A4000上的推理时间对比:唤醒模式(已预热)vs 冷启动(刚加载)。 推理时间 = 预填充 + 解码(唤醒/加载后的首次请求)。 每个请求使用不同的问题以避免缓存,输出限制为100个token。 误差线显示多次运行的最小/最大变化。柱状图上显示数值。 GPU: A4000 (TP=1) | vLLM 0.11.0 | 睡眠级别:1 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE

A4000上的模型切换时间:从睡眠唤醒 vs 冷启动(全新加载)。 误差线显示多次运行的最小/最大变化。柱状图上显示数值。 GPU: A4000 (TP=1) | vLLM 0.11.0 | 睡眠级别:1 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE
A4000上的关键观察:
vLLM睡眠模式提供两种级别,具有不同的权衡:
级别1(默认): 将模型权重卸载到CPU内存,丢弃KV缓存
级别2: 丢弃模型权重和KV缓存,仅在CPU中保留缓冲区(rope scaling张量等)

模型A: Qwen3-0.6B | 模型B: Phi-3-vision-128k-instruct GPU: A100 (TP=1) | vLLM 0.11.0 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE 对比三种模式:级别1(最快)、级别2(最小内存)、无睡眠。悬停查看精确时间。
性能总结:
模式 | 总时间 | 唤醒时间(A/B) | CPU内存 | 最适合 |
|---|---|---|---|---|
无睡眠 | 357.1秒 | 不适用(完整重载) | 最小 | 单模型,无切换 |
级别1 | 112.6秒 | 0.26秒 / 0.82秒 | 高(每模型约GB级) | 频繁切换,内存充足 |
级别2 | 124.6秒 | 0.85秒 / 2.58秒 | 最小(每模型约MB级) | 内存有限,成本优化 |
关键洞察:
乍看之下,这似乎违反直觉:级别2从SSD重新加载权重(就像"无睡眠模式"一样),那为什么整体上快23-45倍?
答案:权重加载只是五项成本之一
当您在无睡眠模式下重新加载模型时,需要支付所有这些成本:
成本项 | 级别2 | 无睡眠模式 |
|---|---|---|
1. 权重加载(SSD → 显存) | ❌ 必须支付 | ❌ 必须支付 |
2. 进程初始化 | ✅ 跳过 | ❌ 必须支付 |
3. 内存分配器设置 | ✅ 跳过 | ❌ 必须支付 |
4. CUDA图捕获 | ✅ 跳过 | ❌ 必须支付 |
5. GPU内核JIT编译 | ✅ 保留(已编译) | ❌ 完整编译 + 预热 |
级别2策略:
无睡眠模式现实:
kernel_warmup() + 虚拟运行)基准数据证明: 5次模型切换:
即使两者都从SSD重新加载权重,级别2整体快2.9倍,因为它保留了无睡眠模式每次都必须从头重建的昂贵基础设施(进程状态、分配器、CUDA图)。

睡眠级别2的推理时间对比:唤醒模式 vs 冷启动。 推理时间 = 预填充 + 解码(唤醒/加载后的首次请求)。 每个请求使用不同的问题以避免缓存,输出限制为100个token。 误差线显示多次运行的最小/最大变化。柱状图上显示数值。 GPU: A100 (TP=1) | vLLM 0.11.0 | 睡眠级别:2 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE

睡眠级别2的模型切换时间:从睡眠唤醒 vs 冷启动。 误差线显示多次运行的最小/最大变化。柱状图上显示数值。 GPU: A100 (TP=1) | vLLM 0.11.0 | 睡眠级别:2 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE
关键观察:
指标 | 无睡眠 | 级别2 | 改进 |
|---|---|---|---|
总时间(5次切换) | 357.1秒 | 124.6秒 | 快65% |
Qwen3-0.6B切换时间 | 平均37.6秒 | 平均0.85秒 | 快45倍 |
Phi-3-vision切换时间 | 平均58.1秒 | 平均2.58秒 | 快23倍 |
Qwen3-0.6B推理 | 平均3.67秒 | 平均0.53秒 | 快86% |
Phi-3-vision推理 | 平均6.30秒 | 平均0.76秒 | 快88% |
唤醒时间 vs 级别1 | - | 慢3-10倍 | 用CPU内存换速度 |
何时使用级别2:
级别1 vs 级别2对比:
跳过预热阶段会影响性能吗?预热在初始加载期间预编译CUDA图,这可能需要几秒钟。让我们对比有预热和无预热的情况。

模型A: Qwen3-0.6B | 模型B: Phi-3-vision-128k-instruct GPU: A100 (TP=1) | vLLM 0.11.0 | 睡眠级别:1 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE对比有预热(预编译)vs 无预热(延迟编译)。悬停查看精确时间。
关键发现:
指标 | 有预热 | 无预热 | 差异 |
|---|---|---|---|
初始加载时间 | 108.7秒(含8.4秒预热) | 101.1秒(无预热) | 初始节省7.6秒 |
首次推理(A) | 0.45秒 | 2.59秒 | 无预热慢5.8倍 |
首次推理(B) | 0.93秒 | 6.61秒 | 无预热慢7.1倍 |
后续推理 | 平均0.43秒 | 平均0.41秒 | 无差异 |
总时间(5次切换) | 119.5秒 | 119.0秒 | 几乎相同 |
洞察:
量化(FP8)会影响睡眠模式的性能吗?我们在A100 GPU上使用和不使用FP8量化测试了相同的工作负载。

模型A: Qwen3-0.6B | 模型B: Phi-3-vision-128k-instruct GPU: A100 (TP=1) | vLLM 0.11.0 | 睡眠级别:1 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE对比BF16(基线)vs FP8量化。悬停查看精确时间。

推理时间对比:睡眠模式下BF16 vs FP8量化。 推理时间 = 预填充 + 解码(唤醒/加载后的首次请求)。 每个请求使用不同的问题以避免缓存,输出限制为100个token。 误差线显示多次运行的最小/最大变化。柱状图上显示数值。 GPU: A100 (TP=1) | vLLM 0.11.0 | 睡眠级别:1 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE

模型切换时间:睡眠模式下BF16 vs FP8量化。 误差线显示多次运行的最小/最大变化。柱状图上显示数值。 GPU: A100 (TP=1) | vLLM 0.11.0 | 睡眠级别:1 | 编译模式:cudagraph_mode: FULL_AND_PIECEWISE
关键发现:
指标 | BF16 | FP8 | 改进 |
|---|---|---|---|
总时间(5次切换) | 108.2秒 | 113.6秒 | -5%(略慢) |
Qwen3-0.6B唤醒时间 | 平均0.27秒 | 平均0.18秒 | 快33% |
Phi-3-vision唤醒时间 | 平均0.90秒 | 平均0.78秒 | 快13% |
Qwen3-0.6B推理 | 平均0.41秒 | 平均0.44秒 | -7%(略慢) |
Phi-3-vision推理 | 平均0.81秒 | 平均0.57秒 | 快30% |
初始加载时间 | 90.5秒 | 96.9秒 | -7%(预热更长) |
洞察:
vLLM睡眠模式将多模型GPU服务从30-100秒的重载惩罚转变为亚秒级切换。基准测试本身就说明了一切:
LLM服务的未来是多模型。睡眠模式让这一切在今天成为现实。
特别感谢 Vensen Mu、Jeff Aw、Jun Kang Chow、Tun Jian Tan、Pin Siang Tan、Amir Balwel、Ye Hur Cheong、Zhiyao Cen 和 Kaichao You 开发睡眠模式功能并撰写本博客文章。
https://blog.vllm.ai/2025/10/26/sleep-mode.html vLLM官方博客
Xinference 大模型推理框架,离线部署,支持vLLM、SGLang、llama.cpp等引擎
字节跳动开源大模型Seed-OSS-36B,本地部署,性能实测