본문으로 건너뛰기

[vllm] GPU Model Runner V2 - 차세대 모델 실행 엔진

PR 링크: vllm-project/vllm#25266 상태: Merged | 변경: +2,639/-12

들어가며

vLLM의 핵심인 GPU Model Runner가 V2로 재설계되었다. 기존 모델 러너의 한계를 극복하고, 비동기 스케줄링과 더 세밀한 메모리 관리를 지원하기 위한 대규모 리팩토링이다. WoosukKwon이 직접 주도한 이 PR은 vllm/v1/worker/gpu/ 디렉토리에 완전히 새로운 모듈 구조를 도입한다.

핵심 코드 분석

환경 변수를 통한 점진적 도입

# vllm/envs.py
VLLM_USE_V2_MODEL_RUNNER: bool = False

# Flag to enable v2 model runner.
"VLLM_USE_V2_MODEL_RUNNER": lambda: bool(
    int(os.getenv("VLLM_USE_V2_MODEL_RUNNER", "0"))
),

기존 러너와의 호환성을 유지하면서 환경 변수로 V2를 opt-in 할 수 있게 했다. 프로덕션 환경에서의 안전한 마이그레이션을 고려한 설계다.

스케줄러 출력 확장

# Before: 기존 NewRequestData
NewRequestData.from_request(
    req, req_to_new_blocks[req.request_id].get_block_ids()
)

# After: V2에서는 prefill_token_ids와 preempted_req_ids 추가
NewRequestData.from_request(
    req,
    req_to_new_blocks[req.request_id].get_block_ids(),
    req._all_token_ids,  # prefill용 전체 토큰 ID
)
# preempted_req_ids: 이번 스텝에서 선점된 요청 ID 집합
preempted_req_ids={req.request_id for req in preempted_reqs}

V2 러너는 preemption 발생 시 요청을 resumed가 아닌 new로 재분류하여 처리한다. 이는 상태 관리를 단순화하고 버그 가능성을 줄인다.

비동기 유틸리티와 모듈 구조

vllm/v1/worker/gpu/ 디렉토리에 async_utils.py, 멀티미디어 처리, 어텐션 백엔드 등의 모듈이 분리되어 추가되었다. 각 컴포넌트가 독립적으로 테스트·교체 가능하도록 설계되었다.

왜 이게 좋은가

  1. 모듈성: 러너 로직이 단일 파일에서 여러 모듈로 분리되어 유지보수성이 크게 향상된다
  2. 비동기 최적화: V2는 비동기 스케줄링과 네이티브로 통합되어 GPU 활용률을 극대화한다
  3. 확장성: Decode Context Parallel, ViT CUDA Graph 등 후속 최적화의 기반이 된다
  4. 안전한 전환: 환경 변수로 점진적 도입이 가능하여 프로덕션 안정성을 보장한다

정리

GPU Model Runner V2는 vLLM의 실행 엔진을 근본적으로 재설계한 PR이다. 2,639줄의 신규 코드가 추가되었지만, 기존 코드 변경은 12줄에 불과하여 기존 사용자에게 영향 없이 도입된다. 이후 PR들(#34179, #35963 등)이 이 V2 인프라 위에 구축되었다.

참고 자료


이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 코드 분석 내용은 실제 PR diff를 기반으로 합니다.

댓글

관련 포스트

PR Analysis 의 다른글