한 줄로 말하면
KV 캐시는 언어모델이 답을 만드는 동안, 앞서 나온 모든 토큰의 Key·Value 벡터를 GPU 메모리에 저장해 두는 공간이야.1 다음 토큰을 만들 때마다 이전 토큰 전체를 다시 계산하지 않고 이 저장분을 그대로 읽어 쓰기 위해서야. 문제는 이 저장 공간이 고정된 크기가 아니라 요청이 길어지고 동시 사용자가 늘어날수록 계속 커지고 줄어든다는 점이야.1 그래서 KV 캐시는 모델 서빙에서 GPU 메모리를 가장 크게, 가장 예측하기 어렵게 잡아먹는 자리가 되고, 이 공간을 얼마나 알뜰하게 관리하느냐가 한 GPU가 동시에 몇 명을 상대할 수 있는지를 정해.
비유로 이해하기
두꺼운 추리소설을 읽으면서 100쪽 전에 나온 단서를 계속 참고해야 한다고 생각해봐. 매번 앞으로 돌아가 처음부터 다시 읽는 대신, 페이지마다 핵심 단서를 요약 메모로 남겨두면 다음 장을 읽을 때 그 메모만 넘겨보면 돼. KV 캐시가 하는 일이 딱 이거야 — 토큰 하나하나를 다시 계산하지 않으려고 이전 계산 결과를 메모로 쌓아 두는 것.
그런데 이 메모에는 보통 노트에 없는 문제가 있어. 책마다, 독자마다 메모의 두께가 다르고 심지어 읽는 도중에도 계속 두꺼워지는데, 이 메모를 놓아둘 책상(GPU 메모리)은 크기가 고정돼 있다는 것. 책상이 좁으면 동시에 몇 권을 펼쳐둘 수 있는지가 줄어들고, 메모를 아무렇게나 쌓아두면 책상 여백이 조각조각 남아 다음 책을 펼 자리를 못 찾는 일도 생겨. 여기부터는 비유 밖이고, 이 낭비를 어떻게 관리하는지가 이 개념의 진짜 내용이야.
왜 다시 계산하지 않고 저장해 두나
트랜스포머 모델의 각 어텐션 계층은 토큰마다 Key와 Value라는 벡터 한 쌍을 만들고, 다음 토큰은 지금까지 나온 모든 토큰의 Key·Value를 참조해 답을 만들어. 이걸 토큰을 만들 때마다 처음부터 다시 계산하면 문맥이 길어질수록 계산량이 제곱으로 불어나.
그래서 실제 서빙에서는 입력 전체를 한 번에 처리하는 프리필(prefill) 단계에서 모든 입력 토큰의 Key·Value를 한 번만 계산해 KV 캐시에 저장하고, 이후 답을 한 토큰씩 만드는 디코드(decode) 단계에서는 새로 생긴 토큰 하나의 Key·Value만 추가하고 나머지는 캐시를 읽기만 해. 이 분업 덕분에 디코드는 매 스텝 새로 계산하는 양이 토큰 하나로 고정되지만, 그 대신 매 스텝 저장된 캐시 전체를 GPU 메모리에서 읽어야 해서 병목이 계산량이 아니라 메모리 대역폭 쪽으로 옮겨가.
크기가 고정돼 있지 않다는 것의 대가
GPU 메모리 안에는 크기가 고정된 모델 가중치, 계속 늘었다 줄었다 하는 KV 캐시, 일시적으로 쓰이는 활성값이 함께 들어가. 가중치를 올려놓고 남은 공간이 곧 KV 캐시가 쓸 수 있는 예산이라, 연산량보다 이 메모리 여유가 몇 명의 요청을 동시에 처리할 수 있는지를 정하는 경우가 많아.
시퀀스 길이는 요청마다 미리 알 수 없기 때문에, 각 요청에 미리 넉넉한 연속 공간을 통째로 예약해 두는 방식으로 KV 캐시를 관리하면 실제로 쓰이는 것보다 훨씬 넓게 잡아 둔 공간이 남아 메모리를 낭비하게 돼. 짧게 끝난 요청이 남긴 빈 조각이 다음 요청이 필요로 하는 연속 공간보다 작으면, 전체 메모리는 남았는데도 새 요청을 받지 못하는 단편화가 생겨.
PagedAttention — 캐시를 페이지로 쪼갠다
2023년 발표된 PagedAttention은 이 단편화 문제를, 운영체제가 프로그램 메모리를 다루는 가상 메모리·페이징 기법에서 그대로 빌려와 풀었어.1 KV 캐시를 고정 크기의 페이지로 잘게 나누고, 필요한 만큼만 물리 블록을 할당한 뒤 페이지 테이블로 연결해 관리하기 때문에 요청마다 연속된 공간을 미리 예약할 필요가 없어. 완료된 시퀀스가 쓰던 페이지는 즉시 반환되고, 여러 요청이 같은 접두사를 공유하면 그 페이지를 요청 사이에서 그대로 나눠 쓸 수도 있어.1
이 알고리즘 위에 만들어진 서빙 시스템 vLLM은 저자들의 평가에서 같은 지연 수준을 유지하면서 FasterTransformer·Orca 같은 기존 시스템 대비 처리량을 2~4배 끌어올렸는데, 이 개선폭은 시퀀스가 길고 모델이 크고 디코딩 알고리즘이 복잡할수록 더 뚜렷했어.1 데이터센터 인프라 해설에서도 같은 방식이 이전 서빙 시스템 대비 2~4배, 단순 구현 대비 3~5배 높은 처리량으로 소개돼.2
캐시를 요청 사이에서도 재사용한다 — 프롬프트 캐싱
같은 시스템 프롬프트나 문서 접두사로 시작하는 요청이 반복되면, 그 부분의 KV 캐시를 한 번만 계산해 두고 이후 요청에서 그대로 재사용할 수 있어. 이걸 프롬프트 캐싱이라 부르는데, 반복 입력 비용을 최대 90%, 긴 프롬프트의 지연시간을 약 85% 줄여.2 Anthropic은 캐시로 읽는 토큰을 일반 입력 가격의 0.1배인 100만 토큰당 0.30달러(일반 입력 3달러)에, OpenAI GPT-5.x는 캐시 입력 0.50달러(일반 입력 5달러)로 두 회사 모두 90% 할인을 적용해.2 부하 분산 단계에서도 같은 접두사의 KV 캐시를 이미 갖고 있는 서버로 요청을 보내는 캐시 인식 라우팅이 쓰이는데, 단순 라운드로빈으로 요청을 흩뿌리면 이 재사용 기회 자체가 사라져.
왜 중요한가
추론은 학습과 달리 요청 하나마다 반복해서 드는 비용이고, 배포된 모델의 생애 컴퓨팅 비용 중 80~90%를 차지할 만큼 쌓여.2 KV 캐시는 그 반복되는 비용 안에서 GPU 메모리를 가장 크고 가장 변동성 있게 차지하는 구조라, 이 메모리를 얼마나 알뜰하게 쓰느냐가 곧 같은 GPU 한 대로 몇 명을 동시에 상대할 수 있는지, 그래서 토큰 하나를 얼마에 팔 수 있는지를 정해. 가중치를 더 적은 비트로 표현하는 양자화조차 그 자체가 목적이 아니라, 가중치가 줄인 만큼 남는 공간을 KV 캐시에 돌려주기 위한 손잡이로 쓰여.
실제 예시 — 양자화가 남기는 KV 캐시 공간
70B 모델은 가중치를 FP16으로 두면 약 140GB가 필요해 80GB급 GPU 두 대를 묶어야 하지만, FP8로 낮추면 가중치가 약 70GB로 줄어 GPU 한 대에 올리고도 KV 캐시가 쓸 공간이 남아(2026년 데이터센터 인프라 해설 기준).2 정밀도를 낮춰 가중치가 아낀 메모리가 그대로 더 많은 동시 사용자로 이어지는 구조를 보여주는 사례야. 같은 해설에서 NVIDIA의 4비트 형식 NVFP4는 FP8보다 약 2~3배 높은 산술 처리량과 약 1.8배의 메모리 절감을 제공하면서 정확도 차이는 약 1% 이내로 유지한다고 소개돼.2
헷갈리지 말아야 할 점
“KV 캐싱과 PagedAttention은 같은 것이다”라고 생각하기 쉬워. 하지만 KV 캐싱은 이전 토큰의 계산 결과를 다시 계산하지 않고 저장해 재사용한다는 일반적인 아이디어이고, PagedAttention은 그렇게 저장된 KV 캐시를 어떻게 메모리에 배치할지를 다루는 구체적인 관리 기법이야.1 KV 캐싱 자체는 PagedAttention이 나오기 전부터 표준적인 방식이었고, PagedAttention은 그 캐시가 낭비하는 메모리를 줄이는 후속 발명이야. 그러니 “KV 캐시를 쓴다”와 “PagedAttention을 쓴다”는 같은 말이 아니라, 후자가 전자를 더 알뜰하게 관리하는 방법 중 하나야.
이어서 읽기
- 추론 비용(inference cost) — KV 캐시가 좌우하는 처리량·지연시간·운영비가 어떻게 합쳐져 추론 비용 전체를 정하는지 다룬다.
- HBM — KV 캐시를 포함해 GPU 메모리를 실제로 담는 하드웨어인 고대역폭 메모리를 다룬다.
- NVIDIA — NVFP4·GB200 같은 KV 캐시 메모리 예산에 직결되는 하드웨어 표준을 만드는 회사.
남은 질문들
- 프리필·디코드를 별도 GPU 풀로 나눠 그 사이에서 KV 캐시를 스트리밍하는 분리형 서빙이 실제 운영 비용을 얼마나 낮추는지 보여주는 벤치마크 원문이 아직 없어.
- PagedAttention 이후 나온 KV 캐시 압축·양자화 기법이 메모리 절감과 정확도 사이에서 어떤 트레이드오프를 보이는지는 이 페이지가 다루는 범위 밖이라 지켜볼 대목이야.
댓글