Sleep Mode

Sleep Mode (슬립 모드)

vLLM의 Sleep Mode는 서버를 멈추거나 Docker 컨테이너를 내리지 않고도 모델이 쓰는 GPU 메모리 대부분을 임시로 해제할 수 있게 해줘요. 여기에는 모델 가중치와 KV 캐시가 포함돼요. RLHF, 학습, 또는 추론 워크로드 사이에 GPU 자원을 풀어야 하는 비용 절감 시나리오에서 특히 유용해요.

주요 이점:

  • GPU 메모리 해제: 모델 가중치를 CPU RAM으로 오프로드하고 KV 캐시를 버려서, 다른 작업에 GPU 메모리의 90%+를 사용할 수 있게 해줘요.
  • 빠른 재개: 전체 모델 재로드 없이 엔진을 빠르게 깨워서 추론을 재개할 수 있어요.
  • API 엔드포인트: HTTP 엔드포인트나 Python API로 sleep/wake_up 상태를 제어할 수 있어요.
  • 분산 워크로드 지원: 텐서 병렬화, 파이프라인 병렬화 등에서 동작해요.
  • 세밀한 제어: 가중치 갱신 중 OOM을 피하려고 모델 가중치나 KV 캐시만 선택적으로 깨울 수 있어요.

!!! note 이 기능은 현재 CUDA와 ROCm 플랫폼에서 지원돼요.

!!! note 자세한 내용은 이 블로그 포스트를 참고하세요.

슬립 레벨 (Sleep levels)

레벨 1 슬립은 모델 가중치를 오프로드하고 KV 캐시를 버려요. KV 캐시 내용은 잊혀집니다. 레벨 1 슬립은 같은 모델을 다시 실행하려고 엔진을 슬립시키고 깨울 때 좋아요. 모델 가중치는 CPU 메모리에 백업돼요. 모델 가중치를 저장할 충분한 CPU 메모리가 있는지 확인해 주세요. 레벨 2 슬립은 모델 가중치와 KV 캐시를 모두 버려요(모델의 버퍼(rope 스케일 텐서 같은)는 CPU에 유지돼요). 모델 가중치와 KV 캐시 내용이 모두 잊혀집니다. 레벨 2 슬립은 이전 모델 가중치가 필요 없는 다른 모델을 실행하거나 모델을 갱신할 목적으로 엔진을 슬립·기상시킬 때 좋아요(예: RLHF 가중치 갱신). 레벨 2 슬립은 모델 가중치를 백업할 CPU 메모리가 충분하지 않을 때도 유용해요(예: 같은 기기에 학습기가 그 자신의 상태를 오프로드하는 데 CPU 메모리를 이미 쓰는 경우). 아무것도 백업되지 않으니, 깨운 뒤 collective_rpc("reload_weights")로 가중치를 복원하세요.

사용법 (Usage)

오프라인 추론 (Offline inference)

LLM 클래스에 enable_sleep_mode=True를 넘겨 슬립 모드를 활성화해요.

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

Python API

# 슬립 레벨 1
# 엔진 슬립 (level=1: 가중치를 CPU RAM으로 오프로드, KV 캐시 버림)
llm.sleep(level=1)

# 엔진 기상 (가중치 복원)
llm.wake_up()
# 슬립 레벨 2
# 엔진 슬립 (level=2: 가중치와 KV 캐시 모두 버림)
llm.sleep(level=2)

# 가중치 메모리만 재할당
llm.wake_up(tags=["weights"])

# 가중치 in-place 로드
llm.collective_rpc("reload_weights")

# KV 캐시 재할당
llm.wake_up(tags=["kv_cache"])

RLHF 가중치 갱신

RLHF 학습 중 vLLM은 wake_up()tags 인자로 모델 가중치만, 또는 KV 캐시만 선택적으로 깨울 수 있게 해줘요. 이 세밀한 제어는 모델 가중치를 갱신할 때 특히 유용해요. 가중치만 깨우면(llm.wake_up(tags=["weights"])) 가중치 갱신이 끝날 때까지 KV 캐시용 메모리를 할당하지 않으므로, 가중치 동기화·갱신 중 최대 메모리 사용을 최소화해 큰 모델에서 특히 GPU OOM(Out-Of-Memory)을 막아줘요.

tags=["weights"] 또는 tags=["kv_cache"]로 복원할 자원을 제어해요. RLHF와 가중치 갱신에 유용해요. 참고 모든 구성 요소가 깨어날 때까지 is_sleepingtrue를 보고해요.

# 엔진 딥 슬립 (level=2)
llm.sleep(level=2)
# ... 새 가중치를 얻음
# OOM을 피하려고 가중치만 깨움
llm.wake_up(tags=["weights"])
# ... 가중치 갱신
# 가중치가 갱신된 뒤 KV 캐시 깨움
llm.wake_up(tags=["kv_cache"])

온라인 서빙 (Online Serving)

vLLM 서버에서 슬립 모드를 활성화하려면 VLLM_SERVER_DEV_MODE=1 플래그로 초기화하고 vLLM 서버에 --enable-sleep-mode를 넘겨야 해요.

개발 모드 서버 (Server in development mode)

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 'http://localhost:8000/sleep?level=1'
curl -X POST 'http://localhost:8000/wake_up'

레벨 2로 슬립시키고 깨우는 예시는 아래와 같아요.

curl -X POST 'http://localhost:8000/sleep?level=2'
# 가중치 메모리만 재할당
curl -X POST 'http://localhost:8000/wake_up?tags=weights'
# 가중치 in-place 로드
curl -X POST 'http://localhost:8000/collective_rpc' -H 'Content-Type: application/json' -d '{"method":"reload_weights"}'
# KV 캐시 재할당
curl -X POST 'http://localhost:8000/wake_up?tags=kv_cache'

HTTP 엔드포인트

  • POST /sleep?level=1 — 모델을 슬립시키기(level=1).
  • POST /wake_up — 모델 깨우기. 부분 기상을 위한 선택적 tags 쿼리 파라미터 지원(예: ?tags=weights).
  • POST /collective_rpc — collective 원격 프로시저 호출(RPC) 수행.
  • GET /is_sleeping — 모델이 슬립 중인지 확인.

!!! note 이 엔드포인트는 VLLM_SERVER_DEV_MODE=1을 넘길 때만 사용할 수 있어요.

제한 사항 (Limitation)

ROCm에서 가상 메모리 할당은 청크 단위 메모리 할당으로 이뤄져요. VLLM_ROCM_SLEEP_MEM_CHUNK_SIZE(MB 단위)로 청크 크기를 제어할 수 있어요. 기본값은 256MB예요. 청크 크기가 클수록 성능이 빨라져요. 다만 너무 크게 설정하면 OOM이 발생할 수 있어요. 슬립 모드를 쓸 때 OOM이 발생하면 청크 크기를 줄여 보세요. 청크 크기는 2의 거듭제곱으로 정의하는 걸 권장해요.

더 알아보기