vLLM 아키텍처 (PagedAttention)¶
개요¶
LLM을 서빙할 때 가장 병목이 되는 곳은 계산이 아니라 KV 캐시(Key-Value 캐시) 메모리예요. 모델이 문장을 만들 때마다 지금까지 본 토큰의 key·value를 계속 저장해 두는데, 이게 점점 커져서 GPU 메모리를 빠르게 잡아먹죠. vLLM은 이 메모리를 OS의 가상 메모리처럼 관리하는 PagedAttention이라는 기법을 도입해, 같은 GPU로 훨씬 많은 요청을 처리하게 해요. 이 페이지는 vLLM이 빠른 이유가 이 캐시 관리에 있다는 걸 공식 문서 기준으로 풀어요.
핵심 개념¶
PagedAttention — KV 캐시를 페이지 단위로¶
기존 방식은 생성 결과물마다 연속된 긴 메모리 블록을 미리 잡아두고 KV 캐시를 거기 채워요. 요청 길이를 예측하기 어려워서 내부 단편화(빈 구멍) 와 외부 단편화가 생기는데, vLLM의 PagedAttention은 KV 캐시를 고정 크기 페이지(블록) 로 나눠 필요할 때마다 할당합니다. OS가 물리 메모리를 페이지로 관리하는 것과 같은 아이디어예요. 덕분에 거의 100%에 가깝게 메모리를 활용할 수 있고, 메모리 낭비가 줄어 더 큰 배치(batch) 를 돌릴 수 있어요.
Continuous Batching (지속 배칭)¶
한 요청이 끝나길 기다렸다가 다음 요청을 태우는 대신, vLLM은 도착하는 요청을 바로 배치에 끼워 넣습니다. 이전 요청이 끝나면 그 슬롯에 다음 요청이 들어오는 식이라 GPU가 쉬지 않고 계산을 돌려요. 공식 문서는 첫 소개 글에서 이 지속 배칭이 처리량을 수십 배(23배)까지 높일 수 있다고 소개합니다.
Chunked Prefill / Prefix Caching¶
긴 프롬프트를 통째로 한 번에 처리하지 않고 조각(chunk)으로 나눠, 디코딩 단계와 섞어 처리하는 chunked prefill로 지연을 낮춰요. 또 공통 앞부분(시스템 프롬프트 등)이 여러 요청에서 겹치면 그 prefix(접두사) 를 캐시해 재사용하는 prefix caching으로 처음 토큰이 나오기까지 시간(TTFT)을 줄입니다.
다양한 병렬화¶
모델 하나가 GPU 한 장에 안 들어갈 때 vLLM은 텐서 병렬화, 파이프라인 병렬화, 데이터 병렬화 등으로 모델을 여러 GPU에 나눠 연산해요. 또 FP8, MXFP8, INT8, INT4, GPTQ/AWQ, GGUF 등 다양한 양자화 형식과 FlashAttention 같은 최적화 커널을 지원해서, 하드웨어에 맞는 실행 경로를 고를 수 있어요.
실제 적용 (데이터스케쳐스)¶
- 뉴런 생성 단계 자체 GPU 서빙 후보 — 큰 생성 모델을 vLLM으로 서빙하려면, PagedAttention 덕분에 같은 GPU 메모리로 더 많은 요청을 동시에 처리할 수 있어요. 프롬프트가 반복되는 제품이면 prefix caching으로 첫 응답 지연을 줄이는 효과를 기대할 수 있어요.
- 메모리 한계 극복 — H100 같은 고사양 GPU 여러 장을 잇는 구성을 검토할 때, 텐서 병렬화로 한 장에 안 들어가는 모델도 분산 배치합니다.
- 검증 시점 — 아직 로드맵 단계라 실제 처리량·메모리 절감 수치는 배포 환경에 맞춰 측정 후 확정해요.
PagedAttention의 정확한 이득(배치 크기·처리량)은 모델과 하드웨어에 따라 달라져요. 도입 시점에 우리 환경에서 측정해서 확정합니다.