vLLM 내부 해부: 고처리량 LLM 추론 시스템의 구조
Inside vLLM: Anatomy of a High-Throughput LLM Inference System (2025)
TL;DR Highlight
vLLM 엔진의 스케줄러·KV 캐시·prefix caching 구조를 한 번에 정리한 글
Who Should Read
vLLM으로 LLM을 직접 서빙하면서 처리량·지연 시간 튜닝의 원리가 궁금한 백엔드 개발자
Core Mechanics
- 엔진은 스케줄러와 KV 캐시 관리자가 핵심
- vLLM 엔진 코어는 Model Executor, Structured Output Manager, Scheduler로 구성된다.
- 스케줄러는 FCFS 또는 우선순위 정책과 waiting·running 큐를 가진다.
- KV 캐시 관리자는 paged attention의 핵심이다.
- 매 step은 스케줄, 순전파, 후처리 3단계
- 스케줄 단계에서 이번 step에 돌릴 요청(decode, 청크 prefill)을 고른다.
- 순전파 단계에서 모델을 돌려 토큰을 샘플링한다.
- 후처리 단계에서 토큰을 붙이고 종료 조건을 확인한 뒤 끝난 요청의 KV 블록을 반환한다.
- V1 스케줄러는 prefill과 decode를 한 step에 섞는다
- V0 엔진은 step마다 prefill 또는 decode 중 하나만 처리할 수 있었다.
- 스케줄러는 running 큐의 decode 요청을 먼저 처리하고 그다음 waiting 큐의 prefill을 처리한다.
- prefill은 대체로 compute-bound, decode는 memory-bandwidth-bound다.
- Chunked prefill로 긴 프롬프트의 독점을 막는다
- 긴 프롬프트의 prefill을 작은 청크로 쪼개 여러 step에 나눠 돌린다.
- 쪼개지 않으면 긴 요청 하나가 step을 독점해 다른 요청의 지연이 늘어난다.
Community Reactions
- nano-vllm 코드를 읽으면 이해가 쉽다는 의견
- 약 5kloc에 모델 하나만 지원하는 축소판이라고 한다.
- 추론 엔진을 빠르게 만드는 핵심 요소는 모두 들어 있다고 한다.
- Radix Attention과 비교가 궁금하다는 질문
- 글이 paged attention을 넘어 다룬다는 점이 좋다는 반응과 함께 나왔다.
- paged attention보다 다른 요소가 더 중요했다는 의견
- 웹 서버와 GPU 프로세스 분리, continuous batching, KV 캐싱·청킹, 저정밀도를 포함한 대형 모델 라이브러리가 더 중요했다는 평가다.
How to Apply
- prefix caching이 먹히게 프롬프트 앞부분 고정하기
- 오늘 vLLM 서비스의 프롬프트에서 시스템 프롬프트와 공통 문맥을 맨 앞에 두고 요청별 내용은 뒤에 붙여라.
- 앞부분이 16토큰 블록 단위로 일치해야 재사용되므로 공통 부분 앞에 요청마다 달라지는 값을 넣지 마라.
- 긴 프롬프트가 많으면 chunked prefill 설정 켜기
- 긴 요청 때문에 다른 요청 지연이 튀면 long_prefill_token_threshold를 양수로 설정해 비교 측정하라.
- 멀티테넌트면 cache salt 쓰기
- 사용자 간 KV 블록 재사용을 막아야 하면 요청에 cache salt를 넣어라.
- 첫 블록 해시에 salt가 들어가 같은 salt의 요청만 블록을 재사용한다.
- 디버깅할 땐 --enforce-eager로 CUDA graph 끄기
- 그래프 캡처 영향을 배제하고 싶을 때만 켜고, 평소 지연 시간 측정은 끄지 않은 상태로 해라.
Try It
# Claude 또는 ChatGPT 채팅창에 붙여넣기 (글의 prefix caching 개념을 내 서비스에 적용하는 점검 프롬프트)
나는 vLLM으로 LLM을 서빙한다. vLLM은 prefix caching(기본 켜짐)으로 16토큰 블록 단위 해시가 같은 앞부분의 KV 캐시를 재사용한다. 이 캐시는 prefill만 빠르게 하고 decode는 빠르게 하지 않는다.
아래는 우리 서비스의 프롬프트 템플릿이다.
{{프롬프트 템플릿}}
이 템플릿에서 요청마다 달라지는 부분과 항상 같은 부분을 구분해 줘. 같은 부분이 앞에 오도록 순서를 바꾼 템플릿을 제시하고, 어떤 변경이 캐시 재사용을 깨는지 설명해 줘.
이어서 해 볼 것: 바꾼 템플릿으로 같은 요청을 두 번 보내 첫 토큰까지 걸리는 시간을 비교해 봐라.Terminology
관련 논문
Mercury 3: 규모를 키운 diffusion LLM, 초당 1,000토큰 이상
Diffusion LLM을 40배 키웠더니 속도 4~8배, 품질은 속도 특화 모델 수준
Timestral: Mistral의 시계열 파운데이션 모델
209M 파라미터 시계열 모델이 3대 벤치마크 1위, CPU에서도 돌아간다
DeepSeek V4.1 Flash 1017 (Max) 성능·속도·가격 분석
DeepSeek V4.1 Flash 1017 Max는 지능 지수 45에 211 tok/s, 입력 $0.30
LLM 프록시를 직접 안 돌리면 무슨 일이 벌어지는지 어떻게 아나
자체 LLM 프록시를 세웠더니 키·모델·캐시 미스를 직접 볼 수 있다
DeepSeek V4.1 Flash 1017: 싼 가격에 1M 컨텍스트를 주는 에이전트용 모델
DeepSeek V4.1 Flash 1017은 입력 $0.05/M, 1M 컨텍스트의 에이전트용 모델
DeepSeek-V4.1-Flash-1017 공개: 더 짧게 생각하고 더 빠르게 일하는 에이전트용 모델
DeepSeek V4.1 Flash 마이너 업데이트로 코딩·에이전트 벤치 점수↑, 실행 시간·출력 길이↓
Llmspeed: 로컬 LLM 속도를 하드웨어 구매 전에 체감해 보는 시뮬레이터
GPU·모델을 고르면 로컬 LLM 속도를 미리 체감하게 해 주는 시뮬레이터