引言

多模型服務的難題: 您有兩個大語言模型(LLM),每個都能單獨放入您的 GPU,但無法同時容納。傳統解決方案迫使您做出糟糕的權衡:

  1. 保持兩個模型都載入 → 需要 2 倍的 GPU 視訊記憶體(昂貴,通常不可行)
  2. 按需重新載入模型 → 每次切換需要 30-100+ 秒(緩慢,浪費資源)

vLLM Sleep Mode

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_weightsreset_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。

模型 A: Qwen3-235B-A22B-Instruct-2507-FP8 (TP=4) | 模型 B: Qwen3-Coder-30B-A3B-Instruct (TP=1)
GPU:A100 | vLLM 0.11.0 | 睡眠級別:1 | 編譯:cudagraph_mode: FULL_AND_PIECEWISE

推理效能提升

除了更快的模型切換,睡眠模式還提供更快的推理時間。因為模型從睡眠中喚醒時已經預熱過,它們跳過了新載入模型會遇到的冷啟動開銷。

推理時間比較:喚醒模式(已預熱)vs 冷啟動(剛載入)。
推理時間 = 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 倍

模型切換時間:從睡眠中喚醒 vs 冷啟動(全新載入)。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A100 | vLLM 0.11.0 | 睡眠級別:1 | 編譯:cudagraph_mode: FULL_AND_PIECEWISE

硬體可擴充套件性:A4000 GPU 結果

睡眠模式的優勢不僅限於高階 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:推理效能

A4000 上的推理時間比較:喚醒模式(已預熱)vs 冷啟動(剛載入)。
推理時間 = prefill + decode(喚醒/載入後的首次請求)。 每個請求使用不同的問題以避免快取,輸出限制為 100 個 token。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A4000 (TP=1) | vLLM 0.11.0 | 睡眠級別:1 | 編譯:cudagraph_mode: FULL_AND_PIECEWISE

A4000:模型切換效能

A4000 上的模型切換時間:從睡眠中喚醒 vs 冷啟動(全新載入)。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A4000 (TP=1) | vLLM 0.11.0 | 睡眠級別:1 | 編譯:cudagraph_mode: FULL_AND_PIECEWISE

A4000 上的關鍵觀察

  • 推理效能: 喚醒模式為 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 無睡眠

模型 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 秒 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:推理效能

使用睡眠級別 2 的推理時間比較:喚醒模式 vs 冷啟動。
推理時間 = prefill + decode(喚醒/載入後的首次請求)。 每個請求使用不同的問題以避免快取,輸出限制為 100 個 token。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A100 (TP=1) | vLLM 0.11.0 | 睡眠級別:2 | 編譯:cudagraph_mode: FULL_AND_PIECEWISE

級別 2:模型切換效能

使用睡眠級別 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%
與級別 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 圖,這可能需要幾秒鐘。讓我們比較有預熱和無預熱的情況。

模型 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 秒 幾乎相同

見解

  • 預熱一次編譯核心,惠及所有喚醒週期: 透過初始預熱,JIT 編譯和 CUDA 圖捕獲在載入時發生一次,並在所有後續的休眠/喚醒週期中保留
  • 無預熱,每次喚醒都付出編譯成本: 5-7 倍的減速發生在每次喚醒後的首次推理中,而不僅僅是一次
  • 編譯後的核心在休眠/喚醒中保留: 在初始載入期間預熱(8.4 秒)後,所有後續喚醒的首次推理都很快(0.45 秒,0.93 秒),證明核心保持快取
  • 最小化預熱即可: 單個 1-token 的推理足以觸發完整的 JIT 編譯和 CUDA 圖捕獲,使預熱成本非常低
  • 用初始載入時間換取一致的效能: 8.4 秒的預熱成本支付一次,並在所有模型切換中分攤
  • 建議:對於生產工作負載,始終使用預熱,以期獲得一致、快速的推理效能

量化對睡眠模式的影響

量化(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)

推理時間比較:BF16 vs FP8 量化與睡眠模式。
推理時間 = prefill + decode(喚醒/載入後的首次請求)。 每個請求使用不同的問題以避免快取,輸出限制為 100 個 token。
誤差條顯示多次執行中的最小/最大變化。數值顯示在條形圖上。
GPU:A100 (TP=1) | vLLM 0.11.0 | 睡眠級別:1 | 編譯:cudagraph_mode: FULL_AND_PIECEWISE

消融研究:模型切換(BF16 vs FP8)

模型切換時間: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 MuJeff AwJun Kang ChowTun Jian TanPin Siang TanAmir BalwelYe Hur CheongZhiyao CenKaichao You 開發了睡眠模式功能並撰寫了這篇部落格文章。