양자화(Quantization)는 모델 가중치나 계산 결과를 32비트 부동소수점(float32) 대신 8비트 정수(int8)나 4비트처럼 더 적은 비트로 표현하는 것이다. 값의 범위를 정해진 개수의 구간(8비트면 256개)으로 나누고, 각 값을 가장 가까운 구간 번호로 바꾼다. 모델 파일이 작아지고 메모리와 계산이 줄어드는 대신 반올림한 만큼 정확도를 잃는다. 실수 표현의 기본은 부동소수점 (IEEE 754)에 있다.
어디에 쓰나
- 모델 가중치: 브라우저나 휴대폰에서 모델을 돌릴 때 사실상 필수다. EmbeddingGemma 2의 텍스트 모델은 fp32에서 약 1.1GB, fp16에서 약 540MB, q4에서 약 175MB다(ONNX 모델 카드 기준)
- 임베딩 벡터 저장: 검색용 벡터를 float32 대신 int8로 저장하면 4배 작아진다. 한 가지 방법은 벡터마다 최대 절댓값(scale)을 함께 저장해 두고, 읽을 때
값 / 127 × scale로 되돌리는 것이다. 텍스트 임베딩의 차원 줄이기와 함께 쓰면 효과가 곱해진다
표기 읽기
ONNX 모델 저장소에서 자주 보이는 이름이다(transformers.js 기준).
| 표기 | 뜻 |
|---|---|
| fp32 | 원래 정밀도 |
| fp16 | 16비트 실수(크기 절반) |
| q8 (quantized) | 8비트 정수 가중치 |
| q4 | 4비트 가중치 |
| q4f16 | 4비트 가중치, 나머지는 16비트 실수 |
비트를 줄일 때 생기는 일
- 품질 저하는 균일하지 않다. 이 사이트에서 생성 모델 Gemma 4 E2B의 모바일판(일부 층을 2비트로 줄인 판)을 써 보니 한국어 답변에 다른 언어 글자가 섞이고 문장을 끝맺지 못했다. 4비트판은 자연스러웠다. 작게 줄일수록 결과물을 직접 확인해야 한다
- 실행 환경이 연산을 지원해야 한다. 양자화 모델은 전용 연산자를 쓴다. 런타임 백엔드가 그 연산을 구현하지 않으면 모델을 아예 올리지 못한다. 이 사이트에서도 브라우저 wasm 백엔드에서 이 오류를 만났고, WebGPU 백엔드에서는 동작했다
- 학습할 때부터 양자화 오차를 흉내 내며 학습하는 방식(Quantization-Aware Training, QAT)은 학습 뒤에 줄이는 방식(Post-Training Quantization, PTQ)보다 보통 손실이 적다. 위의 모바일판도 QAT를 거쳤지만, 긴 한국어 문단을 요약하기에는 모자랐다
출처: Quantize ONNX models ONNX Runtime · Quantization Hugging Face Optimum · embeddinggemma-2-ONNX 모델 카드 · Gemma 4 QAT 모바일 모델 카드 Google