跳到內容

休眠模式

vLLM 的 休眠模式 允許您在不停止伺服器或解除安裝 Docker 容器的情況下,臨時釋放模型使用的大部分 GPU 記憶體,包括模型權重和 KV 快取。這對於 RLHF、訓練或成本節省等場景特別有用,在這些場景中,GPU 資源需要在推理工作負載之間釋放。

主要優點

  • 釋放 GPU 記憶體:將模型權重解除安裝到 CPU RAM 並丟棄 KV 快取,釋放高達 90% 以上的 GPU 記憶體用於其他任務。
  • 快速恢復:無需完全重新載入模型,即可快速喚醒引擎並恢復推理。
  • API 端點:透過 HTTP 端點或 Python API 控制休眠/喚醒狀態。
  • 支援分散式工作負載:適用於張量並行、流水線並行等。
  • 細粒度控制:可以選擇僅喚醒模型權重或 KV 快取,以避免在權重更新期間出現 OOM(記憶體不足)錯誤。

注意

此功能現在支援 CUDA 和 ROCm 平臺。

注意

更多資訊,請參閱這篇部落格文章

休眠級別

1 級休眠將解除安裝模型權重並丟棄 KV 快取。KV 快取的內容將被遺忘。1 級休眠適用於休眠然後喚醒引擎以再次運行同一模型。模型權重會備份在 CPU 記憶體中。請確保有足夠的 CPU 記憶體來儲存模型權重。2 級休眠將丟棄模型權重和 KV 快取(但模型的緩衝區會保留在 CPU 中,例如 rope scaling tensors)。模型權重和 KV 快取的內容都會被遺忘。2 級休眠適用於休眠然後喚醒引擎以執行不同的模型或更新模型,此時不需要之前的模型權重,例如 RLHF 權重更新。

用法

離線推理

透過將 enable_sleep_mode=True 傳遞給 LLM 類來啟用休眠模式。

from vllm import LLM
llm = LLM("Qwen/Qwen3-0.6B", enable_sleep_mode=True)

Python API

# Sleep level 1
# Put the engine to sleep (level=1: offload weights to CPU RAM, discard KV cache)
llm.sleep(level=1)

# Wake up the engine (restore weights)
llm.wake_up()
# Sleep level 2
# Put the engine to sleep (level=2: discard both weights and KV cache)
llm.sleep(level=2)

# Reallocate weights memory only
llm.wake_up(tags=["weights"])

# Load weights in-place
llm.collective_rpc("reload_weights")

# Reallocate KV cache
llm.wake_up(tags=["kv_cache"])

RLHF 權重更新

在 RLHF 訓練期間,vLLM 允許您使用 `wake_up()` 中的 `tags` 引數選擇性地僅喚醒模型權重或 KV 快取。這種細粒度控制在更新模型權重時特別有用:透過僅喚醒權重(例如,`llm.wake_up(tags=["weights"])`),您可以在權重更新完成後才分配 KV 快取的記憶體。這種方法透過最小化權重同步和更新操作期間的峰值記憶體使用量,有助於防止 GPU 記憶體不足(OOM)錯誤,尤其是在使用大型模型時。

使用 tags=["weights"]tags=["kv_cache"] 來控制恢復哪些資源,這對於 RLHF 和權重更新很有用。注意,在所有元件都喚醒之前,is_sleeping 將報告 true

# Put engine to deep sleep (level=2)
llm.sleep(level=2)
# ... Get the new weights
# Wake up only weights to avoid OOM
llm.wake_up(tags=["weights"])
# ... Update the weights
# wake up KV cache after weights are updated
llm.wake_up(tags=["kv_cache"])

線上服務

要在 vLLM 伺服器中啟用休眠模式,您需要使用標誌 VLLM_SERVER_DEV_MODE=1 初始化它,並將 --enable-sleep-mode 傳遞給 vLLM 伺服器。

伺服器開發模式

使用標誌 VLLM_SERVER_DEV_MODE=1 時,您將啟用開發端點,這些端點不應暴露給使用者。

VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen3-0.6B \
  --enable-sleep-mode \
  --port 8000

以下是級別 1 中休眠和喚醒模型的示例。

curl -X POST 'https://:8000/sleep?level=1'
curl -X POST 'https://:8000/wake_up'

這是級別 2 中休眠和喚醒模型的示例。

curl -X POST 'https://:8000/sleep?level=2'
# Reallocate weights memory only
curl -X POST 'https://:8000/wake_up?tags=weights'
# Load weights in-place
curl -X POST 'https://:8000/collective_rpc' -H 'Content-Type: application/json' -d '{"method":"reload_weights"}'
# Reallocate KV cache
curl -X POST 'https://:8000/wake_up?tags=kv_cache'

HTTP 端點

  • POST /sleep?level=1 — 將模型置於休眠狀態(level=1)。
  • POST /wake_up — 喚醒模型。支援可選的 tags 查詢引數以進行部分喚醒(例如,?tags=weights)。
  • POST /collective_rpc — 執行集合遠端過程呼叫(RPC)。
  • GET /is_sleeping — 檢查模型是否處於休眠狀態。

注意

這些端點僅在傳遞 VLLM_SERVER_DEV_MODE=1 時可用。

限制

在 ROCm 上,ROCm 上的虛擬記憶體分配是透過分塊記憶體分配完成的。您可以透過 VLLM_ROCM_SLEEP_MEM_CHUNK_SIZE(以 MB 為單位)來控制分塊大小。預設值為 256MB。分塊越大,效能越快。但是,設定得太大將導致 OOM。因此,如果您在使用休眠模式時遇到 OOM。請嘗試減小分塊大小。建議將分塊大小定義為 2 的冪。