PagedAttention은 KV 캐시를 효율적으로 관리하기 위해 운영체제의 가상 메모리 페이징 개념을 적용한 기술입니다. vLLM에서 처음 도입되었습니다.
1. 메모리 낭비 (Internal Fragmentation)
예상 최대 길이: 2048 토큰
실제 생성: 500 토큰
→ 1548 토큰 분량의 메모리 낭비!
2. 메모리 단편화 (External Fragmentation)
요청 A: [████░░░░] 일부 사용
요청 B: [██████░░] 일부 사용
→ 중간에 사용되지 않는 공간이 흩어져 있음
3. 유연하지 못한 할당
OS의 가상 메모리처럼 KV 캐시를 작은 블록(페이지)으로 나누어 관리합니다.
기존 방식:
요청 A: [████████████████] (연속된 큰 메모리 블록)
PagedAttention:
요청 A: [페이지1] → [페이지3] → [페이지5]
████ ████ ████
물리 메모리: [1][2][3][4][5][6]...
1. 논리적 블록 (Logical Blocks)
2. 물리적 블록 (Physical Blocks)
3. 블록 테이블 (Block Table)
토큰 생성 과정:
초기 (0~16 토큰):
논리 블록 0 → 물리 블록 3
[████████████████]
17~32 토큰 생성:
논리 블록 0 → 물리 블록 3
논리 블록 1 → 물리 블록 7 (새로 할당)
[████████████████][████████████████]
33~48 토큰 생성:
논리 블록 0 → 물리 블록 3
논리 블록 1 → 물리 블록 7
논리 블록 2 → 물리 블록 2 (새로 할당)
1. 메모리 효율성 향상
2. 동적 할당
토큰을 생성하면서 필요한 만큼만 할당
초기: 1 페이지
중간: 3 페이지로 확장
종료: 5 페이지까지 성장
3. 메모리 공유 (Copy-on-Write)
Beam Search나 Parallel Sampling 시:
원본 프롬프트: [페이지1][페이지2]
↓
생성 경로 A: [페이지1][페이지2] → [페이지5] (공유)
생성 경로 B: [페이지1][페이지2] → [페이지6] (공유)
공통 부분은 메모리에 한 번만 저장!
4. 배치 처리 개선
블록 크기 선택:
메모리 할당자:
# 의사 코드
class BlockAllocator:
def allocate_block(self):
# 빈 물리 블록 찾아서 할당
return physical_block_id
def free_block(self, block_id):
# 블록 해제하여 재사용 풀에 반환
pass
vLLM (PagedAttention) vs 기존 시스템:
| 지표 | 개선도 |
|---|---|
| 메모리 사용량 | 55% 감소 |
| 처리량 (Throughput) | 2~4배 향상 |
| 배치 크기 | 2~3배 증가 가능 |
| 지연시간 (Latency) | 유사하거나 약간 향상 |
1. vLLM
2. TensorRT-LLM
3. 상용 서비스
PagedAttention은 LLM 서빙 효율성을 혁신적으로 개선한 기술로, 현재 대부분의 고성능 LLM 서비스에서 표준처럼 사용되고 있습니다!