본문 바로가기
C.W.K.
Stream
Lesson 03 of 06 · published

양자화 기초 — Q4와 Q8에서 정말 잃는 것

~16 min · quantization, q4, q8, precision

Level 0호기심
0 XP0/51 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

양자화는 크기와 정밀도를 맞바꿔

모델 가중치는 부동소수점 숫자야. fp32는 숫자마다 4바이트, fp16/bf16은 2바이트, int8/Q8은 1바이트, Q4는 0.5바이트를 써. 양자화는 높은 정밀도의 가중치를 낮은 정밀도의 근삿값으로 바꿔 품질을 조금 내주고 디스크와 메모리를 크게 줄여.

7B 모델이면 차이가 선명해. 가중치만 fp16은 약 14 GB, Q8은 약 7 GB, Q4는 약 3.5 GB야. 모델은 같아도 필요한 메모리 예산이 셋으로 갈려.

Q4가 모든 값을 4비트로 저장한다는 뜻은 아니야

MLX와 현대 양자화 방식은 가중치를 묶음으로 나눠. 32, 64, 128개 가중치가 하나의 축척값과 영점을 공유하고, 이 두 값은 보통 fp16처럼 더 높은 정밀도로 저장돼. 묶음 안의 가중치만 4비트로 양자화하고 추론할 때 dequantized = scale * (quantized_int4 - zero_point)로 되살려.

이 방식이 affine 양자화이고 기본값인 --q-mode affine이야. mxfp4, nvfp4, mxfp8 같은 새 MX 방식은 최신 GPU의 전용 하드웨어에 맞는 미세 축척 형식을 써.

Q4와 Q8의 실제 차이

  • 디스크와 메모리: 같은 모델의 Q4는 Q8의 약 절반이야.
  • 추론 속도: Q4는 메모리 대역폭을 덜 써 조금 빠를 때도 있고, 복원 계산 때문에 조금 느릴 때도 있어. 대체로 비슷하다고 봐.
  • 품질: Q4는 대부분 작업에서 perplexity나 점수를 조금 잃고, 긴 추론과 저자원 언어에서는 손실이 커질 수 있어. 지시 학습 모델의 채팅에서는 눈으로 Q8과 구분하기 어려운 경우가 많지만 세밀한 벤치마크는 차이를 보여.
  • 작은 모델: 1B 이하 모델은 정밀도 손실을 흡수할 매개변수가 적어 Q4에서 더 많이 무너질 수 있어. 1B 미만은 Q8을, 3B 이상은 Q4를 먼저 생각해.

기본 선택은 이렇게 잡아

Apple Silicon에서 7B 이상 지시 학습 모델은 Q4로 시작해. 더 많은 메모리 예산에 들어가고 품질 손실이 보통 병목이 아니야. 정밀도에 민감한 작업에서 차이를 측정했거나 손실이 중요한 3B 미만 모델일 때 Q8로 올려. 메모리를 더 써서라도 마지막 품질 조각이 필요한 분명한 이유가 있을 때만 양자화를 건너뛰고 bf16/fp16을 써.

Code

같은 모델을 Q4와 Q8로 양자화 — 디스크에서 비교·bash
# Convert at Q4
python -m mlx_lm convert \
  --hf-path meta-llama/Llama-3.2-1B-Instruct \
  --mlx-path ./Llama-3.2-1B-Instruct-Q4 \
  --quantize --q-bits 4 --q-group-size 64

# Convert at Q8
python -m mlx_lm convert \
  --hf-path meta-llama/Llama-3.2-1B-Instruct \
  --mlx-path ./Llama-3.2-1B-Instruct-Q8 \
  --quantize --q-bits 8 --q-group-size 64

# Compare on disk
du -sh ./Llama-3.2-1B-Instruct-Q4 ./Llama-3.2-1B-Instruct-Q8

# Sample (1B Llama variant):
#   ~700 MB for Q4
#   ~1.3 GB for Q8
같은 프롬프트로 품질 눈으로 보기·python
from mlx_lm import load, generate
from mlx_lm.sample_utils import make_sampler
import mlx.core as mx

prompt = "Explain the difference between weather and climate in two sentences."
sampler = make_sampler(temp=0.0)   # greedy for fair comparison

for path in ["./Llama-3.2-1B-Instruct-Q4", "./Llama-3.2-1B-Instruct-Q8"]:
    print(f"--- {path} ---")
    model, tok = load(path)
    mx.random.seed(42)
    print(generate(model, tok, prompt=prompt, max_tokens=80, sampler=sampler, verbose=False))
    print()

# In casual reading the Q4 and Q8 outputs are usually indistinguishable;
# the differences appear in benchmark scores, not in this kind of demo.

External links

Exercise

작은 기반 모델 하나를 Q4 group-size 32, Q4 group-size 128, Q8 group-size 64로 각각 변환해. 공정하게 비교하려면 같은 프롬프트와 탐욕 샘플링을 써. 디스크 크기와 출력을 나란히 보고 Q4가 얼마나 작아지는지, 묶음 크기가 얼마나 영향을 주는지, 눈으로 품질을 구별할 수 있는지 느껴봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.