llama.cpp와 GGUF 포맷 이해
llama.cpp는 C/C++로 작성된 LLM 추론 엔진으로, CPU와 GPU 모두에서 대형 언어 모델을 효율적으로 실행할 수 있습니다. GGUF(GPT-Generated Unified Format)는 llama.cpp에서 사용하는 모델 파일 형식입니다.
양자화 수준별 비교
| 양자화 | 비트 | 모델 크기(7B) | 품질 | 속도 |
|---|---|---|---|---|
| F16 | 16 | ~13.5GB | 최상 | 느림 |
| Q8_0 | 8 | ~7.2GB | 우수 | 보통 |
| Q5_K_M | 5 | ~4.8GB | 좋음 | 빠름 |
| Q4_K_M | 4 | ~4.1GB | 양호 | 빠름 |
| Q3_K_M | 3 | ~3.3GB | 보통 | 매우 빠름 |
| Q2_K | 2 | ~2.7GB | 낮음 | 매우 빠름 |
llama.cpp 빌드 및 실행
# 빌드 (CUDA GPU 지원)
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make LLAMA_CUDA=1
# 기본 추론 실행
./main -m models/llama-2-7b-chat.Q4_K_M.gguf \
-p "한국의 수도는" \
-n 256 \
-t 8 \
--temp 0.7 \
--top-p 0.9 \
--repeat-penalty 1.1
# 서버 모드 (OpenAI 호환 API)
./server -m models/llama-2-7b-chat.Q4_K_M.gguf \
--host 0.0.0.0 \
--port 8080 \
-ngl 35 \
-c 4096
양자화 변환 방법
# HuggingFace 모델을 GGUF로 변환
python convert_hf_to_gguf.py \
./models/my-model/ \
--outfile models/my-model-f16.gguf \
--outtype f16
# 양자화 적용
./quantize models/my-model-f16.gguf \
models/my-model-Q4_K_M.gguf Q4_K_M
# imatrix 기반 중요도 양자화 (품질 향상)
./imatrix -m models/my-model-f16.gguf \
-f calibration-data.txt \
-o imatrix.dat
./quantize models/my-model-f16.gguf \
models/my-model-IQ4_XS.gguf IQ4_XS \
--imatrix imatrix.dat
GPU 오프로딩 최적화
# -ngl: GPU에 올릴 레이어 수
# 7B 모델 기준 약 35개 레이어
./main -m model.gguf -ngl 35 # 전체 GPU
./main -m model.gguf -ngl 20 # 부분 GPU (VRAM 부족 시)
./main -m model.gguf -ngl 0 # CPU만 사용
# VRAM 사용량 확인
nvidia-smi --query-gpu=memory.used --format=csv -l 1
주요 파라미터 튜닝
-c: 컨텍스트 크기 (기본 512, 최대 모델 의존) — 클수록 VRAM 소모 증가-t: CPU 스레드 수 — 물리 코어 수에 맞추는 것이 최적-ngl: GPU 레이어 수 — VRAM에 맞게 조절--mmap: 메모리 맵 사용 — 대용량 모델에서 로딩 속도 향상-b: 배치 크기 — 프롬프트 처리 속도에 영향
K-quant vs I-quant
K-quant(Q4_K_M 등)는 블록 단위 양자화로 구현이 단순하고 호환성이 좋습니다. I-quant(IQ4_XS 등)는 중요도 행렬(imatrix) 기반으로 더 적은 비트에서도 높은 품질을 유지합니다. 동일 크기에서 I-quant가 약 0.1~0.3 perplexity 개선을 보여줍니다.
로컬 LLM 운용 시 Q4_K_M이 품질과 속도의 가장 좋은 균형점이며, VRAM이 충분하다면 Q5_K_M을 추천합니다. imatrix 양자화를 사용하면 Q3 수준에서도 합리적인 품질을 얻을 수 있습니다.
댓글 0