으로 거대 을 구동하는 llama.cpp 의 메모리 매핑 마법
llama.cpp 는 GGUF 양자화 모델과 OS 의 메모리 매핑, Demand Paging 을 결합해 16GB RAM 에서도 수십 GB 크기의 모델을 실시간 추론한다. mmap 으로 파일을 가상 주소 공간에 매핑하고 CPU 접근 시에만 페이지를 적재하며, 역양자화는 필요 레이어만 선택적으로 수행해 메모리 효율을 극대화한다.
메모리 매핑과 Demand Paging 의 협력 구조
llama.cpp 는 POSIX mmap 시스템 콜을 활용해 GGUF 파일 전체를 프로세스의 가상 주소 공간에 직접 매핑한다. 이 방식은 파일을 명시적으로 읽어오지 않아도 되며, CPU 가 매핑된 주소에 접근할 때 OS 커널이 자동으로 디스크 I/O 를 수행해 해당 페이지를 RAM 으로 적재한다. 메모리 매핑은 전통적인 fread 와 달리 파일 전체를 선적재하지 않고 필요한 부분만 지연 로딩하므로, 16GB RAM 환경에서도 수십 GB 크기의 모델을 처리할 수 있는 기반을 제공한다. OS 의 가상 메모리 관리 장치는 프로세스의 페이지 테이블을 통해 각 페이지가 디스크에 있는지 RAM 에 있는지 추적하며, 접근 시 페이지 부재 인터럽트를 발생시켜 필요한 데이터만 적재한다.
양자화와 역양자화의 메모리 효율화 전략
GGUF 포맷은 K-블롭 구조로 양자화된 가중치를 단일 바이너리 파일에 패키징하며, q4_0, Q4_K_M 등 다양한 양자화 스킴을 지원한다. 4 비트 양자화는 16비트 원본 대비 약 75% 의 압축률을 달성해 Llama-3-8B 같은 모델의 30GB 크기를 8GB 이하로 줄인다. llama.cpp 는 페이지가 RAM 에 적재되는 시점에 필요 레이어만 선별적으로 역양자화하여 메모리 효율을 유지한다. 즉, 디스크에 저장된 양자화된 가중치는 mmap 으로 매핑된 상태로 대기하다가 CPU 가 해당 레이어를 연산할 때만 16비트 부동소수점으로 복원된다. 이 방식은 전체 모델을 한 번에 역양자화하지 않으므로 RAM 사용량을 최소화하면서도 추론 속도를 유지한다.
KV-cache 와 동적 메모리 할당의 트레이드오프
Transformer 모델의 자기 회귀적 토큰 생성 과정에서 KV-cache 는 이전 모든 위치의 키와 값 벡터를 캐싱하여 중복 계산을 피한다. 시퀀스 길이가 증가할수록 KV-cache 의 메모리 사용량은 비례하여 증가하며, 이는 Demand Paging 의 효율성을 저해하는 주요 요인이다. llama.cpp 는 KV-cache 를 GPU VRAM 이 아닌 RAM 에 할당하며, 필요 시 디스크로 스왑하여 메모리 부족을 우회한다. 그러나 KV-cache 가 커지면 페이지 부재 빈도가 증가해 추론 속도가 저하되며, 특히 긴 컨텍스트 처리 시 16GB RAM 의 한계에 직면할 수 있다. 이 문제를 완화하기 위해 llama.cpp 는 동적 메모리 할당과 레이어별 분산 적재를 통해 메모리 접근 패턴을 최적화한다. > 이 주제의 전체 맥락 방향성은 **바이브코딩에서 오픈클로까지** 원본 글에 세밀하게 정리되어 있습니다. 더 깊게 탐구하고 싶다면 관련 내부 대표 문서(Pillar/Entity)를 참조하세요.