원문 캡처 · en.wikipedia.org
원문 캡처 · en.wikipedia.org

GGUF는 모델의 텐서와 메타데이터를 한 파일에 담는 바이너리 형식이다. llama.cpp에서 도입했으며, 양자화된 대형 언어 모델을 로컬에서 실행하는 여러 도구가 지원한다. 단일 파일로 모델을 불러오고, 메타데이터를 확장해 여러 모델 구조와 호환되도록 설계됐다.

GGUF는 2023년 8월 기존 GGML 형식을 대체하는 후속 형식으로 도입됐다. GGML은 모델의 하이퍼파라미터와 토크나이저 정보를 로더에 고정해 새 구조를 추가할 때 기존 파일과의 호환성이 깨질 수 있었다. GGUF는 키-값 방식의 메타데이터를 사용해 구조·토크나이저·학습 정보 등을 추가할 수 있도록 바꿨다. 현재 형식 버전은 v3이며, 내부 형식은 버전 2에서 메모리 매핑을 위한 정렬을 도입했고 버전 3에서 선택적 빅엔디안 지원을 추가했다.

파일에는 헤더, 키-값 메타데이터, 텐서 정보, 텐서 데이터가 차례로 들어간다. 기본적으로 텐서 데이터는 32바이트 경계에 맞춰 정렬된다. 이 구조 덕분에 파일 전체를 RAM에 올리지 않고도 운영체제의 메모리 매핑으로 가중치에 접근할 수 있다. GGUF는 토크나이저와 문맥 길이 같은 정보도 함께 저장하므로 별도 설정 파일 없이 모델을 불러오도록 설계됐다.

양자화는 모델 가중치의 정밀도를 낮추는 방식이다. 메모리 사용량을 줄이고 속도를 높일 수 있지만, 모델 정확도가 낮아질 수 있다. GGUF는 2~8비트 정수 양자화와 float32, float16, bfloat16 등의 데이터 형식, 1.58비트 양자화를 지원한다. Q4_K, Q5_K, Q6_K 같은 K-quant 방식은 블록 단위로 값을 저장하며, 문서에 따르면 같은 비트 폭의 단순한 기존 양자화 방식보다 일반적으로 품질이 높다.

다른 프레임워크에서 만든 모델은 llama.cpp에 포함된 convert_hf_to_gguf.py로 GGUF로 변환할 수 있다. 변환 뒤에는 llama-quantize로 정수 형식으로 다시 양자화하거나, 대형 모델을 llama-gguf-split으로 여러 파일에 나눌 수 있다. 프로그래밍 방식으로 파일을 읽고 쓰는 C/C++ API와 Python 패키지 gguf-py도 제공된다.

GGUF는 llama.cpp와 Ollama의 기본 모델 형식이며, LM Studio, GPT4All, Jan, koboldcpp도 직접 지원한다. Hugging Face는 모델 허브에서 GGUF 메타데이터 보기와 태그 필터링, 추론 엔드포인트 연동을 제공한다.

자세한 내용은 GGUF 공식 사양, Hugging Face GGUF 문서, llama.cpp 저장소를 참고할 수 있다.