llama.cpp의 한계를 넘어서 llama.cpp가 Demand Paging와 GGUF으로 가능하게 하는 메모리 과학의 정수
llama.cpp는 GGUF 바이너리에 메타데이터와 텐서 데이터를 통합 저장하고, OS의 Demand Paging을 활용해 메모리 매핑(mmap) 방식으로 필요한 페이지만 RAM에 적재함으로써 16GB RAM 환경에서도 전체 모델을 로드하지 않고 추론할 수 있다. K‑Quant 기반 4.5bpw 가중치 양자화와 효율적인 KV‑캐시 관리로 메모리 사용량을 추가로 절감하며, VRAM 부족 시 CPU 오프로딩으로 로컬 추론의 한계를 우회한다. 이 설계 덕분에 모델 파일 크기가 물리 RAM을 초과하더라도 부분 로딩으로 구동할 수 있어 개인 개발자의 로컬 AI 환경이 극적으로 변화했다.
이 글의 핵심 주장과 근거
GGUF 의 메모리 효율성과 mmap 의 과학
llama.cpp 가 개인 개발자의 로컬 추론 환경을 혁신한 핵심은 GGUF 포맷과 OS 의 Demand Paging 을 결합한 메모리 매핑 기법이다. GGUF 는 safetensors 와 달리 텐서 데이터뿐만 아니라 표준화된 메타데이터를 하나의 바이너리 파일에 내장하여, 모델의 구조 정보를 별도의 파일 없이도 빠르게 로드할 수 있게 한다. 이 설계는 메모리 제약 환경에서 특히 중요한데, 파일을 물리 RAM 전체에 복사하는 대신 가상 주소 공간에 매핑(mmap)함으로써 OS 가 필요할 때만 페이지를 적재하기 때문이다. Demand Paging 은 프로세스가 특정 메모리 주소를 접근할 때만 실제 물리 페이지를 할당하는 기법으로, 16GB RAM 환경에서도 모델 파일 크기가 이를 초과하는 경우에도 부분적 로딩을 통해 추론이 가능하게 한다. 이는 마치 도서관에서 모든 책을 한 번에 꺼내놓는 대신, 읽어야 하는 책만 필요한 시점에 서고에서 가져오는 것과 같은 원리다.
K-Quant 양자화와 비트 심도의 트레이드오프
llama.cpp 의 K-Quant 양자화 체계는 가중치를 저비트 표현으로 압축하면서도 정밀도를 유지하는 혁신적인 방법론이다. Q4_K 는 약 4.5bpw(bits-per-weight) 로, 원본 FP16(16bpw) 대비 약 3.5 배의 압축률을 달성하며 이는 7B 모델이 16GB RAM 환경에서 KV-캐시와 컴퓨트 버퍼를 충분히 수용할 여유를 만든다. K-Quant 는 슈퍼블록과 블록의 이중 계층 구조를 사용하여 양자화 메타데이터를 효율적으로 관리하는데, 각 슈퍼블록은 8 개의 블록으로 구성되고 각 블록은 32 개의 가중치를 포함한다. 가중치 계산식은 w = q * block_scale(6-bit) + block_min(6-bit) 로, 양자화된 값 q 에 블록 스케일과 최소값을 곱하고 더하여 원본에 근사하는 값을 복원한다. Q2_K 는 2.625bpw 로 극단적인 압축을 제공하지만 정밀도 손실이 크고, Q6_K 는 6.5625bpw 로 고화질을 유지하면서도 FP16 대비 약 2.4 배의 압축률을 제공한다. 이러한 다양한 비트 심도 선택은 사용자의 하드웨어 제약과 품질 요구사항에 따라 최적의 트레이드오프를 찾을 수 있게 한다.
KV-캐시와 컨텍스트 윈도우의 메모리 비선형성
autoregressive 언어 모델에서 KV-캐시는 이전 시퀀스 위치의 Key 와 Value 텐서를 저장하여 중복 계산을 방지하는 핵심 메커니즘이지만, 컨텍스트 길이에 따라 메모리 소모량이 급격히 증가한다. gpt-oss 20B 모델을 예로 들면, 8K 컨텍스트에서 KV-캐시는 약 0.2GB 를 소모하여 전체 메모리 사용량(15.5GB) 대비 미미한 비중을 차지하지만, 32K 컨텍스트로 확장 시 KV-캐시만으로 총 15.5GB 에 근접하여 모델 가중치와 컴퓨트 버퍼를 수용할 여유가 급격히 줄어든다. 이는 컨텍스트 길이가 증가함에 따라 KV-캐시 메모리가 선형적으로 증가하는 것이 아니라, 전체 메모리 예산 대비 차지하는 비중이 기하급수적으로 늘어나는 비선형적 패턴을 보인다. 16GB RAM 환경에서 긴 컨텍스트를 요구하는 작업을 수행할 때는 모델 크기를 줄이거나 양자화를 적용하여 KV-캐시에 할당할 여유 메모리를 확보해야 한다. 예를 들어, 7B 모델을 Q4_K 로 양자화하면 모델 가중치가 약 4-5GB 로 줄어들어 KV-캐시에 8-10GB 를 할당할 수 있으며, 이는 32K 이상의 컨텍스트를 안정적으로 처리할 수 있는 기반이 된다.
VRAM 제약 환경에서의 CPU 오프로딩 전략
RTX 4080 Super 와 같은 16GB VRAM 그래픽 카드를 사용하는 개발자 환경에서는 MoE(Mixture of Experts) 아키텍처의 모델을 실행할 때 GPU 메모리 부족이 빈번하게 발생한다. llama.cpp 는 --n-cpu-moe 옵션을 통해 MoE 레이어를 CPU 로 오프로드하는 전략을 제공하며, 이를 통해 전체 20B 모델 추론이 가능해진다. RTX 4080 Super 에서 --n-cpu-moe 22 를 설정하면 gpt-oss 20B 모델을 약 8100-8170 tok/s prefill 속도로 실행할 수 있으나, 이는 GPU 전용 실행 대비 감소한 수치다. 병목 현상은 PCIe 와 RAM 간의 링크 속도에서 발생하며, GPU 의 고속 메모리 대역폭에 비해 CPU-RAM 간 데이터 전송이 상대적으로 느리기 때문이다. 그럼에도 불구하고 이 전략은 VRAM 이 부족한 환경에서도 대규모 모델을 실행할 수 있는 유일한 현실적 대안으로, 특히 개발 단계나 프로토타입 작성 시에는 충분한 성능을 제공한다. 향후 PCIe 5.0 나 CXL(Cross-domain Compute Link) 과 같은 고속 인터페이스가 보편화되면 CPU 오프로딩의 병목이 완화되어 hybrid GPU-CPU 추론의 효율성이 크게 개선될 전망이다. > 이 주제의 전체 맥락 방향성은 **바이브코딩에서 오픈클로까지** 원본 글에 세밀하게 정리되어 있습니다. 더 깊게 탐구하고 싶다면 관련 내부 대표 문서(Pillar/Entity)를 참조하세요.