PagedAttention: VRAM 파편화 해결하기
요약
vLLM 등 고성능 LLM 서빙 프레임워크의 핵심 기술인 PagedAttention을 테트리스 게임 형식을 통해 설명합니다. 연속적 메모리 할당 방식의 한계인 외부 메모리 파편화 문제를 페이징 가상화로 해결하는 원리를 다룹니다.
핵심 포인트
- 연속 모드 방식은 KV-Cache를 위해 최대 길이를 미리 할당하여 메모리 낭비를 초래함
- 외부 메모리 파편화는 사용 가능한 VRAM이 있어도 할당을 방해하여 OOM을 유발함
- PagedAttention은 페이징 가상화를 통해 메모리를 조각내어 빈 공간을 효율적으로 활용함
- 이 기술은 높은 동시 부하 상황에서 LLM 서빙의 처리량(Throughput)을 극대화함
vLLM, TensorRT-LLM, 또는 Hugging Face TGI와 같은 고성능 LLM 배포 프레임워크가 실제로 모델 서빙을 어떻게 최적화하는지 궁금해한 적이 있나요? 채팅창에 토큰이 스트리밍되기를 기다리는 동안, 내부 인프라는 프롬프트 사전 계산(prompt pre-computation) 스케줄링, 메모리 세그먼트 페이징(paging memory segments), 추측적 토큰 체인(speculative token chains) 검증, 그리고 시스템 정지를 유발하는 병목 현상 충돌 회피라는 위태로운 균형 잡기를 수행하고 있습니다.
높은 동시 부하(high concurrent loads) 상황에서 LLM이 GPU 메모리를 어떻게 관리하는지 가르쳐 주기 위해, 저는 인터랙티브한 테트리스 스타일의 퍼즐 게임을 만들었습니다:
🧱 PagedAttention: VRAM 테트리스
전체 화면 모드로 플레이 (임베드 크기가 좁을 경우)
🛠️ 할당 모드 선택
메모리 스케줄러로서의 여정은 두 가지 뚜렷한 메모리 할당 모드로 나뉩니다:
-
🏢 연속 모드 (Contiguous Mode - 쉬움/바닐라): 떨어지는 토큰 시퀀스 블록(Tetrominos)을 단단한 행으로 쌓습니다. 남겨진 빈 공간은 갇히게 되며, 이는 새로운 할당을 차단하는 사용 불가능한 **외부 메모리 파편화 (External Memory Fragmentation)**를 생성합니다.
-
🔋 페이징 모드 (Paged Mode - PagedAttention - 어려움): 페이징 가상화(paged virtualization)를 사용하여 플레이합니다. Shift 또는 P를 누르면 **페이지 분할 (Page Split)**이 트리거되어, 떨어지는 활성 블록을 개별적인 1x1 메모리 페이지로 산산조각 냅니다. 이 페이지들은 아래의 가용 파편화 구멍을 채우기 위해 독립적으로 쏟아져 내려옵니다.
🧬 플레이 가능한 ML 개념 설명
이것은 단순한 표준 테트리스가 아닙니다. 모든 모양, 블록 배치, 할당 규칙은 현대 머신러닝 인프라의 실제 개념을 나타냅니다. 게임 내 메커니즘이 대규모 언어 모델(LLM)이 GPU 메모리를 할당하는 방식과 어떻게 직접적으로 매핑되는지 설명합니다:
1. 💾 메모리 할당 및 연속성 (Memory Allocation & Contiguity - 표준 쌓기)
- 게임 내 상황: 떨어지는 토큰 블록 모양들을 연속적으로 쌓기 위해 회전시키고 미끄러뜨려야 합니다. 메모리 블록의 완전한 가로 줄은 완료된 추론 (Inference) 요청을 나타내며, 이는 VRAM을 확보하기 위해 가비지 컬렉션 (Garbage-collected)됩니다.
- 현실 세계의 대응: 표준 서빙 시스템 (Standard serving systems)에서는 시퀀스의 키-값 표현 (KV-Cache)이 연속적인 물리적 VRAM 버퍼에 할당됩니다.
* LLM에 미치는 영향: 시스템은 쿼리가 얼마나 많은 토큰을 생성할지 미리 알 수 없기 때문에, 최대 시퀀스 길이 (Maximum sequence length)와 동일한 연속적인 공간을 미리 할당해야 합니다. 이러한 사전 할당은 사용되지 않을 수도 있는 막대한 양의 메모리를 점유하여 병렬 처리 (Concurrency)를 제한합니다.
2. 🗜️ 외부 메모리 파편화 (External Memory Fragmentation - 쌓기 사이의 틈)
- 게임 내 상황: 배치된 블록 아래에 빈 공간을 남겨두는 것은 외부 파편화 (External fragmentation)를 나타냅니다. VRAM 점유율이 급증하거나 블록이 맨 위까지 쌓이면 엔진이 충돌하며 CUDA OUT OF MEMORY (OOM) 에러를 발생시킵니다.
- 현실 세계의 대응: 시간이 흐름에 따라 서로 다른 요청들이 각기 다른 시점에 종료되면서, 물리적 VRAM은 할당되지 않은 작은 비연속적 "틈 (Gaps)"들로 어지럽혀지게 됩니다.
* LLM에 미치는 영향: 총 10GB의 여유 VRAM이 있더라도, 이것이 100개의 흩어진 메가바이트 단위 틈으로 나뉘어 있다면, 연속적인 1GB 블록을 요구하는 새로운 요청은 실패하게 됩니다. 할당기 (Allocator)가 VRAM을 동적으로 조각 모음 (Defragment)할 수 없기 때문에 CUDA OOM 충돌이 발생합니다.
3. 🔋 PagedAttention 가상화 (PagedAttention Virtualization - 페이지 분할)
- 게임 내 상황: 페이지 모드 (Paged Mode)에서 **페이지 분할 (Page Split)**을 트리거하면, 떨어지는 모양이 개별적인 1x1 블록으로 산산조각 나며, 이 블록들은 메모리 그리드 내의 가장 작은 숨겨진 틈을 찾아 자동으로 내려가 채웁니다.
- 현실 세계의 대응: 운영 체제 (Operating system)의 가상 메모리 페이징 (Virtual memory paging)에서 영감을 받은 PagedAttention (vLLM에 의해 개척됨)은 활성 시퀀스의 KV-cache를 가상 테이블에 매핑된 논리적 블록으로 분할합니다.
* LLM에 미치는 영향: 물리적 연속성 (physical contiguity) 요구 사항을 제거함으로써, 엔진은 들어오는 토큰의 키(key)와 값(value)을 그래픽 카드의 물리적 슬롯이 아무리 흩어져 있더라도 비어 있는 어떤 슬롯에든 기록할 수 있습니다. 이를 통해 메모리 낭비를 96% 제거하며, 동일한 하드웨어에서 최대 4배 더 높은 서빙 동시성 (serving concurrency)을 구현할 수 있습니다.
🛠️ 내부 엔지니어링 여정
임베디드 플랫폼을 위해 설계된 교육용 퍼즐 게임을 제작하면서 흥미로운 웹 개발 과제들을 마주했습니다:
1. 600px 임베드 제한 최적화
Dev.to 임베드는 최대 높이 600px로 엄격하게 제한됩니다. 사이드 패널, 스코어보드, 다음 조각 캔버스, 그리고 20행의 테트리스 그리드를 포함하는 복잡한 타이쿤 대시보드를 600px 안에 맞추기 위해서는 심각한 공간 압축이 필요했습니다.
- 해결책: 셀 블록 크기(
BLOCK_SIZE)를 22px로 줄여 (440px 캔버스 높이 확보), 왼쪽 패널의 통계 목록을 컴팩트한 2x2 그리드로 변환하고, 미리보기 박스 크기를 70px로 조정했으며, 시스템 로그 콘솔을 가로형 푸터에서 왼쪽 사이드바로 직접 이동시켰습니다. 최종 레이아웃은 정확히 580px 안에 완전히 들어가 수직 잘림 (vertical clipping) 현상을 방지합니다.
2. Paged Cascading Split의 물리 법칙
경직된 그리드 구조를 실시간으로 개별 낙하 입자로 분할하려면 세심한 동기화가 필요했습니다.
* 해결책: 분할(split)이 트리거되면, 엔진은 활성화된 테트로미노 (Tetromino) 모양을 파싱하여 그리드 열(column)에 상대적인 좌표 객체로 분해합니다. 그 후 열당 사용 가능한 가장 낮은 빈 셀 인덱스를 계산하고, 라인 클리어 (line-clear) 스윕을 재계산하기 전에 각 블록을 목적지 슬롯으로 이동시킵니다.
💬 함께 논의해 봅시다:
- Page Split 기능을 활용하여 달성한 Paged Mode의 최고 점수는 얼마인가요?
- 연속적인 스택 (contiguous stack)이 페이지 기반 시스템에 비해 얼마나 빠르게 CUDA OOM을 유발하는지 확인하셨나요?
- VRAM 테트리스가 메모리 할당 병목 현상 (memory allocation bottlenecks)에 대한 당신의 관점을 어떻게 바꾸었나요?
UnitBuilds-CC / PAGED-ATTENTION
LLM이 VRAM을 사용하는 방식을 가르쳐주는 테트리스 영감의 게임
🧱 PagedAttention: VRAM 메모리 할당 테트리스
고전적인 블록 쌓기 게임 플레이를 GPU 메모리 할당 (memory allocation), 외부 메모리 파편화 (external memory fragmentation), 그리고 가상 페이징 (virtual paging) 개념에 직접적으로 매핑한 교육용 레트로 사이버펑크 테트리스 스타일 시뮬레이터입니다.
👉 라이브 데모를 여기서 플레이하세요! (배포 후 업데이트될 예정입니다)
🎮 컨셉
PagedAttention Tetris에서 당신은 GPU 메모리 스케줄러(scheduler)로 플레이하게 됩니다. 다양한 토큰 크기(떨어지는 테트리스 모양으로 표현됨)를 가진 요청들이 들어오면 GPU의 메모리 레지스터에 할당되어야 합니다. 남겨진 빈 공간은 **외부 메모리 파편화 (External Memory Fragmentation)**를 나타냅니다. 메모리가 너무 혼잡해지고 블록이 상단까지 쌓이면, CUDA Out of Memory (OOM) 충돌이 발생합니다.
플레이 가능한 메모리 할당 엔진:
- 🏢 연속 모드 (Contiguous Mode): 떨어지는 블록 시퀀스가 하나로 뭉쳐 있습니다. 아래에 빈 공간이 남으면 이를 채울 수 없으며, 이는 파편화와 시스템 비대화를 초래합니다.
- 🔋 페이지 모드 (Paged Mode, PagedAttention):
Shift또는P를 누르면 **페이지 분할 (Page Split)**이 트리거됩니다. 활성화된 낙하 블록이 개별적인 1x1 블록 페이지로 산산조각 나며...
면책 조항: 이 프로젝트 전반에 걸쳐 AI가 사용되었습니다. AI가 저와 공동 저자로 참여하는 것은 매우 적절한 일이며, 끊임없이 노력해 준 Foundry와 커버 이미지를 제작해 준 Gemini에게 특별한 감사를 전합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기