[AI 인프라 혁신] 막대한 AI 서버 비용에 눈물 흘리지 마세요! KV 캐시 압축이 가져올 놀라운 효율의 비밀

LLM 추론에서 KV 캐시 메모리를 최적화해 AI 서버 비용을 줄이는 구조 이미지
KV 캐시 최적화와 AI 추론 서버 비용의 관계

AI 서버 비용은 단순히 모델이 커서 발생하는 것만은 아닙니다.

LLM이 긴 대화를 기억하고 긴 문서를 처리할수록 GPU 메모리에는 모델 가중치 외에도 계속 쌓이는 데이터가 있습니다.

바로 KV 캐시(Key-Value Cache)입니다.

KV 캐시는 이미 처리한 토큰의 Key와 Value 정보를 저장해두었다가 다음 토큰을 생성할 때 다시 활용하는 구조입니다. 덕분에 매번 이전 문맥 전체를 처음부터 다시 계산하지 않아도 됩니다.

문제는 문맥이 길어지고 동시에 처리하는 요청이 많아질수록 KV 캐시에 필요한 메모리도 커진다는 점입니다.

특히 긴 문서를 다루는 RAG, 여러 단계를 반복하는 AI 에이전트, 장시간 대화를 유지하는 서비스에서는 KV 캐시가 추론 인프라의 중요한 메모리 병목이 될 수 있습니다.

그래서 최근 AI 인프라에서는 단순히 더 많은 GPU를 추가하는 것뿐 아니라 이미 계산한 KV 데이터를 얼마나 효율적으로 저장하고 재사용할 것인가가 중요한 최적화 과제가 되고 있습니다.

이번 AI리포트에서는 이를 길어진 문맥 → 커지는 KV 캐시 → 메모리 병목 → 압축·관리 → 실제 비용 측정이라는 구조로 살펴봅니다.

📌 핵심 요약

  • KV 캐시는 이전 토큰의 Key·Value 상태를 저장해 반복 계산을 줄이는 메모리입니다.
  • 일반적으로 문맥 길이와 동시 요청이 커질수록 KV 캐시 메모리 요구량도 증가합니다.
  • KV 캐시 최적화에는 양자화, 선택적 보존·제거, 페이지 기반 관리, 재사용, 오프로딩 등이 있습니다.
  • PagedAttention은 KV 캐시를 직접 압축하는 기술이라기보다 메모리를 블록 단위로 효율적으로 관리하는 방식에 가깝습니다.
  • 압축률이 높다고 무조건 좋은 것은 아니며 품질·지연시간·처리량을 함께 측정해야 합니다.

🧠 KV 캐시는 왜 필요한가?

LLM은 한 토큰씩 결과를 생성합니다.

새로운 토큰을 만들 때마다 앞에서 처리했던 모든 토큰의 Attention 계산을 처음부터 반복한다면 계산 비용이 매우 커집니다.

그래서 이전 토큰에서 계산했던 Key와 Value 상태를 메모리에 저장하고 다음 생성 단계에서 재사용합니다.

이 저장 공간이 KV 캐시입니다.

간단히 표현하면:

이전 계산 결과 저장 → 다음 토큰 생성 때 재사용 → 불필요한 반복 계산 감소

라는 구조입니다.

KV 캐시는 추론 속도를 높이는 데 매우 중요한 역할을 하지만, 동시에 GPU 메모리를 차지합니다.

📈 문맥이 길어지면 왜 문제가 될까?

KV 캐시 크기는 모델 구조와 정밀도 등에 따라 달라지지만 기본적으로 저장해야 하는 토큰이 늘어날수록 커집니다.

동시에 여러 사용자의 요청을 처리하면 각 요청의 KV 상태도 관리해야 합니다.

따라서:

긴 Context × 많은 동시 요청 × 큰 KV 표현

이라는 조건이 겹치면 GPU 메모리 부담이 커질 수 있습니다.

이때 문제가 되는 것은 단순히 GPU 한 장의 가격만이 아닙니다.

사용 가능한 KV 캐시 공간이 부족하면 동시에 처리할 수 있는 요청 수가 제한될 수 있고, 캐시를 제거했다가 다시 계산해야 하는 상황도 발생할 수 있습니다.

결국 AI 서비스의 비용은 GPU 가격뿐 아니라 한 GPU에서 얼마나 많은 요청을 안정적으로 처리할 수 있는가와도 연결됩니다.

🗜️ 방법 1|KV 캐시 양자화

가장 이해하기 쉬운 방법 중 하나가 KV Cache Quantization입니다.

원래 높은 정밀도로 저장하던 KV 값을 더 낮은 정밀도로 표현해 메모리 사용량을 줄이는 방식입니다.

현재 vLLM은 FP8과 같은 양자화된 KV 캐시를 지원합니다.

예를 들어 FP16 또는 BF16 계열의 16비트 표현 대신 8비트 표현을 사용하면 KV 값 자체를 저장하는 원시 데이터 크기는 이론적으로 절반 수준으로 줄일 수 있습니다.

하지만 이것이 전체 GPU 메모리나 실제 서버 비용이 정확히 절반이 된다는 뜻은 아닙니다.

모델 가중치, 활성값, 런타임 오버헤드 등 다른 메모리도 함께 사용되기 때문입니다.

또 양자화 방법과 스케일링 방식에 따라 출력 품질과 성능에도 차이가 날 수 있으므로 실제 모델에서 검증해야 합니다.

✂️ 방법 2|중요한 토큰의 KV만 남긴다

또 다른 연구 방향은 모든 과거 토큰의 KV를 계속 보존하지 않는 것입니다.

H2O, SnapKV 같은 연구는 Attention 패턴 등을 이용해 상대적으로 중요한 KV 위치를 유지하고 중요도가 낮다고 판단되는 일부 캐시를 제거하는 방식을 제안했습니다.

핵심 아이디어는 간단합니다.

“모든 과거 토큰이 앞으로의 생성에 똑같이 중요한가?”

라는 질문입니다.

필요한 정보만 잘 선택할 수 있다면 KV 캐시 크기를 크게 줄일 가능성이 있습니다.

하지만 여기에는 중요한 문제가 있습니다.

한번 제거한 정보가 나중에 필요한 정보였다면 다시 사용할 수 없을 수 있습니다.

실제로 KV 압축 연구에서도 어떤 질문을 할지 미리 알고 압축하는 환경과 여러 미래 질문에 같은 압축 캐시를 재사용하는 환경 사이에서 성능 차이가 나타날 수 있다는 점이 연구되고 있습니다.

따라서 토큰 제거 방식은 압축률만 보고 평가해서는 안 됩니다.

🧩 방법 3|Paged KV Cache로 메모리를 효율적으로 관리한다

여기에서 원문과 꼭 구분해야 하는 부분이 있습니다.

PagedAttention은 KV 캐시 압축 그 자체는 아닙니다.

KV 캐시를 고정된 큰 연속 공간으로 관리하기보다 일정 크기의 블록 또는 페이지처럼 관리해 메모리 낭비와 파편화를 줄이는 접근입니다.

vLLM이 높은 처리량을 구현할 때 중요한 기반 기술 가운데 하나로 알려져 있습니다.

즉:

양자화는 한 KV 값이 차지하는 크기를 줄이고,

선택적 제거는 보관하는 KV의 양을 줄이며,

페이지 기반 관리는 남아 있는 KV 메모리를 더 효율적으로 배치합니다.

서로 비슷해 보이지만 역할이 다릅니다.

♻️ 방법 4|이미 계산한 KV 캐시를 다시 사용한다

KV 캐시를 작게 만드는 것만큼 중요한 것이 재사용입니다.

여러 요청이 동일한 긴 시스템 프롬프트나 공통 문서로 시작한다면 앞부분의 KV 상태를 다시 계산하지 않고 재사용할 수 있습니다.

NVIDIA TensorRT-LLM도 동일한 prefix를 가진 요청 사이에서 KV 캐시 블록을 재사용하는 기능을 제공합니다.

특히 공통 프롬프트가 길수록 첫 토큰을 생성하기 전 반복 계산을 줄이는 데 도움이 될 수 있습니다.

RAG나 에이전트 시스템처럼 같은 지침이나 긴 공통 컨텍스트를 반복해서 사용할 때 중요한 최적화 방법입니다.

💾 방법 5|GPU에 다 넣지 못하면 오프로딩한다

모든 KV 캐시가 항상 GPU의 빠른 메모리에 있어야 하는 것도 아닙니다.

사용 빈도가 낮거나 당장 필요하지 않은 KV 상태를 CPU 메모리 등 다른 계층으로 옮겼다가 필요할 때 다시 가져오는 오프로딩 전략도 사용할 수 있습니다.

이 방식은 GPU 공간을 확보할 수 있지만 데이터 이동 자체에는 시간이 필요합니다.

따라서:

GPU 메모리 절약 ↔ 데이터 이동 비용

사이의 균형을 고려해야 합니다.

LLM 추론에서 KV 캐시 양자화 재사용 오프로딩과 메모리 관리를 설명하는 인포그래픽
KV 캐시를 줄이고 관리하는 여러 추론 최적화 방법

📊 KV 캐시 최적화 효과는 이렇게 측정해야 한다

원문처럼 모든 환경에 동일한 절감률을 적용하는 것은 피하는 것이 좋습니다.

모델 구조, GPU 종류, 컨텍스트 길이, 배치 크기, 동시 사용자 수, 압축 방법에 따라 결과가 크게 달라지기 때문입니다.

측정 항목 기본 설정 최적화 적용 후
KV 캐시 메모리 직접 측정 직접 측정
동시 요청 처리량 요청/초 요청/초
첫 토큰 지연시간 TTFT 측정 TTFT 측정
토큰 생성 속도 tokens/s tokens/s
응답 품질 기준 평가 동일 평가
요청당 비용 기준 비용 실측 비용

이렇게 해야 “메모리를 몇 % 줄였는가?”를 넘어 사용자 한 명을 처리하는 실제 비용이 줄었는가까지 확인할 수 있습니다.

🛠️ vLLM에서는 어떻게 확인할 수 있을까?

현재 vLLM에는 양자화된 KV 캐시를 선택할 수 있는 설정이 있습니다.

개념적으로는 다음과 같은 형태로 테스트할 수 있습니다.

vllm serve MODEL_NAME \
  --kv-cache-dtype fp8 \
  --gpu-memory-utilization 0.90 \
  --enable-chunked-prefill

여기서 각 옵션의 역할은 구분해야 합니다.

--kv-cache-dtype fp8은 KV 캐시 저장 정밀도를 FP8로 설정해 캐시 메모리를 줄이기 위한 옵션입니다.

--gpu-memory-utilization은 vLLM 인스턴스가 사용할 GPU 메모리 비율을 조정합니다.

--enable-chunked-prefill은 긴 입력의 prefill 요청을 여러 스케줄링 단위로 처리할 수 있게 하는 기능입니다.

Chunked Prefill은 KV 캐시를 직접 압축하는 기능이 아닙니다.

또 FP8 KV 캐시 지원 범위와 성능은 GPU, 모델, vLLM 버전에 따라 달라질 수 있으므로 운영 환경에 적용하기 전에 반드시 같은 워크로드로 벤치마크해야 합니다.

🔍 AI리포트 분석|AI 비용의 핵심은 GPU 가격만이 아니다

AI 인프라 비용을 이야기할 때 보통 “GPU가 너무 비싸다”는 이야기부터 나옵니다.

하지만 실제 서비스에서는 조금 다른 질문이 더 중요합니다.

“이미 가지고 있는 GPU 한 장에서 얼마나 많은 유효 작업을 처리할 수 있는가?”

KV 캐시 최적화는 이 질문과 직접 연결됩니다.

「호기심 많은 AI리포트」에서는 다음 다섯 단계를 보는 것이 좋다고 생각합니다.

문맥 → 캐시 → 메모리 → 처리량 → 비용

문맥 — 실제 요청은 얼마나 긴가?

캐시 — 토큰당 KV 캐시는 얼마나 커지는가?

메모리 — 한 GPU에서 얼마만큼의 캐시를 유지할 수 있는가?

처리량 — 동시에 몇 개의 실제 요청을 처리할 수 있는가?

비용 — 최종적으로 요청 또는 토큰당 비용이 얼마나 달라졌는가?

이 구조로 보면 KV 캐시 압축은 단순한 메모리 기술이 아니라 AI 서비스의 단위 경제성을 바꾸는 추론 최적화 기술이라는 점을 이해하기 쉽습니다.

🧪 실전 루틴 1|실제 Context 길이부터 측정한다

최대 Context Window 숫자만 보고 최적화하지 않습니다.

실제 사용자 요청의:

  • 평균 입력 토큰
  • 상위 95% 입력 토큰
  • 평균 출력 토큰
  • 동시 요청 수

를 먼저 측정합니다.

확인 기준: 우리 서비스가 실제로 긴 Context 때문에 메모리 병목을 겪고 있는가?

⚙️ 실전 루틴 2|한 가지 KV 최적화만 바꿔 A/B 테스트한다

양자화, 캐시 재사용, 오프로딩, 스케줄링을 한꺼번에 변경하면 무엇이 성능을 개선했는지 알기 어렵습니다.

먼저 기본 환경을 측정한 뒤:

BF16/FP16 KV → FP8 KV

처럼 하나의 요소만 바꿔 비교합니다.

확인 기준: 동일한 모델·동일한 입력·동일한 동시 요청 조건에서 비교했는가?

✅ 실전 루틴 3|메모리 절감과 품질을 함께 본다

KV 캐시를 가장 작게 만드는 것이 항상 최적의 결과는 아닙니다.

특히 일부 토큰을 제거하는 압축 방식에서는 장기 문맥에서 필요한 정보가 사라질 가능성을 함께 봐야 합니다.

따라서:

메모리 + TTFT + 처리량 + 출력 품질 + 요청당 비용

을 함께 측정합니다.

확인 기준: 메모리는 줄었지만 정답률이나 지연시간이 나빠지지는 않았는가?

❓ 자주 묻는 질문

KV 캐시를 없애면 GPU 메모리가 크게 줄어드나요?

메모리는 줄일 수 있지만 이전 토큰의 상태를 반복해서 계산해야 하므로 생성 성능이 크게 나빠질 수 있습니다. 그래서 일반적으로 캐시를 없애기보다 효율적으로 저장·관리하는 방향을 사용합니다.

KV 캐시 압축을 하면 서버 비용이 무조건 줄어드나요?

아닙니다. 캐시 메모리 감소가 더 높은 배치나 동시성으로 이어지면 비용 효율이 좋아질 가능성이 있지만 실제 효과는 워크로드와 하드웨어에서 측정해야 합니다.

FP8 KV 캐시는 FP16보다 정확히 절반의 서버 비용이 드나요?

아닙니다. KV 데이터 자체의 저장 비트 수는 줄어들지만 전체 서버 비용에는 모델 가중치, 계산량, GPU 사용률, 네트워크 등 다른 요소도 포함됩니다.

PagedAttention도 KV 캐시 압축인가요?

엄밀히 말하면 다릅니다. PagedAttention은 KV 캐시를 블록 단위로 효율적으로 관리하는 메모리 관리 기술이고, 양자화나 토큰 제거는 캐시 자체의 표현이나 보관량을 줄이는 방식입니다.

SnapKV나 H2O를 사용하면 품질 저하가 없나요?

그렇게 일반화할 수 없습니다. 연구에서는 특정 조건에서 높은 압축 효율과 비슷한 성능을 보인 사례가 있지만, 모델·데이터·질문 방식에 따라 품질 변화가 발생할 수 있으므로 실제 환경에서 검증해야 합니다.

✅ 핵심 정리

KV 캐시는 LLM이 긴 문맥을 효율적으로 이어서 생성하기 위해 필요한 중요한 메모리입니다.

하지만 Context와 동시 요청이 늘어날수록 캐시도 커져 GPU 메모리 병목으로 이어질 수 있습니다.

그래서 현대 AI 추론 인프라는 단순히 GPU를 추가하는 것만으로 문제를 해결하지 않습니다.

양자화 → 선택적 보존 → 페이지 관리 → 재사용 → 오프로딩

같은 여러 방법을 조합해 KV 캐시를 관리합니다.

그리고 여기에서 가장 중요한 것은 압축률 자체가 아닙니다.

같은 품질을 유지하면서 한 GPU가 얼마나 많은 실제 요청을 처리할 수 있게 되었는가.

결국 이것이 AI 서버 비용을 결정하는 중요한 지표 가운데 하나입니다.

앞으로 AI 인프라 경쟁은 단순히 더 강력한 GPU를 확보하는 경쟁뿐 아니라 이미 확보한 메모리와 연산 자원을 얼마나 효율적으로 사용하는가의 경쟁으로도 이어질 가능성이 큽니다.

📚 참고자료

함께 읽으면 좋은 글

댓글