160GB 모델을 노트북에서 최소 손실로 실행하는 LLM 양자화 기술
Qwen-3-Coder-Next와 같은 800억 파라미터 모델은 메모리에 159.4GB를 차지합니다. 양자화는 모델 크기를 4배 줄이고 추론 속도를 2배 높이며, 품질 저하가 단 5~10%에 그칩니다. 이 덕분에 일반 소비자용 하드웨어에서도 대규모 LLM을 원활하게 실행할 수 있으며 성능도 크게 훼손되지 않습니다.
파라미터와 모델 크기의 관계
파라미터는 신경망 내 가중치를 의미하며, LLM의 메모리 사용량을 결정합니다. 각 파라미터는 부동소수점 숫자로 저장됩니다. 가장 간단한 형태는 입력값에 가중치를 곱해 출력을 만드는 것입니다. 실제 모델은 수백 개의 레이어와 수천 개의 노드를 가지며, 결과적으로 수십억 개의 파라미터가 됩니다.
예를 들어, 입력 2개, 3층 × 4노드, 출력 2개인 네트워크는 총 64개의 파라미터를 가집니다. 이를 수십만 개의 노드로 확장하면 조각조각 트릴리언(조) 수준의 가중치가 발생합니다. 인기 있는 모델의 히스토그램을 보면, 99% 이상의 값이 0에 매우 가까운 범위 [-0.5, 0.5]에 집중되어 있습니다.
메모리 내 숫자 표현 방식
컴퓨터는 float32 형식으로 데이터를 저장합니다: 부호 비트 1개, 지수 비트 8개, 가수 비트 23개. 범위는 ±3.4×10³⁸이며, 정밀도는 약 7자리입니다. 분포는 불균형하며, 0 근처에 밀집하고 극단부는 희박합니다. 이는 LLM의 가중치가 작다는 점과 잘 맞습니다.
float16: 1+5+10 비트, 정밀도 3~4자리, 범위 ±65,504. bfloat16(1+8+7): 광범위한 범위, 정밀도 2~3자리. float8/float4는 실험적 형식으로, 가수 비트는 3~4개입니다.
사인파 근사 비교: float32는 매끄럽지만, float4는 계단처럼 보이며 눈에 띄는 오차가 발생합니다.
양자화의 핵심 원리
양자화는 손실 압축 기법으로, 실수를 더 작은 값 집합으로 매핑합니다. bfloat16에서 float4로 단순 반올림(가장 가까운 정수로 반올림)을 수행하면 모델이 깨집니다. 왜냐하면 가중치가 0이 되고 출력도 0이 되기 때문입니다. 이유는 float4의 범위 [-3,3]가 일반적인 가중치 범위 [-0.89,0.16]와 맞지 않기 때문입니다.
대칭 양자화
데이터를 정수 범위로 스케일링합니다. 공식: scale = max_abs / (2^(bits-1) - 1). 양자화: round(value / scale), 복원: quantized * scale.
JavaScript 예제 코드:
function quantize({ values, bits }) {
const vmax = Math.max(...values.map(Math.abs));
const qmax = 2 ** (bits - 1) - 1;
const scale = vmax / qmax;
return {
values: values.map((v) => Math.round(v / scale)),
scale,
};
}
function dequantize({ values, scale }) {
return values.map((v) => v * scale);
}
values = [-0.89, 0.16, 0.08, -0.13, 0.16, -0.54], bits=4 일 때:
- 양자화된 값: [-7,1,1,-1,1,-4], scale≈0.127
- 복원된 값: [-0.89,0.127,0.127,-0.127,0.127,-0.509]
- 평균 오차: 18%
4비트 양자화 후 모델 출력은 원본 대비 30% 정도 편차를 보이지만, 메모리 사용량은 4배 줄어듭니다.
비대칭 양자화
대칭 양자화를 개선하기 위해 최솟값과 최댓값을 별도로 처리합니다. 범위 [min, max]를 [qmin, qmax]로 매핑합니다. 공식:
- offset = min
- scale = (max - min) / (qmax - qmin)
- quantized = round((value - offset) / scale)
비대칭 데이터(음수 값이 많을 경우)에 특히 유리합니다. 양수 쪽 공간 낭비 없이 효율적으로 메모리를 활용할 수 있으며, 평균 오차는 5~10%까지 감소합니다.
텐서에 적용 시, 채널별 또는 그룹별(그룹당 양자화)로 수행하면 활성화 오차를 최소화할 수 있습니다.
양자화 후 품질 평가 방법
검증 데이터셋에서 퍼플렉시티를 측정하거나, 작업별 지표(BLEU, ROUGE 등)를 활용합니다. 벤치마킹 결과:
- Qwen-3-Coder-Next 4비트: FP16 대비 +7% 퍼플렉시티 증가
- 속도: 텐서 코어 없는 GPU에서 2배 향상
| 형식 | 크기(GB) | 퍼플렉시티 | 속도(토큰/초) |
|--------|-----------|------------|--------------------|
| FP16 | 159.4 | 1.00 | 1.0 |
| INT8 | 39.8 | 1.05 | 1.8 |
| INT4 | 19.9 | 1.09 | 2.1 |
핵심 요약
- 양자화는 재학습 없이 모델 크기를 4~8배 줄일 수 있습니다.
- 대칭 데이터에는 대칭 양자화, 비대칭 분포에는 비대칭 양자화를 사용하세요.
- 그룹당 128개 요소를 기준으로 그룹별 양자화를 적용하면 정확도와 속도의 균형이 잘 잡힙니다.
- llama.cpp, bitsandbytes 등에서는 기본적으로 INT4/INT8 지원이 가능합니다.
- 최종 작업(코딩, 질의응답 등)에서 반드시 테스트를 진행하세요.
— Editorial Team
아직 댓글이 없습니다.