vLLM 睡眠模式實現零過載模型切換
引言
多模型服務的難題: 您有兩個大語言模型(LLM),每個都能單獨放入您的 GPU,但無法同時容納。傳統解決方案迫使您做出糟糕的權衡:
- 保持兩個模型都載入 → 需要 2 倍的 GPU 視訊記憶體(昂貴,通常不可行)
- 按需重新載入模型 → 每次切換需要 30-100+ 秒(緩慢,浪費資源)

vLLM 睡眠模式提供了第三種方式: 模型可在數秒內休眠並快速喚醒——實現了按需載入的效率與持久化服務的速度。
兩種睡眠級別滿足不同需求
- 級別 1: 將權重解除安裝到 CPU 記憶體(喚醒時間快)
- 級別 2: 完全丟棄權重(喚醒時間幾乎同樣快,記憶體佔用極小)
兩種級別都比完全過載快 18-200 倍,並且與張量並行(TP)、流水線並行(PP)和專家並行(EP)無縫協作。
為什麼睡眠模式優於快速權重載入器
即使權重載入速度瞬間完成,每次冷啟動都會產生睡眠模式可以避免的隱藏成本。
| 成本 | 描述 | 快速權重載入器 | 睡眠模式 |
|---|---|---|---|
| 1. VRAM 載入時間 | 將權重複制到 GPU | ✅ 已最佳化 | ✅ 保留 |
| 2. 記憶體分配器設定 | CUDA 分配器初始化 | ❌ 每次都需要 | ✅ 保留 |
| 3. CUDA 圖捕獲 | 記錄執行圖 | ❌ 每次都需要 | ✅ 保留 |
| 4. GPU 核心 JIT 編譯 | DeepGEMM、FlashInfer、TorchInductor | ❌ 每次都需要 | ✅ 保留(初次預熱後) |
| 5. 快取預熱 | 首次請求的開銷 | ❌ 每次都需要 | ⚡ 快速重新預熱 |
透過保持程序存活,睡眠模式保留了基礎設施(#2-4),避免了昂貴的重新初始化。這就是為什麼基準測試顯示睡眠模式的推理速度比冷啟動快 61-88%。
本文涵蓋
- 跨模型大小(0.6B 到 235B)和 GPU(A4000 到 A100)的全面基準測試
- 解釋效能提升的技術深度剖析
- 關於預熱影響和 FP8 量化的消融研究
- 選擇合適睡眠級別的決策指南
快速入門:使用睡眠模式
線上服務 API
啟動兩個啟用睡眠模式的 vLLM 伺服器
# Terminal 1: Start Phi-3-vision
export VLLM_SERVER_DEV_MODE=1
vllm serve microsoft/Phi-3-vision-128k-instruct --enable-sleep-mode --port 8001
# Terminal 2: Start Qwen3-0.6B
export VLLM_SERVER_DEV_MODE=1
vllm serve Qwen/Qwen3-0.6B --enable-sleep-mode --port 8002
休眠和喚醒模型
# Put Phi-3-vision to sleep (Level 2 - minimal RAM usage)
curl -X POST 'localhost:8001/sleep?level=2'
# Put Qwen3-0.6B to sleep (Level 2)
curl -X POST 'localhost:8002/sleep?level=2'
# Wake up Phi-3-vision for inference
curl -X POST 'localhost:8001/wake_up'
curl -X POST 'localhost:8001/collective_rpc' \
-H 'Content-Type: application/json' \
-d '{"method":"reload_weights"}'
# IMPORTANT: Reset prefix cache after waking (Level 2 only)
curl -X POST 'localhost:8001/reset_prefix_cache'
# Now run inference on Phi-3-vision...
# (your inference requests here)
# Put back to sleep when done
curl -X POST 'localhost:8001/sleep?level=2'
# Wake up Qwen3-0.6B
curl -X POST 'localhost:8002/wake_up'
# (Level 1 doesn't need reload_weights or reset_prefix_cache)
# Run inference on Qwen3-0.6B...
說明
對於級別 2 睡眠,您必須在喚醒後呼叫 reload_weights 和 reset_prefix_cache。級別 1 睡眠不需要這些額外步驟。
警告
安全性: /sleep、/wake_up、/collective_rpc 和 /reset_prefix_cache 端點需要設定 VLLM_SERVER_DEV_MODE=1,並且只應在受信任的網路中暴露。這些管理端點可能會中斷服務,僅適用於封閉環境,如訓練叢集或後端應用程式。
效能概覽
讓我們看看睡眠模式與傳統模型過載相比效能如何。
睡眠模式 L1 vs 無睡眠模式的效能
下面的互動式圖表顯示了執行 5 次模型切換的總時間:在模型 A 上執行推理,切換到模型 B,在模型 B 上執行推理,然後重複此模式(A→B→A→B→A→B)。
使用睡眠模式: 模型在切換之間進行休眠/喚醒,保留了基礎設施。不使用睡眠模式: 每次切換都需要完全重啟和過載 vLLM。
GPU:A100 | vLLM 0.11.0 | 睡眠級別:1 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISE推理效能提升
除了更快的模型切換,睡眠模式還提供更快的推理時間。因為模型從睡眠中喚醒時已經預熱過,它們跳過了新載入模型會遇到的冷啟動開銷。
推理時間 = prefill + decode(喚醒/載入後的首次請求)。 每個請求使用不同的問題以避免快取,輸出限制為 100 個 token。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A100 | vLLM 0.11.0 | 睡眠級別:1 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISE為什麼睡眠模式能提高推理速度
61-88% 的推理速度提升並非來自更快的權重載入,而是來自保留了冷啟動必須從頭重建的昂貴基礎設施。
睡眠模式保留了什麼
| 元件 | 是否保留? | 冷啟動必須付出的代價 |
|---|---|---|
| 記憶體分配器 (CuMemAllocator) | ✅ 是 | ❌ 每次重新初始化 |
| CUDA 圖 | ✅ 是 | ❌ 每次重新捕獲 |
| 程序狀態(Python、CUDA 上下文) | ✅ 是 | ❌ 每次重啟 |
| GPU 核心 JIT 快取 | ✅ 是(初次預熱後) | ❌ 每次重新編譯 |
關鍵區別
- 不使用睡眠模式: 程序在解除安裝時終止 → 您無法從預熱中受益
- 必須重啟 Python 程序和 CUDA 上下文
- 必須重新初始化記憶體分配器
- 必須重新捕獲 CUDA 圖
- 必須重新 JIT 編譯核心(DeepGEMM、FlashInfer、TorchInductor)
- 結果: 首次推理速度慢 4-7 倍(參見基準測試:0.92 秒喚醒 vs 3.72 秒冷啟動)
- 使用睡眠模式: 程序保持存活 → 預熱效果顯著
- ✅ 分配器、圖、程序狀態和 JIT 核心在初次預熱後都得到保留
- 結果: 首次推理保持快速(約 1 秒),避免了 3-4 秒的冷啟動懲罰
說明
時間因模型大小、GPU 代數和配置而有顯著差異。請參閱預熱對睡眠模式的影響部分,瞭解詳細測量資料,顯示無預熱時速度下降 5-7 倍。
模型切換效能
睡眠模式最顯著的優勢在於模型切換時間。喚醒一個休眠中的模型比載入一個新的 vLLM 例項快 18-20 倍。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A100 | vLLM 0.11.0 | 睡眠級別:1 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISE硬體可擴充套件性:A4000 GPU 結果
睡眠模式的優勢不僅限於高階 GPU。以下是在 A4000 GPU 上使用較小模型的相同工作負載,證明了效能增益可在不同硬體層級和模型大小上擴充套件。
GPU:A4000 (TP=1) | vLLM 0.11.0 | 睡眠級別:1 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISEA4000:推理效能
推理時間 = prefill + decode(喚醒/載入後的首次請求)。 每個請求使用不同的問題以避免快取,輸出限制為 100 個 token。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A4000 (TP=1) | vLLM 0.11.0 | 睡眠級別:1 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISEA4000:模型切換效能
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A4000 (TP=1) | vLLM 0.11.0 | 睡眠級別:1 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISEA4000 上的關鍵觀察
- 推理效能: 喚醒模式為 Qwen3-0.6B 提供了 83% 的推理速度提升,為 Phi-3-vision 提供了 81% 的速度提升
- 模型切換: 喚醒時間極快(約 0.1-0.8 秒),與冷啟動相比實現了 58-203 倍的加速
- 總時間節省:62%(5 次模型切換,85 秒 vs 226 秒)
- 小型模型的近乎即時切換(0.1 秒喚醒時間),使多模型服務感覺無縫
- 證明了睡眠模式在不同 GPU 等級和模型大小上均有效
睡眠級別:選擇正確的模式
vLLM 睡眠模式提供兩種級別,各有不同的權衡
級別 1(預設): 將模型權重解除安裝到 CPU 記憶體,丟棄 KV 快取
- 最快的喚醒時間(小模型約 0.1-0.8 秒,大模型約 3-6 秒)
- 需要足夠的 CPU 記憶體來儲存模型權重
- 最適合: CPU 記憶體充足、模型切換頻繁的系統
級別 2: 丟棄模型權重和 KV 快取,僅在 CPU 中保留緩衝區(如 rope 縮放張量等)
- 喚醒時間較慢(小模型約 0.8-2.6 秒),因為需要從磁碟重新載入權重
- CPU 記憶體佔用極小 - 僅保留小型緩衝區
- 最適合: CPU 記憶體有限或需要管理許多無法全部放入記憶體的模型的系統
效能比較:級別 1 vs 級別 2 vs 無睡眠
GPU:A100 (TP=1) | vLLM 0.11.0 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISE比較所有三種模式:級別 1(最快)、級別 2(記憶體佔用最小)、無睡眠。懸停檢視確切時間。
效能總結
| 模式 | 總時間 | 喚醒時間 (A/B) | CPU 記憶體 | 最適合 |
|---|---|---|---|---|
| 無睡眠 | 357.1 秒 | N/A(完全過載) | 最小 | 單一模型,無需切換 |
| 級別 1 | 112.6 秒 | 0.26 秒 / 0.82 秒 | 高(每個模型約 GB) | 切換頻繁,記憶體充足 |
| 級別 2 | 124.6 秒 | 0.85 秒 / 2.58 秒 | 最小(每個模型約 MB) | 記憶體有限,成本最佳化 |
關鍵見解
- 級別 1 最快(比無睡眠快 68%),但需要大量 CPU 記憶體
- 級別 2 幾乎同樣快(比無睡眠快 65%),且記憶體需求極小
- 級別 2 喚醒比級別 1 慢約 3 倍(Qwen3-0.6B 為 0.85 秒 vs 0.26 秒),因為需要過載權重
- 兩種睡眠模式都比無睡眠模式有巨大改進
為什麼級別 2 仍然比無睡眠模式快
乍一看,這似乎有悖常理:級別 2 從 SSD 重新載入權重(就像“無睡眠模式”一樣),那麼為什麼它總體上快 23-45 倍?
答案:權重載入只是五個成本之一
當您在不使用睡眠模式的情況下重新載入模型時,您需要支付所有這些成本:
| 成本 | 級別 2 | 無睡眠模式 |
|---|---|---|
| 1. 權重載入 (SSD → VRAM) | ❌ 必須支付 | ❌ 必須支付 |
| 2. 程序初始化 | ✅ 跳過 | ❌ 必須支付 |
| 3. 記憶體分配器設定 | ✅ 跳過 | ❌ 必須支付 |
| 4. CUDA 圖捕獲 | ✅ 跳過 | ❌ 必須支付 |
| 5. GPU 核心 JIT 編譯 | ✅ 保留(已編譯) | ❌ 完全編譯 + 預熱 |
級別 2 策略
- 從 SSD 過載權重(與無睡眠模式相同)
- 其他一切都保留: 程序狀態、分配器例項、CUDA 圖和已編譯的 JIT 核心都完好無損
- 無需重新編譯: 核心在初次預熱期間已編譯並保持快取
- 每次切換平均耗時:約 2.6 秒(見上文基準資料)
無睡眠模式的現實
- 從 SSD 過載權重(與級別 2 相同)
- 其他一切都重建: 程序重啟 + 分配器初始化 + 圖重新捕獲
- JIT 核心: 完全編譯 + 顯式預熱程式 (
kernel_warmup()+ 虛擬執行) - 每次切換平均耗時:約 48 秒(見上文基準資料)
基準資料證明了這一點: 對於 5 次模型切換
- 級別 2: 總計 124.6 秒(每次切換平均約 2.6 秒)
- 無睡眠: 總計 357.1 秒(每次切換平均約 48 秒)
儘管兩者都從 SSD 過載權重,但級別 2 總體上快 2.9 倍,因為它保留了昂貴的基礎設施(程序狀態、分配器、CUDA 圖),而無睡眠模式每次都必須從頭重建。
級別 2:推理效能
推理時間 = prefill + decode(喚醒/載入後的首次請求)。 每個請求使用不同的問題以避免快取,輸出限制為 100 個 token。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A100 (TP=1) | vLLM 0.11.0 | 睡眠級別:2 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISE級別 2:模型切換效能
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
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% |
| 與級別 1 相比的喚醒時間 | - | 慢 3-10 倍 | 用 CPU 記憶體換取速度 |
何時使用級別 2
- CPU 記憶體有限: 系統無法在 CPU 記憶體中容納所有模型權重
- 成本最佳化: 使用 CPU 記憶體較少的更便宜的雲實例
- 模型眾多: 在多個模型間切換,且 CPU 記憶體是限制因素
- 仍然有顯著增益: 即使需要過載權重,級別 2 仍比無睡眠模式快 23-45 倍
級別 1 vs 級別 2 比較
- 級別 1:約 0.1-0.8 秒喚醒時間,每個模型需要約 10-100GB+ CPU 記憶體
- 級別 2:約 0.8-2.6 秒喚醒時間,每個模型僅需約 MB 級 CPU 記憶體
- 兩者都比完全過載(約 20-100 秒)快得多
消融研究
預熱對睡眠模式的影響
跳過預熱階段會影響效能嗎?預熱會在初始載入期間預編譯 CUDA 圖,這可能需要幾秒鐘。讓我們比較有預熱和無預熱的情況。
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 秒 | 幾乎相同 |
見解
- 預熱一次編譯核心,惠及所有喚醒週期: 透過初始預熱,JIT 編譯和 CUDA 圖捕獲在載入時發生一次,並在所有後續的休眠/喚醒週期中保留
- 無預熱,每次喚醒都付出編譯成本: 5-7 倍的減速發生在每次喚醒後的首次推理中,而不僅僅是一次
- 編譯後的核心在休眠/喚醒中保留: 在初始載入期間預熱(8.4 秒)後,所有後續喚醒的首次推理都很快(0.45 秒,0.93 秒),證明核心保持快取
- 最小化預熱即可: 單個 1-token 的推理足以觸發完整的 JIT 編譯和 CUDA 圖捕獲,使預熱成本非常低
- 用初始載入時間換取一致的效能: 8.4 秒的預熱成本支付一次,並在所有模型切換中分攤
- 建議:對於生產工作負載,始終使用預熱,以期獲得一致、快速的推理效能
量化對睡眠模式的影響
量化(FP8)會影響睡眠模式的效能嗎?我們在 A100 GPU 上測試了有和沒有 FP8 量化的相同工作負載。
GPU:A100 (TP=1) | vLLM 0.11.0 | 睡眠級別:1 | 編譯:
cudagraph_mode: FULL_AND_PIECEWISE比較 BF16(基線)vs FP8 量化。懸停檢視確切時間。
消融研究:推理效能(BF16 vs FP8)
推理時間 = prefill + decode(喚醒/載入後的首次請求)。 每個請求使用不同的問題以避免快取,輸出限制為 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%(預熱時間更長) |
見解
- FP8 的喚醒操作更快(快 13-33%),因為記憶體移動更少
- FP8 改善了較大模型的推理效能(Phi-3-vision 快 30%),但對微小模型差異不大
- 使用 FP8 的初始載入時間更長,因為預熱期間有量化開銷
- 初始載入後,FP8 提供更平滑的切換和更快的喚醒週期
- 對於切換頻繁的工作負載,FP8 更快的喚醒時間可以抵消較長的初始載入時間
決策指南:使用哪個睡眠級別?
何時使用睡眠級別 1
- 您有足夠的 CPU 記憶體來容納所有模型權重
- 您需要儘可能快的喚醒時間(0.1-6 秒)
- 您非常頻繁地切換模型(每隔幾秒/幾分鐘)
- 推理延遲的一致性至關重要
何時使用睡眠級別 2
- CPU 記憶體有限(無法容納所有模型權重)
- 您正在最佳化雲成本(記憶體較少的更便宜的例項)
- 您需要管理許多模型(10+)
何時跳過睡眠模式
- 您只使用單個模型(無需切換)
- 模型切換極為罕見(每天/每週一次)
- 兩個模型可以同時放入 GPU 視訊記憶體
結論
vLLM 睡眠模式將多模型 GPU 服務的 30-100 秒過載懲罰轉變為亞秒級切換。基準測試不言自明:
- 模型切換速度快 18-200 倍,具體取決於模型大小和硬體
- 預熱模型與冷啟動相比,推理速度快 61-88%
- 在整個工作負載中總時間節省 65-68%
- 適用於各種規模: 從 0.6B 到 235B 引數,小型和大型 GPU 均可
LLM 服務的未來是多模型的。睡眠模式使其在今天成為現實。
致謝
特別感謝 Vensen Mu、Jeff Aw、Jun Kang Chow、Tun Jian Tan、Pin Siang Tan、Amir Balwel、Ye Hur Cheong、Zhiyao Cen 和 Kaichao You 開發了睡眠模式功能並撰寫了這篇部落格文章。