休眠模式¶
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 類來啟用休眠模式。
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 時,您將啟用開發端點,這些端點不應暴露給使用者。
以下是級別 1 中休眠和喚醒模型的示例。
這是級別 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 的冪。