localaiforum
로그인
가이드 › 하드웨어

컨텍스트 창과 KV 캐시

컨텍스트 창에는 가격표가 있고, VRAM으로 지불합니다. 컨텍스트에 남아 있는 모든 토큰은 모델에게 층마다 두 개의 작은 벡터를 기억하게 강제하고, 그 메모리 — KV 캐시 — 는 토큰마다 자라며 가졌다고 여긴 여유를 조용히 먹어치웁니다. 이것이 가장 기묘한 로컬 LLM 실패들을 설명합니다. 마흔 번째 턴의 OOM, 대화가 길어질수록 느려지는 것처럼 보이는 모델, 브로슈어에서만 "128k 컨텍스트"가 되는 8 GB 카드.

캐시가 저장하는 것

어텐션은 과거 토큰에 어텐션하려면 그 토큰의 키와 값 사영이 필요합니다. 이들은 프리필 중 한 번 계산되어 요청의 수명 동안 보관됩니다. 층마다, 토큰마다, kv_heads × head_dim 개수의 원소를 가진 K 벡터 하나와 V 벡터 하나. 그 저장소가 KV 캐시이고, 이것이 컨텍스트가 서빙되는 모든 요청에서 영원히, 선형적으로 메모리를 먹는 이유입니다.

공식

bytes per token = 2 (K and V) × layers × kv_heads × head_dim × 2 bytes (fp16)

계산 예제, llama-3-8B급 GQA (32층, KV 헤드 8개, head_dim 128):

2 × 32 × 8 × 128 × 2 = 131,072 바이트 = 토큰당 128 KB.

32k 컨텍스트에서는 32,768 × 128 KB ≈ 4 GB의 KV 캐시입니다 — 옆에 앉은 Q4 가중치와 맞먹습니다. KV 헤드 4개의 더 마른 설정은 32k당 2 GB 근처입니다. fp16 KV의 8B급 모델 자릿수: 아키텍처에 따라 32k당 0.5–4 GB로 잡으세요. 체크포인트의 정확한 숫자는 그 config.json에서 바로 나옵니다 — num_key_value_heads, num_hidden_layers, 헤드 크기.

GQA가 롱 컨텍스트를 싸게 만든 이유

GQA(그룹드 쿼리 어텐션)는 소수의 KV 헤드를 여러 쿼리 헤드가 공유합니다 — 예컨대 8개의 KV 헤드가 32개의 쿼리 헤드를 섬깁니다 — 품질 손실은 무시할 만하면서 풀 멀티 헤드 어텐션 대비 캐시를 4배 줄입니다. GQA가 없었다면 아래 표는 4–8배 컸을 것이고 24 GB 카드의 롱 컨텍스트는 공상이었을 것입니다. 로컬 롱 컨텍스트 작업에 주어진 단일 최대 아키텍처 선물이고, 현대 7–9B 모델이 32k–128k 창을 애초에 갖고 나오는 이유입니다.

얼마나 빨리 자라나

8B급 GQA 모델, fp16 KV, 토큰당 128 KB:

컨텍스트 KV 캐시 크기 8 GB 카드에서
4k ~0.5 GB 보이지도 않음
16k ~2.1 GB 가중치 5 GB 옆에서 체감됨
64k ~8.4 GB 절대 안 들어감
128k ~16.8 GB 모델 자체의 3배

메모리는 토큰마다 선형으로 자라지만 어텐션 연산량은 컨텍스트의 제곱으로 자랍니다 — 긴 컨텍스트는 VRAM과 토큰당 소요 시간을 동시에 먹습니다.

KV가 폭발할 때의 레버

  • 캐시를 양자화하세요. q8_0는 절반, q4_0는 4분의 1로, 품질 비용은 적습니다 — 스택 전체에서 종종 최고의 용량 거래입니다. llama.cpp에서 KV 양자화는 아래 보이는 플래시 어텐션을 요구합니다.
  • 더 짧은 컨텍스트를 서빙하세요. 프롬프트가 2k라면 -c 8192는 아무것도 잃게 하지 않습니다. "만약을 위해" 광고된 128k를 할당하면 생산적으로 쓰지 못할 VRAM을 예약하는 것입니다.
  • 슬라이딩 윈도우 모델. 일부 아키텍처는 공칭 컨텍스트와 무관하게 층마다 KV 윈도우를 제한합니다 — 선형 청구서 없는 롱 컨텍스트 동작, 오래된 소재에 대한 리콜 비용은 조금 있습니다.
  • 플래시 어텐션. 근본적으로 연산과 커널 효율의 승리 — 제곱적 활성화 폭발 없는 정확한 어텐션 — 이고 llama.cpp에서는 KV 양자화를 여는 문이기도 합니다.
llama-server -m model-8b-q4_k_m.gguf -c 65536 -fa --cache-type-k q8_0 --cache-type-v q8_0

광고된 컨텍스트 대 실효 컨텍스트

128k를 광고하는 모델은 128k에서 돌아간다 — 캐시는 들어가고 수학은 성립합니다. 128k에서 사고하는가는 별개의 주장입니다. 늘어난 RoPE와 롱 컨텍스트 파인튜닝은 니들-리트리벌 점수를 높게 유지하면서 폭넓은 이해는 한계 훨씬 전에 처집니다. 광고된 창을 물리적 최대치로 여기고, 후반부에서 품질이 무뎌진다고 가정하고, 워크플로를 걸기 전에 해당 체크포인트의 커뮤니티 롱 컨텍스트 평가를 찾으세요.

한가운데가 묻히는 현상과 위생 습관

위치 편향은 실재합니다. 모델은 프롬프트의 시작과 끝에 가장 강하게 어텐션하고 중간에서 처집니다. 지시와 결정적 사실은 처음이나 마지막에 두고, 모델이 따라야 할 스펙을 붙여넣은 문서 속에 묻지 마세요. 컨텍스트를 작고 날카롭게 유지하는 습관들:

  • 챗 전체를 재생하는 대신 오래된 턴을 다듬거나 요약하세요.
  • 파일 전체가 아니라 관련 청크를 검색해 주입하세요.
  • 시스템 프롬프트를 짧게 유지하세요. 모든 요청마다 다시 전송됩니다.
  • 긴 세션 동안 VRAM을 지켜보세요 — KV 증가가 조용한 변수입니다(VRAM 계산). 그것을 제어하는 서빙 플래그는 엔진 파라미터에 정리되어 있습니다.

관련: VRAM 계산 · 엔진 파라미터 · 속도