vLLM V1
vLLM V1
vLLM V0은 광범위한 모델·하드웨어를 지원했지만, 새 기능이 독립적으로 개발되면서 시스템이 점점 복잡해졌습니다. vLLM V1은 V0의 검증된 구성 요소(모델, GPU 커널, 유틸리티)는 유지하면서 스케줄러·KV cache 매니저·워커·샘플러·API 서버의 코어 시스템을 크게 재설계해, 지속적인 성장과 혁신에 더 잘 대응하는 응집력 있고 유지 가능한 프레임워크를 제공합니다.
출처: 문서
본문
공지
V0은 완전히 폐기되었습니다. 자세한 내용은 RFC #18571을 읽어보세요.
V0 엔진에서는 동작하지만 V1에서는 안 되는 사용 사례가 있다면 GitHub 또는 vLLM Slack에서 공유해 주세요.
vLLM V0은 다양한 모델·하드웨어를 성공적으로 지원했지만, 새 기능이 독립적으로 개발되면서 시스템이 점점 복잡해졌습니다. 이 복잡성은 새 기능 통합을 어렵게 하고 기술 부채를 도입했으며, 더 간소화되고 통일된 설계의 필요성을 드러냈습니다.
V0의 성공을 바탕으로, vLLM V1은 V0의 안정적이고 검증된 구성 요소(모델, GPU 커널, 유틸리티)를 유지합니다. 동시에 스케줄러, KV cache 매니저, 워커, 샘플러, API 서버를 포함한 코어 시스템을 크게 재설계해, 지속적인 성장과 혁신에 더 잘 대응하는 응집력 있고 유지 가능한 프레임워크를 제공합니다.
구체적으로 V1은 다음을 목표로 합니다:
- 단순하고 모듈화되어 해킹하기 쉬운 코드베이스 제공
- CPU 오버헤드가 거의 없는 고성능 보장
- 핵심 최적화를 통일된 아키텍처로 결합
- 기능/최적화를 기본 활성화해 제로 설정(zero configs) 요구
V1 코어 엔진으로 업그레이드하면 특히 긴 컨텍스트 시나리오에서 상당한 성능 향상을 볼 수 있습니다. 성능 벤치마크는 [추가 예정]입니다.
자세한 내용은 vLLM V1 블로그 포스트 vLLM V1: A Major Upgrade to vLLM's Core Architecture(2025년 1월 27일 게시)를 확인하세요.
이 살아있는 사용자 가이드는 vLLM V1이 도입한 몇 가지 알려진 중요한 변경사항과 제한사항을 설명합니다. 팀은 V1을 기본 엔진으로 만들기 위해 적극적으로 작업하고 있어, V1에서 더 많은 기능이 지원될수록 이 가이드도 계속 업데이트될 것입니다.
V0과의 차이점 (Differences from V0)
이 섹션은 V0과 V1 사이의 동작 차이를 나열합니다.
Chunked Prefill
V0에서는 모델 특성에 따라 조건부로 활성화됐던 chunked prefill이 V1에서는 가능할 때마다 기본으로 활성화됩니다.
CUDA Graphs
V1에서 CUDA graph 캡처는 V0보다 더 많은 메모리를 차지합니다.
Logprobs 의미 변화 (Semantic Changes to Logprobs)
Logprobs 계산
기본적으로 V1의 logprobs는 모델 원시 출력에서 계산되는 즉시 반환됩니다(즉 temperature 스케일링이나 penalty 조정 같은 logits 후처리를 적용하기 전). 그 결과, 반환된 logprobs는 샘플링 중 사용된 최종 조정 확률을 반영하지 않습니다.
이 동작은 --logprobs-mode 플래그로 조정할 수 있습니다. 네 가지 모드가 지원됩니다: raw_logprobs(기본값), processed_logprobs, raw_logits, processed_logits. Raw는 bad words 같은 logit 프로세서를 적용하기 전의 값, Processed는 temperature와 top_k/top_p를 포함한 모든 프로세서를 적용한 후의 값을 의미합니다.
Prefix Caching을 쓰는 Prompt Logprobs
V1은 prefix caching이 활성화된 상태로 prompt logprobs 전달을 지원하지만, 더 이상 logprobs를 캐시하지 않습니다. prompt logprobs가 필요한 요청에서는 엔진이 prefix cache를 무시하고 전체 프롬프트의 prefill을 재계산해 logprobs를 생성합니다.
기능 지원 (Feature Support)
각 항목의 vLLM V1 지원 상태는 다음 중 하나입니다:
- 🟢 Functional: V0과 동등하거나 더 나은 최적화로 완전히 동작
- 🟡 In Progress: vLLM V1에 포함될 예정이며, 열린 PR/RFC가 있음
- 🔴 Removed: vLLM V1에서 제거됨. 강한 수요가 있을 때만 재도입 고려
참고
vLLM V1의 통합 스케줄러는 간단한 딕셔너리(예: {request_id: num_tokens})로 프롬프트·출력 토큰을 모두 똑같이 취급해 요청별 고정 토큰 예산을 동적으로 할당합니다. 이로써 prefill과 decode 단계의 엄격한 분리 없이 chunked prefill, prefix caching, speculative decoding 같은 기능이 가능해집니다.
V1 스케줄러는 FCFS(First-Come, First-Served)와 우선순위 기반 스케줄링(요청을 할당된 우선순위로 처리, 동률 시 FCFS)을 포함한 여러 스케줄링 정책을 지원하며, --scheduling-policy 인자로 구성합니다.
하드웨어
| 하드웨어 | 상태 |
|---|---|
| NVIDIA | 🟢 |
| AMD | 🟢 |
| INTEL GPU | 🟢 |
| TPU | 🟢 |
| CPU | 🟢 |
참고
플러그인을 통해 더 많은 하드웨어 플랫폼이 지원될 수 있습니다. 예:
해당 리포지토리에서 자세한 내용을 확인하세요.
모델
| 모델 유형 | 상태 |
|---|---|
| Decoder-only 모델 | 🟢 |
| Encoder-Decoder 모델 | 🟢 (Whisper), 🔴 (기타) |
| 풀링 모델 (Pooling Models) | 🟢 |
| Mamba 모델 | 🟢 |
| 멀티모달 모델 (Multimodal Models) | 🟢 |
아직 지원되지 않거나 V1에서 더 많은 기능이 계획된 모델의 상태는 아래를 참고하세요.
풀링 모델
이제 완전히 지원되며, last-pooling 모델에 대해 새로 prefix caching과 chunked prefill을 사용할 수 있습니다.
더 많은 종류의 풀링 모델에 prefix caching과 chunked prefill을 활성화하는 작업을 진행 중입니다.
Mamba 모델
표준 transformer 어텐션 대신 선택적 상태 공간(selective state-space) 메커니즘을 사용하는 모델이 지원됩니다. Mamba-2와 Mamba-1 레이어를 사용하는 모델(예: Mamba2ForCausalLM, MambaForCausalLM, FalconMambaForCausalLM)이 지원됩니다.
표준 어텐션 레이어와 Mamba-2/Mamba-1 레이어를 결합한 하이브리드 모델도 지원됩니다(예: Zamba2ForCausalLM, NemotronHForCausalLM, FalconH1ForCausalLM, GraniteMoeHybridForCausalLM, JambaForCausalLM).
Mamba와 다른 메커니즘을 쓰는 하이브리드 모델도 지원됩니다(예: Lfm2ForCausalLM).
위 모델 중 어느 것도 아직 prefix caching이 지원되지 않습니다.
Encoder-Decoder 모델
Whisper는 네이티브로 지원됩니다. 다른 encoder-decoder 모델은 플러그인 시스템으로 지원됩니다:
- BART:
BartForConditionalGeneration은 공식 bart-plugin으로 지원 - Florence-2:
Florence2ForConditionalGeneration은 공식 bart-plugin으로 지원
다른 encoder-decoder 모델(예: MllamaForConditionalGeneration)은 플러그인 시스템을 통해 비슷한 패턴으로 구현하는 것을 권장합니다.
기능
| 기능 | 상태 |
|---|---|
| Prefix Caching | 🟢 Functional |
| Chunked Prefill | 🟢 Functional |
| LoRA | 🟢 Functional |
| Logprobs 계산 | 🟢 Functional |
| FP8 KV Cache | 🟢 Functional |
| Spec Decode | 🟢 Functional |
| Prefix Caching과 함께 쓰는 Prompt Logprobs | 🟢 Functional |
| Structured Output 대체 백엔드 | 🟢 Functional |
| Concurrent Partial Prefills | 🟡 진행 중 |
| best_of | 🔴 제거됨 |
| 요청별 Logits 프로세서 | 🔴 제거됨 |
| GPU ↔ CPU KV Cache 스와핑 | 🔴 제거됨 |
| 요청 레벨 Structured Output 백엔드 | 🔴 제거됨 |
참고
vLLM V1의 통합 스케줄러는 간단한 딕셔너리(예: {request_id: num_tokens})로 프롬프트·출력 토큰을 모두 똑같이 취급해 요청별 고정 토큰 예산을 동적으로 할당합니다. 이로써 chunked prefill, prefix caching, speculative decoding 같은 기능을 prefill과 decode 단계의 엄격한 분리 없이 가능하게 합니다.
제거된 기능 (Removed Features)
vLLM V1의 주요 아키텍처 재작업의 일환으로 여러 레거시 기능이 제거되었습니다.
샘플링 기능 (Sampling features)
- best_of: 사용이 제한적이라 제거되었습니다. RFC #13361 참고
- 요청별 Logits 프로세서 (Per-Request Logits Processors): V0에서는 사용자가 요청별로 logits를 조정하는 커스텀 처리 함수를 전달할 수 있었습니다. vLLM V1에서는 이 기능이 제거되었습니다. 대신 시작 시 설정되는 전역 logits 프로세서를 지원합니다. RFC #17799 참고
KV Cache 기능 (KV Cache features)
- GPU ↔ CPU KV Cache 스와핑: 새로 간소화된 코어 아키텍처로 vLLM V1은 요청 선점(preemption) 처리에 KV cache 스와핑이 더 이상 필요하지 않습니다
Structured Output 기능
- 요청 레벨 Structured Output 백엔드: 제거됨. 폴백(fallbacks)이 있는 대체 백엔드(outlines, guidance)를 이제 지원
더 알아보기 (Learn more)
- vLLM V1 블로그 — V1 아키텍처 업그레이드
- 일반 문제 해결 — 알려진 문제와 해결법
- 배치 불변성 — 재현 가능한 출력