2026년 8월 30일 일요일

LLM 서빙 캐싱 ② — KV 캐시와 메모리 경제학: GPU 한 장에 몇 명을 태우나

자체 서빙에서 GPU 메모리는 두 덩어리로 쓰인다. 모델 가중치와 KV 캐시. 가중치는 상수다 — 모델을 고르는 순간 정해진다. KV 캐시는 변수다 — 동시에 처리하는 토큰 수에 비례해 늘어나고, 이것이 배치 크기를, 배치 크기가 처리량을, 처리량이 토큰당 비용을 결정한다. 그래서 캐싱 시리즈의 두 번째 글은 캐시를 "재사용"하기 전에 캐시가 왜 비용의 변수인지부터 짚는다.

한 줄 공식과 우리 모델의 숫자

토큰 하나의 KV 캐시 크기는 2 × 레이어 수 × KV 헤드 수 × 헤드 차원 × 바이트다(bf16이면 2바이트). Raschka의 아키텍처 갤러리DeepSeek-V3 ISCA'25 논문의 표를 합치면 토큰당 bf16 기준으로 Llama-3.1-8B 128KiB, Qwen3-8B 144KiB, Qwen3-32B 256KiB, Llama-3-70B·Qwen2.5-72B 320KiB, Llama-3.1-405B 504KiB, 그리고 MLA를 쓰는 DeepSeek-V3는 68.6KiB다. 70B 모델에 128K 컨텍스트 요청 하나가 들어오면 KV만 40GiB — H100 한 장의 절반이다. vLLM 논문의 13B/A100-40GB 예시는 가중치 65%, KV 30%였고, 4비트로 양자화한 70B의 가중치(32.6GiB)가 4K 요청 32개의 KV(40GiB)보다 작다는 국내 계산 사례도 있다. 청구서의 단위는 요청 수가 아니라 동시 토큰 수다 — 500토큰 100건과 10,000토큰 5건은 같은 값이다.

아키텍처가 4~30배를 좌우한다

  • MHA → GQA: GQA 논문대로 64개 Q 헤드에 KV 헤드 8개면 8배 절감. Llama-2-7B 512KiB → Llama-3-8B 128KiB가 이 차이다.
  • GQA → MLA: DeepSeek-V2는 512차원 잠재 벡터만 캐시해 KV −93.3%, 최대 처리량 5.76배. 72B GQA 모델(327KB) 대비 4.7배 작다.
  • 하이브리드·슬라이딩 윈도우: Qwen3-30B-A3B 96KB, Qwen3.5-35B-A3B 20KB, Nemotron-3-Nano 6KB/토큰. LG의 K-EXAONE 리포트는 48개 레이어 중 36개를 슬라이딩 윈도우로 두고 창을 4,096→128 토큰으로 줄인 이유를 "KV 캐시 사용량 최소화"라고 명시했다.

같은 품질 구간이라면 모델 선택 자체가 가장 큰 캐시 최적화다. 토큰당 KV가 4배 작으면 같은 GPU에 4배 많은 요청을 태운다.

PagedAttention — 낭비 60~80%를 0으로, 대신 커널은 느려진다

vLLM 이전 시스템은 요청마다 최대 길이만큼 연속 메모리를 예약해 실제 토큰 상태는 20.4~38.2%만 채� 다. PagedAttention은 16토큰 블록을 필요할 때 할당해 낭비를 없앴고 처리량이 2~4배(FasterTransformer 대비 최대 22배) 올랐다. 공짜는 아니다. vAttention(MS Research)은 페이지드 커널이 연속 메모리 커널보다 20~26% 느리다고 반박했다. SGLang은 페이지 크기 1토큰, TensorRT-LLM은 블록 단위(기본 128)로 서로 다른 지점에 선다. 블록 크기는 다음 편의 프리픽스 캐시 히트 단위이기도 하다.

KV 풀 → 배치 → tok/s → $/1M 토큰

  • 동시성 상한: Llama-3.1-8B를 H100에 gpu-memory-utilization 0.9로 올리면 KV 풀 약 56GB ≈ 458K 토큰 ≈ 8K 요청 56개, 128K 요청은 3.5개. 70B bf16을 H100 2장에 올리면 KV에 4GB(~12K 토큰)밖에 안 남아 FP8 가중치나 4장, 아니면 H200이 필요하다.
  • 배치가 비용 손잡이: 국내 스타트업 SqueezeBits의 벤치에서 Llama-3-8B/A100의 디코드 처리량은 배치 4→512에서 30~40배 늘었다. DeepMind 스케일링 북은 70B가 compute-bound가 되는 지점을 배치 ~240으로 본다.
  • 비용 환산: $/1M 토큰 = ($/시간 ÷ (tok/s × 3,600)) × 10⁶. H100 $2.90/시간이면 100 tok/s는 $8.06/M, 1,000 tok/s는 $0.81/M, 3,000 tok/s는 $0.27/M. TRT-LLM 튜닝 가이드의 4×H100 Llama-3.3-70B는 설정만으로 1,564→2,474 tok/s(+58%), 즉 토큰당 비용 −37%였다.
  • FP8 KV는 조건부 공짜: vLLM의 2026년 재측정에서 --kv-cache-dtype fp8은 바이트를 절반으로 줄이고 정확도 94~100% 회복이지만, 이득은 약 7K 토큰 이상에서만 나고 슬라이딩 윈도우 레이어에서는 0%다. 2024년 vLLM은 FP8 커널이 없어 이득이 ~0%였고 TRT-LLM만 +45%였다는 기록도 기억할 것.

실전 값은 vLLM gpu-memory-utilization 0.90, max-model-len은 실제 필요치로, max-num-batched-tokens는 지연 우선이면 2,048·처리량 우선이면 8,192 이상, 로그에 preemption이 보이면 풀이 모자란 것. 벤더 숫자는 다시 계산하자 — 한 2026년 블로그는 "$2.50/시간에 95 tok/s = $0.73/M"이라 썸지만 맞는 값은 $7.31/M이다. 다음 글은 이 KV를 요청 간에 재사용하는 프리픽스 캐싱이다.

— LLM 서빙 캐싱 시리즈 ② / 다음 글: 프리픽스 캐싱 — 엔진, 프롬프트 배치, 캐시 인지 라우팅

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

RAG 종류 총정리 ⑬ (완결) — 한국어 조건과 결정 트리

열두 편을 한 장으로 접는다. 먼저 한국어로 서비스할 때만 적용되는 조건을 모으고, 그다음 "우리는 무엇부터 하나"를 결정 트리로 정리한다. 한국어 RAG의 다섯 가지 조건 임베딩 기본값을 의심하되, 갈아타는 이득은 제한적이...