{"title":"양자화 비주얼 가이드 — Maarten Grootendorst가 그림으로 푸는 LLM 경량화","url":"https://hugo-blog-static-site.haxlys.workers.dev/posts/visual-guide-to-quantization/","section":"posts","date":"2026-04-28T13:00:00+09:00","lastmod":"2026-04-28T13:00:00+09:00","description":"Maarten Grootendorst의 'A Visual Guide to Quantization'을 한국어로 정리한다 — FP32→FP16/BF16/INT8/INT4의 표현 손실, symmetric/asymmetric 양자화, calibration·clipping의 트레이드오프, PTQ(GPTQ·GGUF) vs QAT(BitNet·BitNet b1.58)까지 50여 장 시각화의 핵심을 한 글에 압축한다.","summary":"Maarten Grootendorst가 Exploring Language Models 뉴스레터에 공개한 A Visual Guide to Quantization은 LLM 양자화의 직관을 50여 장의 커스텀 비주얼로 풀어낸 글입니다. 이 글은 그 핵심을 한국어로 정리합니다 — 숫자 표현의 기초부터 FP32→INT4의 매핑 수학, GPTQ·GGUF의 작동 원리, 그리고 1-bit/1.58-bit BitNet까지.\n원문: A Visual Guide to Quantization — Maarten Grootendorst\nTL;DR 요약 문제: 70B 모델을 FP32(full-precision)로 로딩하면 약 280GB. 비트 수가 많을수록 표현 범위(dynamic range)와 인접 값 간 거리(precision)가 동시에 커진다. 데이터 타입: FP32 → FP16(범위 좁음) → BF16(FP16과 같은 16비트지만 FP32 수준 범위, 딥러닝 표준) → INT8(1/4 비트, 정수 연산) → INT4까지. 매핑 방식: Symmetric(absmax) 은 0 중심 대칭, Asymmetric(zero-point) 는 zero-point z를 두고 비대칭 매핑. Outlier 처리에는 clipping이 필요하고, 범위 선택은 calibration(percentile/MSE/KL)으로 결정한다. PTQ vs QAT: PTQ는 학습 후 양자화(빠르고 단순), QAT는 학습 중 fake quant로 양자화 노이즈를 학습 → INT4 같은 저비트 영역에서 PTQ보다 우월. 4-bit 영역: GPTQ는 inverse-Hessian으로 weight 중요도를 가중해 양자화 오차를 분배(GPU). GGUF는 super/sub 블록의 이중 스케일 양자화로 CPU 오프로딩을 가능하게 한다(llama.cpp). 1-bit 시대: BitNet은 weights를 {-1, 1}로, BitNet b1.58은 {-1, 0, 1} ternary로. 0의 추가가 곱셈을 덧셈으로 환원하고 feature filtering을 가능하게 한다 — \u0026ldquo;13B BitNet b1.58은 3B FP16 LLM보다 효율적\u0026rdquo;. Part 1. LLM의 \u0026ldquo;문제점\u0026rdquo; LLM은 수십억 개 파라미터(주로 weights)와 추론 중 만들어지는 activations로 구성됩니다. 가능한 적은 비트로 값을 표현해야 메모리와 연산 비용을 줄일 수 있습니다.\n","content":"Maarten Grootendorst가 Exploring Language Models 뉴스레터에 공개한 A Visual Guide to Quantization은 LLM 양자화의 직관을 50여 장의 커스텀 비주얼로 풀어낸 글입니다. 이 글은 그 핵심을 한국어로 정리합니다 — 숫자 표현의 기초부터 FP32→INT4의 매핑 수학, GPTQ·GGUF의 작동 원리, 그리고 1-bit/1.58-bit BitNet까지.\n원문: A Visual Guide to Quantization — Maarten Grootendorst\nTL;DR 요약 문제: 70B 모델을 FP32(full-precision)로 로딩하면 약 280GB. 비트 수가 많을수록 표현 범위(dynamic range)와 인접 값 간 거리(precision)가 동시에 커진다. 데이터 타입: FP32 → FP16(범위 좁음) → BF16(FP16과 같은 16비트지만 FP32 수준 범위, 딥러닝 표준) → INT8(1/4 비트, 정수 연산) → INT4까지. 매핑 방식: Symmetric(absmax) 은 0 중심 대칭, Asymmetric(zero-point) 는 zero-point z를 두고 비대칭 매핑. Outlier 처리에는 clipping이 필요하고, 범위 선택은 calibration(percentile/MSE/KL)으로 결정한다. PTQ vs QAT: PTQ는 학습 후 양자화(빠르고 단순), QAT는 학습 중 fake quant로 양자화 노이즈를 학습 → INT4 같은 저비트 영역에서 PTQ보다 우월. 4-bit 영역: GPTQ는 inverse-Hessian으로 weight 중요도를 가중해 양자화 오차를 분배(GPU). GGUF는 super/sub 블록의 이중 스케일 양자화로 CPU 오프로딩을 가능하게 한다(llama.cpp). 1-bit 시대: BitNet은 weights를 {-1, 1}로, BitNet b1.58은 {-1, 0, 1} ternary로. 0의 추가가 곱셈을 덧셈으로 환원하고 feature filtering을 가능하게 한다 — \u0026ldquo;13B BitNet b1.58은 3B FP16 LLM보다 효율적\u0026rdquo;. Part 1. LLM의 \u0026ldquo;문제점\u0026rdquo; LLM은 수십억 개 파라미터(주로 weights)와 추론 중 만들어지는 activations로 구성됩니다. 가능한 적은 비트로 값을 표현해야 메모리와 연산 비용을 줄일 수 있습니다.\n수치 표현의 기초 값은 보통 부동소수점(IEEE-754 표준)으로 표현되며, 비트는 세 부분으로 나뉩니다:\nSign: 부호 (1비트) Exponent: 지수 Fraction (Mantissa): 가수 비트 수가 많을수록 정밀도가 높습니다. 표현 가능한 값의 구간을 dynamic range, 인접한 두 값 사이의 거리를 precision이라고 부릅니다.\n메모리 제약 70B 파라미터 모델을 FP32로 로딩하면 약 280GB가 필요하다.\n8비트 = 1바이트라는 단순 산수가 LLM에서는 살벌한 비용으로 돌아옵니다. 그래서 정밀도를 유지하면서 비트 수를 줄이는 양자화가 필요해집니다.\nPart 2. 양자화 입문 양자화는 고비트(예: FP32) → 저비트(예: INT8) 로 정밀도를 줄이는 작업입니다. 이미지에 8가지 색만 쓰면 거칠어지듯, 정밀도 손실(granularity loss)이 발생합니다.\n일반적인 데이터 타입 타입 비트 특징 FP32 32 full-precision, 학습 기본 FP16 16 half-precision, 범위가 FP32보다 훨씬 좁음 BF16 16 FP32와 유사한 범위(가수↓, 지수↑), 딥러닝 표준 INT8 8 정수 연산, FP32 대비 1/4 비트 INT4 4 더 공격적인 압축 하드웨어에 따라 정수 연산이 부동소수점 연산보다 빠를 수 있고, 일반적으로 비트 수가 적을수록 연산이 빨라집니다.\n비트를 줄일 때 핵심은 FP32의 전체 범위를 INT8로 매핑할 필요가 없다는 점입니다. 실제 모델 파라미터의 분포 범위만 INT8로 매핑하면 됩니다.\nSymmetric Quantization — absmax 0을 중심으로 대칭 매핑. 대표 예가 absolute maximum(absmax) 양자화입니다.\n스케일 인자: s = (2^(b-1) - 1) / α, 여기서 α = max(|x|) 양자화: x_q = round(s · x) 역양자화: x = x_q / s 예를 들어 3.08과 3.02가 INT8에서 둘 다 36으로 매핑되어 구분이 사라지면, 이를 양자화 오차(quantization error) 라고 부릅니다. 비트가 줄수록 오차는 일반적으로 커집니다.\nAsymmetric Quantization — zero-point 0 기준 비대칭. zero-point 양자화가 대표적입니다. 최솟값(β)·최댓값(α)을 INT8 범위 [-128, 127]로 매핑합니다.\n스케일: s = (2^b - 1) / (α - β) zero-point z를 별도로 계산해 0의 위치를 시프트 분포가 한쪽으로 치우친 경우(예: ReLU 후 활성)에 유리 구분 Symmetric Asymmetric 0의 위치 항상 정수 0에 매핑 shift된 zero-point z 범위 [-α, α] 대칭 [β, α] 비대칭 계산 복잡도 단순 z 계산 추가 필요 적합 0 중심 대칭 분포 치우친 분포 Range Mapping과 Clipping outlier(이상치) 가 하나라도 있으면 전체 범위를 매핑할 때 작은 값들이 모두 같은 정수에 뭉개집니다. 동적 범위를 [-5, 5]처럼 임의로 잘라내는 clipping이 해법입니다 — 비-이상치의 양자화 오차는 줄지만 이상치의 오차는 커지는 트레이드오프가 발생합니다.\nCalibration — 범위 고르는 법 범위 선택 과정 자체를 calibration이라 부릅니다. 오차를 최소화하면서 가능한 많은 값을 포함하는 범위를 찾는 작업입니다. 적용 대상에 따라 방식이 달라집니다.\nWeights \u0026amp; Biases (정적): Llama 3의 ~20GB가 거의 weights입니다. bias는 수가 적어 INT16 등 고정밀 유지가 흔합니다. 캘리브레이션 방법:\n입력 범위의 percentile 수동 선택 원본–양자화 weights의 MSE 최소화 KL-divergence(엔트로피) 최소화 Activations (동적): 입력마다 변하므로 추론 중에만 알 수 있어 어렵습니다. 캘리브레이션 시점에 따라 두 가지 갈래로 나뉩니다:\nPTQ (Post-Training Quantization): 학습 후 양자화 QAT (Quantization-Aware Training): 학습 중 양자화 학습 Part 3. PTQ — 학습 후 양자화 가중치는 symmetric/asymmetric으로 그대로 양자화. 활성에는 두 방식이 있습니다.\nDynamic Quantization 입력이 hidden layer를 통과할 때마다 활성 분포를 수집하여 s, z 계산 레이어마다 다른 s, z 사용 더 정확하지만 추론 시 계산 오버헤드 증가 Static Quantization 사전에 calibration dataset으로 모든 활성 분포를 수집 추론 시 s, z를 재계산하지 않고 전역적으로 사용 빠르지만 정확도는 약간 낮음 4-bit 영역 — GPTQ vs GGUF 8비트 미만으로 가면 양자화 오차가 급격히 커집니다. HuggingFace에서 자주 보는 두 방법:\nGPTQ — GPU에서 풀모델 실행 비대칭 양자화, 레이어 단위로 독립적으로 처리 레이어 weights를 inverse-Hessian(loss의 2차 미분)으로 변환 → 각 weight의 (역)중요도. Hessian 값이 작은 weight일수록 중요 첫 행 weight를 양자화 → 역양자화 → 양자화 오차 q 계산 이 오차에 inverse-Hessian을 곱해 다른 weights에 분배(가중치 보정). 예: x_2 += q · h_2 모든 weight를 양자화할 때까지 반복 추가 트릭: Hessian dampening, lazy batching, Cholesky 사전계산 추론 속도 최적화 변형으로 EXL2 추천 weight들은 보통 서로 연관되어 있으므로, 한 weight의 양자화 오차를 관련 weights에 분배하면 네트워크의 전체 함수 형태가 보존됩니다.\nGGUF — CPU 오프로딩 llama.cpp 포맷. CPU+GPU 혼합 실행 가능 레이어 weights를 \u0026ldquo;super\u0026rdquo; 블록 / \u0026ldquo;sub\u0026rdquo; 블록으로 분할 각 sub 블록은 absmax로 양자화: W_q = round(W · s_sub) sub 블록의 scale s_sub는 super 블록의 scale s_super 로 다시 양자화 — 이중 스케일(block-wise) 양자화 2-bit / 4-bit / 6-bit 등 다양한 양자화 레벨, 일부 타입은 zero-point 조정용 최솟값 m도 함께 양자화 Part 4. QAT — 학습 중 양자화 학습 중에 \u0026ldquo;fake\u0026rdquo; quantization 노드를 삽입합니다: weights를 INT4로 양자화 → 다시 FP32로 역양자화. 모델이 양자화 노이즈를 고려하면서 학습/loss 계산/weight 업데이트를 수행합니다.\nQAT의 핵심은 손실 평면에서 \u0026ldquo;wide\u0026rdquo; minima(넓은 골짜기)를 찾도록 유도한다는 점입니다. \u0026ldquo;narrow\u0026rdquo; minima는 양자화 오차가 더 크기 때문입니다.\n시나리오 FP32에서의 손실 INT4에서의 손실 PTQ 낮음 높음 (양자화 오차 누적) QAT 약간 높음 낮음 (목표 정밀도에 적응) 즉, FP32에서는 PTQ가 더 좋아 보이지만 INT4에서는 QAT가 더 낮은 손실을 기록합니다.\nThe Era of 1-bit LLMs — BitNet 가중치를 -1 또는 1의 1-bit로 표현. Transformer의 linear layer를 BitLinear로 교체합니다.\nBitLinear 동작 단계:\nWeight 양자화: 학습 중에는 INT8로 저장, signum 함수로 1-bit화. 분포를 0 중심으로 시프트한 뒤 0 미만은 -1, 이상은 1. 평균 절대값 β를 추적 Activation 양자화: absmax로 FP16 → INT8. 최대 절대값 α 추적 Dequantization: 출력 활성을 {α, β}로 스케일 복원 모델이 클수록(\u0026gt;30B) 1-bit와 FP16의 성능 격차가 좁혀집니다. 다만 작은 모델에서의 갭은 여전히 큽니다.\nBitNet 1.58b — \u0026ldquo;All LLMs are in 1.58 Bits\u0026rdquo; 가중치를 {-1, 0, 1} 의 ternary로 확장. 가능한 상태 3개이므로 비트 수는 log2(3) ≈ 1.58 bit.\n0의 힘 — 곱셈 없는 행렬 곱 ternary 가중치는 다음 의미를 갖습니다:\n1: 더한다 0: 무시한다 (= feature filtering) -1: 뺀다 행렬 곱이 곱셈 없이 덧셈만으로 구현된다. 0의 추가는 단순한 표현력 확장이 아니라 연산 자체의 환원이다.\n양자화 방식 Weight: absmean 양자화 (절대 평균 α로 스케일 후 -1, 0, 1 중 하나로 반올림) Activation: BitNet과 동일한 absmax, 다만 [0, 2^(b-1)] 대신 [-2^(b-1), 2^(b-1)] 로 스케일 결과 \u0026ldquo;13B BitNet b1.58은 지연시간·메모리·에너지 측면에서 3B FP16 LLM보다 효율적이다.\u0026rdquo;\n정리 — 어떤 방법을 언제 쓰나 방법 비트 시점 적합한 환경 FP16/BF16 16 학습/추론 표준 GPU 학습 PTQ Static (INT8) 8 학습 후 빠른 배포, 약간의 정확도 손실 허용 PTQ Dynamic (INT8) 8 추론 시 정확도 중시, 약간의 추론 오버헤드 허용 GPTQ (4-bit) 4 학습 후 GPU 추론, Hessian 기반 보정 GGUF (2~6 bit) 2–6 학습 후 CPU/Apple Silicon, llama.cpp QAT (4-bit) 4 학습 중 정확도 우선, 재학습 비용 허용 BitNet b1.58 1.58 학습 처음부터 차세대 효율적 LLM 양자화는 \u0026ldquo;수를 더 적은 비트로 표현해 LLM을 가볍게\u0026rdquo; 만드는 기술입니다. 핵심은 두 가지로 압축됩니다:\n표현 범위 선택 — calibration이 모든 것을 결정한다 오차 보정 전략 — GPTQ의 Hessian 분배, GGUF의 block-wise 스케일, BitNet의 학습 단계 통합 미래의 LLM이 얼마나 작아질 수 있을지는 — 0이라는 글자가 알려주듯 — 양자화 자체보다 표현의 환원에 달려 있을지도 모릅니다.\n참고 자료 LLM.int8() — HuggingFace 블로그, 논문 Embedding Quantization — HuggingFace Transformer Math 101 — EleutherAI VRAM 계산기: NyxKrage Space, vram.asmirnov.xyz GPTQ 해설 YouTube Hands-On Large Language Models (Maarten Grootendorst \u0026amp; Jay Alammar) 원논문:\nFrantar, E. et al. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers, arXiv:2210.17323 (2022) Wang, H. et al. BitNet: Scaling 1-bit Transformers for Large Language Models, arXiv:2310.11453 (2023) Ma, S. et al. The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits, arXiv:2402.17764 (2024) Dettmers, T. et al. QLoRA: Efficient Finetuning of Quantized LLMs, NeurIPS 36 (2024) ","wordCount":1327,"tags":["LLM","Quantization","양자화","GPTQ","GGUF","BitNet","QAT","PTQ","FP16","BF16","INT8","INT4","llama.cpp","Maarten Grootendorst"],"categories":["AI"],"frameworks":["Quantization","Symmetric/Asymmetric Mapping","Block-wise Quantization","Quantization-Aware Training"],"mental_models":["Dynamic Range vs Precision","Quantization Error Redistribution","Wide vs Narrow Minima"],"philosophy_type":"engineering-tradeoffs","schema_type":"TechArticle","actionable":true,"priority":"high","key_points":["70B 모델은 FP32로 280GB가 필요하다 — 양자화는 모델당 비트 수를 줄여 메모리·연산을 줄이지만 정밀도 손실이 트레이드오프다","Symmetric(absmax)은 0 중심 대칭, Asymmetric(zero-point)은 min/max를 따로 매핑해 zero-point z를 둔다","Outlier가 있으면 전체 범위 매핑 시 작은 값들이 같은 정수로 뭉개지므로 clipping과 calibration(percentile/MSE/KL)이 필수","PTQ는 학습 후, QAT는 학습 중 fake quant로 양자화 노이즈를 학습 — QAT는 wide minima를 찾아 INT4 영역에서 PTQ보다 손실이 낮다","GPTQ는 inverse-Hessian으로 가중치 중요도를 가중해 양자화 오차를 다른 weights로 분배하고, GGUF는 super/sub 블록의 이중 스케일로 CPU 오프로딩을 가능하게 한다","BitNet은 weights를 {-1, 1} 1-bit로, BitNet b1.58은 {-1, 0, 1} ternary(log2(3)≈1.58 bit)로 — 0 추가는 곱셈을 덧셈으로 환원하고 feature filtering을 가능하게 한다"],"related":["posts/hidden-llm-api-costs","posts/components-of-a-coding-agent"]}