GGUF
GGML Universal Format
llama.cpp에서 사용하는 모델 포맷. CPU 추론에 최적화.
GGML Universal Format
llama.cpp에서 사용하는 모델 포맷. CPU 추론에 최적화.
GGUF(GGML Universal Format)는 llama.cpp 프로젝트에서 개발한 LLM 모델 저장 포맷으로, 2023년 8월 기존 GGML 포맷을 대체했습니다. 메타데이터를 모델 파일 내에 직접 포함하여 단일 파일로 모델 배포가 가능하며, CPU 추론에 최적화된 구조입니다.
GGUF의 핵심 특징은 확장 가능한 메타데이터 시스템입니다. 모델 아키텍처, 토크나이저, 양자화 정보, 라이센스 등이 파일 헤더에 포함되어 별도의 config.json이나 토크나이저 파일이 필요 없습니다. 버전 관리와 하위 호환성도 포맷 수준에서 지원합니다.
GGUF는 다양한 양자화 레벨(Q2_K, Q3_K_M, Q4_K_M, Q5_K_M, Q6_K, Q8_0 등)을 지원합니다. 예를 들어 Llama-2-7B 모델은 FP16에서 14GB지만, Q4_K_M 양자화로 4.1GB까지 줄일 수 있으며, 품질 손실은 perplexity 기준 약 0.5% 미만입니다.
실무에서 GGUF는 로컬 LLM 배포의 표준이 되었습니다. Ollama, LM Studio, Text Generation WebUI 등 대부분의 로컬 추론 도구가 GGUF를 지원하며, Hugging Face에는 TheBloke 등이 변환한 수천 개의 GGUF 모델이 공개되어 있습니다. M1/M2 Mac에서는 Metal 가속으로 초당 20-40 토큰의 추론 속도를 달성합니다.
# GGUF 모델 사용 예제 (llama-cpp-python)
from llama_cpp import Llama
# GGUF 모델 로드 (Q4_K_M 양자화)
llm = Llama(
model_path="./models/llama-2-7b-chat.Q4_K_M.gguf",
n_ctx=4096, # 컨텍스트 길이
n_threads=8, # CPU 스레드 수
n_gpu_layers=35, # GPU 오프로드 레이어 수 (0=CPU only)
verbose=False
)
# 텍스트 생성
output = llm(
"Q: What is the capital of France? A:",
max_tokens=50,
temperature=0.7,
top_p=0.9,
stop=["Q:", "\n\n"]
)
print(output['choices'][0]['text'])
# 채팅 형식 사용
response = llm.create_chat_completion(
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain quantum computing in simple terms."}
],
max_tokens=200
)
print(response['choices'][0]['message']['content'])
# ----------------------------------------
# Hugging Face에서 GGUF로 변환하기
# ----------------------------------------
# 터미널에서 실행:
# pip install llama-cpp-python[server]
# python -m llama_cpp.server --model ./model.gguf --host 0.0.0.0 --port 8000
# GGUF 변환 (llama.cpp 사용)
# 1. llama.cpp 클론 및 빌드
# git clone https://github.com/ggerganov/llama.cpp
# cd llama.cpp && make
# 2. HuggingFace 모델을 GGUF로 변환
# python convert-hf-to-gguf.py /path/to/hf-model --outfile model-f16.gguf
# 3. 양자화 적용
# ./quantize model-f16.gguf model-q4_k_m.gguf Q4_K_M
# ----------------------------------------
# Ollama로 GGUF 사용하기
# ----------------------------------------
# Modelfile 작성
modelfile_content = """
FROM ./llama-2-7b.Q4_K_M.gguf
TEMPLATE \"\"\"[INST] {{ .System }} {{ .Prompt }} [/INST]\"\"\"
SYSTEM \"You are a helpful AI assistant.\"
PARAMETER temperature 0.7
PARAMETER num_ctx 4096
"""
# 터미널에서:
# ollama create my-llama -f Modelfile
# ollama run my-llama "Hello, how are you?"
"GGUF와 safetensors의 차이점이 뭔가요?" - "safetensors는 PyTorch/JAX 호환 포맷으로 GPU 학습과 추론에 최적화되어 있고, GGUF는 llama.cpp용 CPU 추론에 특화되어 있습니다. GGUF는 양자화와 메타데이터를 내장하고 있어 단일 파일로 배포가 가능한 것이 장점입니다."
"로컬 PC에서 7B 모델을 돌리려면 어떤 양자화를 추천하시나요?" - "16GB RAM이면 Q4_K_M을 추천합니다. 파일 크기 4GB 정도에 품질 손실이 거의 없어요. 8GB RAM이면 Q3_K_M이나 Q2_K를 써야 하는데, 이 경우 품질 저하가 체감됩니다. GPU가 있다면 n_gpu_layers로 일부 레이어를 오프로드하면 속도가 2-3배 빨라집니다."
"n_ctx를 8192로 올렸는데 메모리가 부족해요. 어떻게 해야 하나요?" - "컨텍스트 길이가 늘면 KV 캐시 메모리가 급증합니다. 8192면 약 2-3GB 추가로 필요해요. rope_freq_base를 조정해서 RoPE 스케일링을 적용하거나, n_batch를 줄여서 메모리 사용을 최적화할 수 있습니다."
Q4_K_M 이하의 양자화는 복잡한 추론 태스크에서 품질 저하가 눈에 띕니다. 코딩이나 수학 문제는 Q5_K_M 이상을 권장하며, 단순 대화는 Q3_K_M도 충분합니다.
모델 파일 크기 외에 KV 캐시, 추론 버퍼 등으로 추가 메모리가 필요합니다. 일반적으로 모델 크기의 1.5-2배 RAM을 확보하세요. 컨텍스트 길이를 늘리면 더 필요합니다.
Hugging Face의 GGUF 파일은 커뮤니티가 변환한 것이 많습니다. 신뢰할 수 있는 업로더(TheBloke, bartowski 등)의 모델을 사용하고, 체크섬을 확인하세요.