PagedAttention · RadixAttention · prefix caching

KV 캐시: 블록 할당과 접두어 재사용은 다릅니다

캐시를 어디에 놓을지와 이미 계산한 어느 부분을 다시 쓸지는 다른 질문입니다. vLLM과 SGLang을 단순히 공간 절약형·시간 절약형으로 나누면 두 기능의 연결을 놓칩니다.

논리적 순서와 물리적 위치를 분리합니다

PagedAttention은 요청의 KV 캐시를 블록으로 나누고 논리 블록을 물리 블록에 대응시킵니다. 물리 블록들이 하나의 큰 연속 영역에 있을 필요가 없어 성장하는 요청에 필요한 만큼 할당하기 쉬워집니다. 마지막 블록의 빈 공간까지 사라지는 것은 아닙니다.

블록을 공유할 수 있는 경우에도 소유권과 변경 시 분리를 관리해야 합니다. 페이지 방식은 저장 배치의 낭비를 줄이는 방법이며, 저장해야 하는 K·V 값 자체를 자동으로 압축하는 기법은 아닙니다.

같은 논리 순서, 다른 물리 블록
  1. 논리 블록 0 → 물리 블록 7

  2. 논리 블록 1 → 물리 블록 2

  3. 논리 블록 2 → 물리 블록 11

PagedAttention 논문

재사용은 같은 접두어에서 시작합니다

SGLang의 RadixAttention은 토큰 접두어를 radix tree에 보관해 새 요청과 가장 길게 겹치는 앞부분을 찾습니다. 앞선 문맥이 다른데 뒤쪽 문자열이 우연히 같다는 이유만으로 그 구간의 KV 값을 재사용하는 것은 아닙니다. 토큰화 결과와 선행 문맥이 중요합니다.

원 설명은 재사용하지 않는 leaf를 LRU 정책으로 제거하고 GPU 메모리의 KV를 페이지 단위로 관리하는 구조를 다룹니다. 접두어 검색과 페이지 저장은 경쟁하는 대안이 아니라 함께 쓰일 수 있는 기능입니다.

SGLang의 RadixAttention 설명

vLLM에도 접두어 캐싱이 있습니다

확인한 vLLM 설계 문서는 부모 블록의 해시, 현재 블록의 토큰, LoRA·멀티모달 입력 등 추가 정보를 묶어 블록을 식별합니다. 완전히 채워진 블록을 캐시하며, cache_salt로 다중 사용자 사이의 캐시 격리 범위를 나눌 수 있습니다.

블록 크기가 네 토큰인 가상 예에서 두 요청의 첫 여섯 토큰만 같다면 완전한 첫 블록 하나는 재사용 후보지만 두 번째 블록 전체가 일치한 것은 아닙니다. 실제 적중에는 모델·입력·캐시 정책 등도 맞아야 합니다.

vLLM Automatic Prefix Caching

서로 다른 성능 수치를 섞지 않습니다

처리량은 초당 처리량이고, 첫 토큰 지연과 토큰 간 지연은 사용자에게 보이는 시간입니다. 캐시 적중률도 정의에 따라 요청 수·토큰 수·블록 수 기준이 달라집니다. 숫자를 비교할 때는 모델, 입력 길이, 동시 요청 수, 하드웨어, 엔진 버전과 지표 정의를 함께 고정합니다.

이 글은 논문과 구현 문서의 개념 비교입니다. 원 자료의 조건별 배속 수치를 일반적인 성능 보장으로 옮기지 않았고, 모델을 내려받거나 엔진을 실행해 자체 벤치마크를 하지는 않았습니다.