SGLang의 계층적 KV 캐시 관리 및 외부 메모리 오프로딩 메커니즘 분석
SGLang의 계층적 KV 캐시 관리 및 외부 메모리 오프로딩 메커니즘에 관한 심층 분석 보고서
1. 서론: LLM 서빙의 메모리 장벽과 분산 메모리 아키텍처의 필요성
대규모 언어 모델(Large Language Models, LLM)의 추론(Inference) 과정에서 발생하는 연산 비용은 하드웨어 가속기의 발전으로 인해 점차 해결되고 있는 반면, 메모리 대역폭과 용량 문제는 여전히 치명적인 병목 현상으로 남아 있습니다. 특히 Transformer 아키텍처의 특성상, 문맥 길이(Context Length)가 길어질수록 어텐션 메커니즘(Attention Mechanism)이 참조해야 하는 키-값(Key-Value, KV) 캐시의 크기는 선형적, 혹은 그 이상으로 증가합니다. 이는 제한된 GPU 고대역폭 메모리(HBM) 용량 내에서 처리할 수 있는 동시 요청 수(Batch Size)와 시퀀스 길이를 제한하여 전체 시스템의 처리량(Throughput)을 저하시키는 주된 원인이 됩니다.
이러한 물리적 한계를 극복하기 위해 제안된 것이 '메모리 계층화(Memory Tiering)' 또는 '메모리 분리(Memory Disaggregation)' 개념입니다. 이는 운영체제의 가상 메모리 시스템과 유사하게, 빠르지만 비싼 GPU 메모리를 주 기억장치(L1)로 사용하고, 상대적으로 느리지만 용량이 큰 호스트 CPU 메모리(RAM, L2)와 NVMe SSD(L3)를 보조 기억장치로 활용하여 전체 가용 메모리 풀을 확장하는 전략입니다.
본 보고서는 최근 고성능 LLM 서빙 프레임워크로 주목받고 있는 SGLang(Structured Generation Language)이 이러한 메모리 계층화 문제를 어떻게 해결하고 있는지 심층적으로 분석합니다. 특히 "KV 캐시를 별도 외부 메모리(SSD)에 저장하고 교체(Swapping)하며 운용할 수 있는가"에 대한 기술적 검증을 목표로 합니다. 이를 위해 SGLang의 핵심 아키텍처인 RadixAttention 과 HiCache(Hierarchical Cache) 시스템을 분석하고, 공식 GitHub 소스 코드를 기반으로 외부 메모리 오프로딩의 구현 실체를 검증합니다.
2. SGLang의 메모리 아키텍처: RadixAttention과 트리 기반 관리
SGLang의 메모리 관리 방식은 기존의 vLLM이 채택한 PagedAttention과는 근본적으로 다른 철학에 기반을 두고 있습니다. vLLM이 메모리 파편화 해결을 위해 운영체제의 페이징 기법을 차용했다면, SGLang은 복잡한 다중 턴 대화와 에이전트 워크플로우에서의 '재사용성'을 극대화하기 위해 Radix Tree(기수 트리) 구조를 도입했습니다.
2.1 RadixAttention의 구조적 우위
SGLang은 생성된 KV 캐시를 요청이 완료된 후 즉시 폐기하지 않고 Radix Tree 구조 내에 보존합니다. 이 트리의 각 노드는 토큰 시퀀스를 나타내며, 엣지(Edge)는 새로운 토큰의 연결을 의미합니다. 이러한 구조는 여러 요청이 동일한 시스템 프롬프트나 문서를 공유할 때(Prefix Sharing), 별도의 연산 없이 이미 생성된 KV 캐시 노드를 즉시 참조할 수 있게 합니다.
2.2 인메모리 축출(Eviction)과 계층적 확장
GPU 메모리가 포화 상태에 도달하면, 시스템은 새로운 요청을 처리하기 위해 기존 데이터를 축출해야 합니다. SGLang은 기본적으로 LRU(Least Recently Used) 알고리즘을 사용하여 참조 카운트가 0인 리프 노드(Leaf Node)부터 축출합니다. 계층적 캐시(HiCache)가 활성화된 환경에서는 이 과정이 '삭제'가 아닌 '강등(Demotion)'으로 전환되어 하위 계층인 CPU 메모리나 SSD로 이동하게 됩니다.
3. HiCache(Hierarchical Cache) 아키텍처 심층 분석
HiCache는 단일 GPU 메모리에 국한되었던 RadixAttention을 다중 계층 메모리 아키텍처로 확장한 것으로, L1(GPU), L2(CPU), L3(Disk/Storage)로 구성된 명시적인 계층 구조를 정의합니다.
계층 (Tier)
물리적 매체
접근 속도 (Latency)
용량 (Capacity)
역할 및 특징
L1
GPU HBM
초저지연 (Nanoseconds)
제한적 (수십 GB)
텐서 코어가 직접 접근 가능한 유일한 공간.
L2
Host DRAM
저지연 (Microseconds)
확장 가능 (수백 GB ~ TB)
GPU와 PCIe로 연결된 고속 스왑 공간. Pinned Memory 사용.
L3
External Storage
고지연 (Milliseconds)
대용량 (TB ~ PB)
로컬 NVMe SSD 또는 네트워크 스토리지. 데이터 영속성 담당.
4. 소스 코드를 통한 구현 검증
SGLang의 공식 GitHub 리포지토리( python/sglang/srt/mem_cache ) 소스 코드를 통해 외부 메모리 오프로딩의 실제 구현을 확인했습니다.
4.1 핵심 파일 분석
radix_cache.py : 기본 Radix Tree와 노드(TreeNode) 클래스 정의.
hiradix_cache.py : HiCache 기능을 위해 확장된 클래스 포함.
memory_pool_host.py : 호스트 메모리(L2) 관리 담당.
storage/ : Mooncake, NIXL 등 L3 스토리지 백엔드 드라이버 위치.
4.2 외부 메모리 오프로딩 증거
# radix_cache.py 내의 TreeNode 구조 예시
class TreeNode:
def __init__(self):
self.value = None # GPU 메모리 인덱스
self.host_value = None # CPU 호스트 메모리 인덱스 (L2)
self.lock_ref = 0
이 코드는 각 노드가 GPU뿐만 아니라 CPU 메모리(host_value)에도 대응될 수 있음을 명시적으로 보여줍니다. 또한 memory_pool_host.py 에서는 고속 전송을 위한 pin_memory=True 옵션 사용이 확인되었습니다.
5. 스토리지 백엔드 및 SSD 활용 메커니즘 상세
SSD 저장 및 교체 기능은 통합된 스토리지 백엔드인 Mooncake 와 NIXL 에 의해 완성됩니다.
Mooncake: 분산 KV 캐시 스토어로, 로컬 NVMe SSD를 영속성 계층으로 활용합니다. Zero-Copy 기술을 적용해 복사 오버헤드를 최소화합니다.
NIXL: NVIDIA의 라이브러리로 GDS(GPU Direct Storage) 기술을 사용하여 NVMe SSD와 GPU 메모리 간의 직접 데이터 전송을 지원합니다.
SGLang-LSM: 작은 파일 I/O 문제를 해결하기 위해 LSM-tree 구조를 적용하는 연구가 진행 중입니다.
6. 데이터 이동의 동적 메커니즘 및 성능 최적화
SSD의 느린 속도를 보완하기 위해 비동기 파이프라인 과 프리페칭(Prefetching) 기술이 사용됩니다. 연산이 수행되는 동안 다음 요청에 필요한 데이터를 미리 SSD에서 불러오는 방식입니다.
7. 운영 가이드: 외부 메모리 오프로딩 설정
SGLang 서버 실행 시 다음과 같은 플래그를 통해 SSD 오프로딩 기능을 활성화할 수 있습니다.
python -m sglang.launch_server \
--model-path <모델 경로> \
--enable-hierarchical-cache \
--hicache-ratio 2.0 \
--hicache-write-policy write_through \
--hicache-storage-backend mooncake
8. 결론
SGLang은 KV 캐시를 외부 메모리 및 SSD에 저장하고 동적으로 교체하는 기능을 완벽하게 지원 합니다. 이는 단순한 이론적 설계가 아니라 HiCache 아키텍처와 Mooncake 스토리지 엔진의 통합을 통해 실현되었으며, 코드 레벨에서 TreeNode 의 계층적 관리와 Pinned Memory 활용이 증명되었습니다.
참고 자료
[1] SGLang GitHub Issues (#14184, #7666, #9292)
[2] Mooncake x SGLang HiCache System Design Documentation
[3] arXiv:2312.07104 (Efficiently Programming LLMs using SGLang)
[4] NVIDIA Dynamo & NIXL Technical Documentation