vLLM V1
vLLM V1 (vLLM V1)
vLLM은 V0 엔진 위에 V1이라는 재설계된 핵심 아키텍처를 올렸어요. V1은 V0의 안정적인 구성 요소는 그대로 유지하면서 스케줄러, KV 캐시 매니저, 워커, 샘플러, API 서버 같은 핵심 시스템을 크게 다시 설계했습니다. 이 문서는 V0과 V1 사이의 알려진 중요한 차이점과 제한 사항을 정리한 living user guide예요.
공지 (Announcement)
V0은 완전히 deprecated되었어요. 자세한 내용은 RFC #18571을 읽어보세요. V0 Engine에서는 동작하지만 V1에서는 동작하지 않는 사용 사례가 있다면 GitHub나 vLLM Slack에서 공유해 주세요.
V0은 광범위한 모델과 하드웨어를 성공적으로 지원했지만, 새 기능이 독립적으로 개발되면서 시스템이 갈수록 복잡해졌어요. 이 복잡성은 새 기능 통합을 어렵게 하고 기술 부채를 도입했으며, 더 간결하고 통일된 설계의 필요성을 드러냈죠.
V0의 성공을 바탕으로 V1은 V0의 안정적이고 검증된 구성 요소(모델, GPU 커널, 유틸리티 등)를 유지합니다. 동시에 스케줄러, KV 캐시 매니저, 워커, 샘플러, API 서버를 포괄하는 핵심 시스템을 크게 재설계해, 지속적 성장과 혁신을 더 잘 수용하는 응집력 있고 유지보수하기 쉬운 프레임워크를 제공합니다.
구체적으로 V1은 다음을 목표로 해요.
- 단순하고 모듈식이며 해킹하기 쉬운 코드베이스 제공
- CPU 오버헤드가 거의 없는 높은 성능 보장
- 핵심 최적화를 통일된 아키텍처로 결합
- 기능/최적화를 기본적으로 활성화해 설정을 거의 요구하지 않음
V1 핵심 엔진으로 업그레이드하면 특히 긴 컨텍스트 시나리오에서 상당한 성능 향상이 보인다고 해요. 자세한 내용은 vLLM V1 블로그 포스트 vLLM V1: A Major Upgrade to vLLM's Core Architecture(2025년 1월 27일 게시)를 확인하세요.
V0과의 차이점 (Differences from V0)
Chunked Prefill
Chunked prefill은 V0에서 모델 특성에 따라 조건부로 활성화되던 것과 달리, V1에서는 가능할 때마다 기본적으로 활성화돼요.
CUDA Graphs
CUDA 그래프 캡처는 V0보다 V1에서 더 많은 메모리를 차지해요.
Logprobs의 의미 변화
Logprobs 계산: 기본적으로 V1의 logprobs는 모델의 원시 출력에서 계산되는 즉시(즉 temperature scaling이나 penalty 조정 같은 로짓 사후 처리를 적용하기 전에) 반환돼요. 그 결과 반환된 logprobs는 샘플링 중 사용된 최종 조정된 확률을 반영하지 않습니다.
--logprobs-mode 플래그로 이 동작을 조정할 수 있어요. 네 가지 모드가 지원됩니다: raw_logprobs(기본값), processed_logprobs, raw_logits, processed_logits입니다. Raw는 bad words 같은 로짓 프로세서를 적용하기 전의 값이고, Processed는 temperature, top_k/top_p를 포함한 모든 프로세서를 적용한 후의 값이에요.
프리픽스 캐싱을 사용한 프롬프트 logprobs: V1은 프리픽스 캐싱이 활성화된 상태에서 프롬프트 logprobs를 전달하는 것을 지원하지만, 더 이상 logprobs를 캐시하지 않아요. 프롬프트 logprobs가 필요한 요청의 경우 엔진은 프리픽스 캐시를 무시하고 logprobs를 생성하기 위해 전체 프롬프트의 prefill을 다시 계산합니다.
기능 지원 (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, 프리픽스 캐싱, 추측 디코딩 같은 기능을 가능하게 하죠.
V1 스케줄러는 여러 스케줄링 정책을 지원해요. FCFS(First-Come, First-Served)와 우선순위 기반 스케줄링(요청이 할당된 우선순위에 따라 처리되고, FCFS가 타이브레이커)을 --scheduling-policy 인자로 구성할 수 있습니다.
하드웨어 (Hardware)
| 하드웨어 | 상태 |
|---|---|
| NVIDIA | 🟢 |
| AMD | 🟢 |
| INTEL GPU | 🟢 |
| TPU | 🟢 |
| CPU | 🟢 |
참고: 더 많은 하드웨어 플랫폼이 플러그인으로 지원될 수 있어요. 예: vllm-ascend, vllm-spyre, vllm-gaudi, vllm-openvino. 자세한 내용은 각자의 저장소를 확인하세요.
모델 (Models)
| 모델 타입 | 상태 |
|---|---|
| Decoder-only Models | 🟢 |
| Encoder-Decoder Models | 🟢 (Whisper), 🔴 (그 외) |
| Pooling Models | 🟢 |
| Mamba Models | 🟢 |
| Multimodal Models | 🟢 |
Pooling Models: 이제 완전히 지원되며, last-pooling 모델에 대해 프리픽스 캐싱과 chunked prefill이 새로 제공돼요. 더 많은 풀링 모델 범주에 대해 프리픽스 캐싱과 chunked prefill을 활성화하는 작업을 진행 중입니다.
Mamba Models: 표준 transformer 어텐션 대신 선택적 상태공간 메커니즘을 쓰는 모델이 지원돼요. Mamba-2와 Mamba-1 레이어를 쓰는 모델(Mamba2ForCausalLM, MambaForCausalLM, FalconMambaForCausalLM 등)이 지원됩니다. Mamba-2/Mamba-1 레이어와 표준 어텐션 레이어를 결합한 하이브리드 모델(Zamba2ForCausalLM, NemotronHForCausalLM, FalconH1ForCausalLM, GraniteMoeHybridForCausalLM, JambaForCausalLM)도 지원돼요. Mamba와 다른 메커니즘을 쓰는 하이브리드 모델(예: Lfm2ForCausalLM)도 지원됩니다. 위 모델들에 대해서는 아직 프리픽스 캐싱이 지원되지 않는다는 점에 주의하세요.
Encoder-Decoder Models: Whisper는 네이티브로 지원돼요. 다른 encoder-decoder 모델은 플러그인 시스템으로 지원됩니다. BART의 BartForConditionalGeneration은 공식 bart-plugin으로, Florence-2의 Florence2ForConditionalGeneration도 공식 bart-plugin으로 지원됩니다. 다른 encoder-decoder 모델(예: MllamaForConditionalGeneration)에 대해서는 플러그인 시스템을 통해 지원을 구현하는 유사한 패턴을 따르는 것을 권장해요.
기능 (Features)
| 기능 | 상태 |
|---|---|
| Prefix Caching | 🟢 Functional |
| Chunked Prefill | 🟢 Functional |
| LoRA | 🟢 Functional |
| Logprobs Calculation | 🟢 Functional |
| FP8 KV Cache | 🟢 Functional |
| Spec Decode | 🟢 Functional |
| Prompt Logprobs with Prefix Caching | 🟢 Functional |
| Structured Output Alternative Backends | 🟢 Functional |
| Concurrent Partial Prefills | 🟡 In Progress |
| best_of | 🔴 Removed |
| Per-Request Logits Processors | 🔴 Removed |
| GPU <> CPU KV Cache Swapping | 🔴 Removed |
| Request-level Structured Output Backend | 🔴 Removed |
제거된 기능 (Removed Features)
V1의 대규모 아키텍처 재설계의 일환으로 몇 가지 레거시 기능이 제거됐어요.
샘플링 기능:
best_of: 사용량이 제한적이라 제거됨. 자세한 내용은 RFC #13361 참고.- Per-Request Logits Processors: V0에서는 사용자가 요청별로 logits를 조정하는 커스텀 처리 함수를 전달할 수 있었어요. vLLM V1에서는 이 기능이 제거되었습니다. 대신 시작 시점에 설정되는 전역 logits 프로세서를 지원해요. RFC #17799 참고.
KV 캐시 기능:
- GPU <> CPU KV Cache Swapping: 새로 간소화된 핵심 아키텍처로 vLLM V1은 요청 선점(preemption)을 처리하기 위해 KV 캐시 스와핑이 더 이상 필요하지 않아요.
구조화된 출력 기능:
- Request-level Structured Output Backend: 제거됨; 폴백이 있는 대체 백엔드(outlines, guidance)가 이제 지원됩니다.