LLM 추론과 vLLM 내부 구조
이 경로는 LLM 추론을 “모델을 한 번 실행한다”가 아니라 “API, scheduler, GPU worker가 함께 요청을 처리한다”는 관점으로 읽기 위한 경로입니다.
첫 카드는 추론 엔진을 세 층으로 나눕니다. 이 지도를 먼저 잡아야 이후 기술들이 API layer의 문제인지, scheduler의 문제인지, GPU worker와 kernel의 문제인지 분류할 수 있습니다.
두 번째 카드는 prefill과 decode를 나눕니다. 이 구분을 잡아야 TTFT, TPOT, KV cache, continuous batching, PagedAttention, chunked prefill, disaggregated prefill/decode가 왜 필요한지 이어서 이해할 수 있습니다.
세 번째 카드는 KV cache입니다. KV cache는 중복 계산을 줄이는 동시에, decode를 weight와 cache를 계속 읽는 memory-bound workload로 바꿉니다. 이 지점부터 vLLM의 메모리 관리와 PagedAttention 문제가 시작됩니다.
네 번째와 다섯 번째 카드는 MQA와 GQA입니다. query head 수는 유지하면서 KV head 수를 줄이면 decode에서 KV cache 저장량과 memory bandwidth 압박이 어떻게 줄어드는지 봅니다.
여섯 번째 카드는 DeepSeek MLA입니다. KV head 수를 줄이는 접근에서 한 걸음 더 나아가, KV cache 표현 자체를 latent로 압축하는 구조를 봅니다.
일곱 번째 카드는 PagedAttention입니다. KV cache를 연속된 큰 tensor가 아니라 block table로 연결된 고정 크기 block들의 집합으로 보는 관점을 잡습니다.
여덟 번째 카드는 vLLM의 구현 연결 흐름입니다. EngineCore의 KVCacheManager가 block을 배정하고, GPU worker가 그 block id를 block table과 slot mapping으로 바꿔 attention backend에 연결하는 과정을 읽습니다.
- 추론 엔진의 세 층 — vLLM과 SGLang 같은 LLM 추론 엔진을 API, scheduler core, GPU worker로 나누어 이해한다.
- Prefill vs Decode — LLM 추론을 prompt 처리 구간과 token 생성 구간으로 나누고, 두 구간의 병목이 왜 다른지 이해한다.
- KV Cache — Decode에서 과거 token의 Key/Value를 저장해 재계산을 줄이고, 그 대가로 어떤 메모리 병목이 생기는지 이해한다.
- Multi-Query Attention — Query head는 여러 개 유지하되 Key/Value head를 하나로 줄여 KV cache와 decode 메모리 읽기를 줄이는 구조를 이해한다.
- Grouped-Query Attention — MHA와 MQA 사이에서 여러 query head가 하나의 KV head를 공유하는 절충 구조를 이해한다.
- DeepSeek MLA — DeepSeek의 Multi-head Latent Attention이 KV cache를 latent vector로 압축해 decode 병목을 어떻게 바꾸는지 이해한다.
- PagedAttention — KV cache를 고정 크기 block으로 나누고 block table로 연결해 serving 메모리 낭비를 줄이는 vLLM의 핵심 아이디어.
- vLLM의 KV cache 연결 흐름 — EngineCore가 KV block을 배정하고 GPU worker가 block table과 slot mapping으로 model forward에 연결하는 흐름을 이해한다.