기본은 Q4_K_M; VRAM 여유가 있고 마지막 몇 퍼센트의 품질이 필요하면 Q6_K나 Q8_0으로. GGUF 양자화는 모델 가중치를 16비트에서 더 적은 비트로 줄입니다 — Q4_K_M은 가중치당 약 4.85비트를 저장하므로 7B 모델이 ~14 GB에서 ~4.1 GB로 줄어들고, 퍼플렉시티는 보통 원본보다 1% 미만 나빠집니다. “어떤 gguf 양자화를 쓸까”라는 질문에는 온라인의 드라마가 가리는, 지루할 만큼 안정적인 답이 있습니다. 아래에서: 양자화가 가중치에 실제로 하는 일, 단계마다 지불하는 품질의 값, 크기 계산을 스스로 하는 법, 그리고 남의 벤치마크를 믿는 대신 내 하드웨어에서 손상을 측정하는 명령 하나를 다룹니다.
GGUF 양자화는 실제로 무엇을 하나?
모델은 16비트 부동소수점(FP16 또는 BF16)으로 학습됩니다: 수십억 개 가중치 각각이 2바이트 숫자입니다. 양자화는 각 가중치를 더 적은 비트로 압축합니다. 순진한 방법 — 모든 가중치를 4비트 정수로 반올림 — 은 작지만 중요한 값을 파괴하므로, GGUF는 트릭 둘을 씁니다:
- 블록 스케일링. 가중치를 블록으로 묶고(보통 32개씩) 각 블록에 자체 스케일 팩터를 줍니다. 4비트 값은 그 블록 안의 오프셋이므로 넓은 크기 범위가 살아남습니다.
- 중요도를 아는 k-quant. Q4_K_M의 “K”는 스케일의 슈퍼블록을 뜻하고, attention과 feed-forward 레이어를 서로 다르게 다룹니다 — 둘이 압축을 견디는 정도가 다르기 때문입니다.
“I” 계열(IQ4_XS와 친구들)은 이미지 압축에서 빌려온 정보이론적 코드북으로 더 나아갑니다. 같은 아이디어, 더 화려한 인코딩: 비슷한 품질에서 가중치당 더 적은 비트, 일부 백엔드에서는 약간 느린 추론이라는 대가.
대부분의 혼동을 막아주는 정리 하나: 양자화는 저장된 가중치만 바꿉니다. 아키텍처, 토크나이저, 컨텍스트 처리는 그대로입니다. 같은 모델의 Q4 파일과 Q8 파일은 다른 코트를 입은 같은 모델입니다.
Q4 vs Q8: 양자화가 높을수록 좋을까?
기술적으로는 예, 체감으로는 아니오. llama.cpp 자체의 Llama 모델 퍼플렉시티 측정을 기준으로 잡으면: Q8_0은 FP16의 ~0.02% 안에 들어옵니다 — 실용 목적으로는 무손실. Q6_K는 구분이 거의 안 됩니다. Q4_K_M은 대략 1–2%의 퍼플렉시티 상승, Q4_0은 조금 더, Q2_K는 작은 모델에서 일관된 답변이 무너지기 시작하는 지점입니다.
숫자가 암시하는 규칙 둘:
- 모델 크기가 양자화 여유를 삽니다. 70B 모델은 7B 모델보다 Q2/Q3를 훨씬 잘 견딥니다 — 더 큰 모델이 더 중복적이기 때문입니다. 7B를 Q2로 양자화하는 건 절단이고, 70B를 Q3로 양자화하는 건 재단입니다.
- 품질의 바닥은 과제와 함께 움직입니다. 채팅은 Q4를 견딥니다. 정확한 코드 생성, 수학, 정밀 문서 위의 RAG는 양자화 노이즈를 더 빨리 드러냅니다. Q4 모델이 은근히 틀린 코드를 계속 쓴다면, 모델 탓하기 전에 같은 모델을 Q6_K로 테스트해 보세요.
| 단계 | 비트/가중치 | FP16 대비 크기 | 품질 손실 | 이럴 때 사용 |
|---|---|---|---|---|
| Q2_K | ~3.4 | ~21% | 13B 미만에서 심각 | 다른 건 안 들어갈 때, 대형 모델만 |
| Q3_K_M | ~3.9 | ~25% | 뚜렷함 | VRAM 촉박, ≥14B 모델 |
| Q4_K_S | ~4.6 | ~29% | 작음 | Q4_K_M이 안 들어가고 근소한 차이일 때 |
| Q4_K_M | ~4.85 | ~30% | ~1% 퍼플렉시티 | 기본값. 최고의 품질/크기 절충 |
| Q5_K_M | ~5.7 | ~35% | ~0.5% | VRAM 여유, 품질 중요 과제 |
| Q6_K | ~6.6 | ~41% | 거의 없음 | 코드/수학, 아직 여유 있게 들어감 |
| Q8_0 | ~8.5 | ~53% | 사실상 없음 | 기준 측정, 파인튜닝 베이스 |
| IQ4_XS | ~4.3 | ~27% | ≈Q4_K_M | Q4_K_M이 살짝 크고 백엔드가 i-quant 지원 시 |
단계별로 VRAM은 얼마나 필요할까?
표를 외우지 말고 크기 계산을 직접 하세요 — 한 줄입니다:
size_GB ≈ (bits_per_weight × params) / 8
# 8B 모델 @ Q4_K_M: 4.85 × 8 / 8 ≈ 4.9 GB
# 8B 모델 @ Q8_0: 8.50 × 8 / 8 ≈ 8.5 GB 그다음 공식이 빠뜨린 부분을 더합니다: KV 캐시(컨텍스트 길이에 비례해 자람 — 수백 MB에서 수 GB), 활성값, 컴퓨트 버퍼. 실전 마진: “4.9 GB” 모델은 4k 컨텍스트에서 6 GB 카드를 원하고, 16k에서 그 자리를 지키려면 flash-attention과 KV 캐시 양자화가 필요합니다. 가중치는 헤드라인일 뿐, 청구서 전체가 아닙니다.
어떤 GGUF 양자화를 써야 할까?
결정 순서, 외울 만한 예외 없음:
- 컨텍스트 + KV 예산을 먼저 계산, 그다음 가중치. 안 들어가는 컨텍스트는 측정할 수 없는 품질보다 나쁩니다.
- 기본은 Q4_K_M. 커뮤니티 기본값인 데는 이유가 있습니다 — 크기의 70%로 대략 1%의 퍼플렉시티. Ollama를 포함한 모든 레지스트리가 이걸 기준선으로 실어 나릅니다.
- 과제가 노이즈를 벌하면 Q6_K로 올립니다: 코드, 수학, 추출, 파이프라인에 무인으로 넣는 모든 것.
- Q8_0은 기준 측정용으로만 — A/B 테스트, 양자화 손상 측정, 파인튜닝 베이스. 일상용으로는 주로 VRAM 센서의 따뜻함을 사는 겁니다.
- Q4 아래로는 압박이 있을 때만, 그리고 대형 모델에서만. 신뢰하기 전에 알려진 어려운 프롬프트로 테스트하세요.
Hugging Face에서 어떤 파일을 받을지 고르는 중이라면, 업로더가 샤드만 올린 경우가 아니라면 샤드 분할보다 단일 Q4_K_M.gguf를 선호하세요 — 움직이는 부품이 적습니다. 어디서 돌릴지 고르는 중이라면 엔진 선택은 별개의 축입니다: llama.cpp vs Ollama를 보세요.
양자화 손상은 어떻게 직접 측정할까?
벤치마크는 제각각; 당신의 프롬프트는 일정합니다. llama.cpp를 한 번 빌드하고, 같은 모델의 두 단계를 받아, 퍼플렉시티(낮을수록 좋음)와 tokens/second를 둘 다 측정합니다:
git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
cmake -B build && cmake --build build --config Release -j
huggingface-cli download bartowski/Meta-Llama-3.1-8B-Instruct-GGUF
Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf Meta-Llama-3.1-8B-Instruct-Q8_0.gguf
--local-dir models
# wiki 텍스트 청크에 대한 퍼플렉시티 (낮을수록 원본 모델에 가까움)
./build/bin/llama-perplexity -m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -ngl 99
./build/bin/llama-perplexity -m models/Meta-Llama-3.1-8B-Instruct-Q8_0.gguf -ngl 99
# 같은 하드웨어에서의 속도
./build/bin/llama-bench -m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -ngl 99 Q4_K_M 숫자는 Q8_0보다 수백 분의 몇 포인트 나쁘고 파일은 ~40% 작습니다. 다운스트림 과제가 차이를 느끼지 못한다면 — 대부분은 못 느낍니다 — 남의 리더보드를 읽을 필요 없이 답을 얻은 겁니다.
양자화는 프라이버시나 로컬 전용 주장을 해칠까?
아니요 — 가중치에 대한 산술이고, 완전히 오프라인이며, 양자화된 파일은 같은 파라미터를 담은 더 작은 컨테이너일 뿐입니다. Q4_K_M을 로컬에서 돌리는 것은 전체 정밀도 모델을 로컬에서 돌리는 것과 정확히 같은 양을(정확히는 적은 양을) 새어 나가게 합니다: 머신을 떠나는 것은 아무것도 없습니다. 프라이버시와 관련된 변수는 비트 폭이 아니라 추론이 어디서 도는가입니다. 모델 출처에 관한 평소 주의사항은 모든 양자화 단계에 똑같이 적용됩니다: 훔친 베이스의 “uncensored” 파인튜닝은 Q8이라 해도 Q4의 같은 가중치보다 안전하지 않습니다. 파일 포맷 쪽은 how to run GGUF models locally를 보세요.
그래서 어떤 단계를 골라야 할까?
Q4_K_M, 그리고 이 주제로 포럼을 읽는 걸 멈추세요. VRAM이 허락하면 정밀도가 굶주린 작업에는 Q6_K로 올리고, A/B 비교용 Q8_0 하나를 곁에 두고, Q4 아래는 대형 모델 전용 비상식량으로 취급하세요. 피할 가치가 있는 실수 하나는 대칭적입니다: Q4 vs Q5를 고민하면서 컨텍스트 길이를 무시하는 것 — 어느 양자화보다 많은 로컬 셋업을 망치는 건 그쪽입니다.
— mrsaynothing
Get the next one by email
One email per post. No spam, no algorithms.
what is this?git cherry-pick: 여러 커밋, 브랜치, 충돌까지
글이 마음에 드셨나요? 제 본업이 바로 이런 일입니다. 저를 고용하세요