블로그로 돌아가기

GGUF 양자화: 어떤 단계를 써야 할까?

2026년 9월 13일

기본은 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는 트릭 둘을 씁니다:

  1. 블록 스케일링. 가중치를 블록으로 묶고(보통 32개씩) 각 블록에 자체 스케일 팩터를 줍니다. 4비트 값은 그 블록 안의 오프셋이므로 넓은 크기 범위가 살아남습니다.
  2. 중요도를 아는 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_MQ4_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 양자화를 써야 할까?

결정 순서, 외울 만한 예외 없음:

  1. 컨텍스트 + KV 예산을 먼저 계산, 그다음 가중치. 안 들어가는 컨텍스트는 측정할 수 없는 품질보다 나쁩니다.
  2. 기본은 Q4_K_M. 커뮤니티 기본값인 데는 이유가 있습니다 — 크기의 70%로 대략 1%의 퍼플렉시티. Ollama를 포함한 모든 레지스트리가 이걸 기준선으로 실어 나릅니다.
  3. 과제가 노이즈를 벌하면 Q6_K로 올립니다: 코드, 수학, 추출, 파이프라인에 무인으로 넣는 모든 것.
  4. Q8_0은 기준 측정용으로만 — A/B 테스트, 양자화 손상 측정, 파인튜닝 베이스. 일상용으로는 주로 VRAM 센서의 따뜻함을 사는 겁니다.
  5. 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.

self-hosted · no third parties · one-click unsubscribe

what is this?

git cherry-pick: 여러 커밋, 브랜치, 충돌까지

글이 마음에 드셨나요? 제 본업이 바로 이런 일입니다. 저를 고용하세요