Quantization
양자화와 이진화는 기존의 신경망의 부동 소수점 수를 줄이는 데 그 목적이 있으며, 양자화 (Quantization) 의 경우 특정 비트 수만큼으로 줄 여서 계산하는 방식이다.
가령, 32 비트 소수점을 8 비트로 줄여서 연산을 수행한다. 이진화 (Binarization) 는 신경망이 가지 고 있던 가중치 (Weights) 와 층 사이의 입력을 부 호에 따라서 -1 혹은 +1 의 이진 (Binary) 형태의 값으로 변환하여, 기존의 Floating Point 를 사용 하는 신경망들에 비해 용량과 연산량을 대폭 압축 시키는 기술이다.
양자화는 모델의 가중치(파라미터)를 표현하는 데이터 타입을 정밀도가 높은 부동소수점(FP32, FP16)에서 정밀도가 낮은 정수(INT8, INT4 등)로 변환하는 기술입니다. 이 과정을 통해 모델의 크기를 줄이고, 추론 속도를 향상시키며, 에너지 효율성을 높일 수 있습니다.
쉽게 말해, 복잡하고 세밀한 숫자 표현 방식을 더 단순한 방식으로 바꾸어 계산 부담을 줄이는 것입니다. 하지만 이 과정에서 정밀도 손실이 발생하여 모델 성능이 다소 저하될 수 있는 단점이 있습니다.
B) 예시

C) Block-wise 와 Channel-wise 의 차이
“block-wise quantization”과 “channel-wise quantization”은 양자화의 적용 단위를 어떻게 나누느냐에 따른 차이입니다. 핵심적인 차이는 양자화 파라미터 (scale factor, zero point) 를 계산하고 적용하는 범위입니다.
LLM (Large Language Model) 양자화 관점에서 채널별 (channel-wise) 양자화와 블록별 (block-wise) 양자화는 양자화의 단위를 어떻게 설정하느냐에 따라 구분됩니다. 둘 다 모델의 가중치나 활성화 값을 낮은 정밀도로 변환하여 모델 크기를 줄이고 추론 속도를 높이는 것을 목표로 합니다.
1. 채널별 양자화 (Channel-wise Quantization)
-
개념: 컨볼루션 레이어나 선형 레이어에서 각 출력 채널 (또는 입력 채널) 마다 별도의 양자화 파라미터 (스케일 팩터, 제로 포인트) 를 계산하고 적용하는 방식입니다. LLM 의 경우, 주로 Fully Connected (FC) 레이어 또는 트랜스포머의 어텐션 메커니즘 내부의 가중치 행렬에 적용될 수 있습니다. 각 채널은 값의 분포가 다를 수 있으므로, 채널별로 양자화를 수행하면 전체 레이어나 텐서에 단일 파라미터를 적용하는 것보다 정확도 손실을 줄일 수 있습니다.
-
LLM 에서의 의미: LLM 의 각 레이어 내부에는 수많은 채널이 존재합니다. 채널별 양자화는 이러한 채널들의 각기 다른 통계적 특성을 반영하여 양자화를 수행함으로써 전반적인 모델 성능 저하를 최소화하려는 접근 방식입니다. 예를 들어, 특정 채널의 값들이 대부분 작고 다른 채널은 큰 값들을 가질 때, 각 채널에 맞는 스케일링을 적용할 수 있습니다.
-
고려 사항: 활성화 값의 경우, 실시간으로 값이 변하기 때문에 채널별 양자화가 더 복잡할 수 있으며, 특히 채널 간의 분산이 클 경우 행렬 곱셈 차원과 정렬되지 않아 비효율을 초래할 수도 있습니다.
2. 블록별 양자화 (Block-wise Quantization)
-
개념: 가중치 텐서를 일정한 크기의 작은 블록 (예: 32 개, 64 개 또는 128 개의 값으로 구성된 블록) 으로 나누고, 각 블록마다 독립적인 양자화 파라미터를 적용하는 방식입니다. 이는 채널보다 더 세분화된 단위로 양자화를 수행하는 것입니다.
-
LLM 에서의 의미: LLM 의 가중치 행렬은 매우 큽니다. 이러한 거대한 행렬 내에서도 값의 분포는 국부적으로 크게 다를 수 있습니다. 특히, 일부 작은 영역에 매우 큰 값 (이상치, outlier) 들이 집중될 수 있는데, 텐서 전체나 채널 전체에 대해 단일 양자화 파라미터를 사용하면 이러한 이상치 때문에 대부분의 다른 값들이 표현 범위를 제대로 활용하지 못하고 양자화 오류가 커질 수 있습니다. 블록별 양자화는 이러한 이상치의 영향을 해당 블록으로 제한하여 다른 블록의 양자화 정밀도를 유지하는 데 도움이 됩니다.
-
장점:
-
이상치 처리: 이상치가 특정 블록에 국한되도록 하여 전체적인 양자화 오류를 줄입니다.
-
정밀도 향상: 더 작은 단위로 양자화하므로 값의 분포 변화에 더 잘 적응하여 정확도 손실을 줄일 수 있습니다. 많은 최신 LLM 양자화 기법 (예: GPTQ, AWQ) 들이 블록별 양자화 개념을 핵심적으로 활용합니다.
-
-
고려 사항:
-
오버헤드: 블록 크기가 작을수록 양자화 파라미터 (스케일 팩터 등) 의 수가 증가하여 저장 공간 및 관리 오버헤드가 발생할 수 있습니다. 이를 해결하기 위해 QLoRA 같은 기법에서는 스케일링 팩터 자체를 다시 양자화 (이중 양자화, double quantization) 하기도 합니다.
-
블록 크기: 블록 크기는 중요한 하이퍼파라미터입니다. 너무 작으면 오버헤드가 커지고, 너무 크면 이상치 문제 해결 효과가 줄어듭니다.
-
주요 차이점 요약 (LLM 관점)
| 특징 | 채널별 양자화 (Channel-wise) | 블록별 양자화 (Block-wise) |
| 양자화 단위 | 출력/입력 채널 | 가중치 텐서 내의 고정된 크기의 값 블록 (예: 32, 64, 128) |
| 세분성 | 블록별 양자화보다 덜 세분화됨 | 채널별 양자화보다 더 세분화됨 |
| 이상치 처리 | 제한적 효과 | 특정 블록으로 이상치 영향 국한 가능, 효과적 |
| 정확도 유지 | 양호하나, 블록별 방식보다 이상치에 민감할 수 있음 | 일반적으로 이상치에 강인하고 정확도 유지에 더 유리할 수 있음 |
| LLM 적용 | FC 레이어, 어텐션 등에 적용. 활성화 양자화에도 고려 | 주로 가중치 행렬에 적용. GPTQ, AWQ 등 최신 기법에서 핵심적 |
| 복잡성/오버헤드 | 상대적으로 낮음 | 양자화 파라미터 증가로 인한 오버헤드 가능성 |
결론적으로, LLM 양자화에서는 모델의 거대한 크기와 가중치 분포의 복잡성 때문에 블록별 양자화가 이상치 처리에 더 효과적이고 정밀도 손실을 줄이는 데 유리하여 최근 많이 연구되고 활용되는 경향이 있습니다. 채널별 양자화도 여전히 유효한 접근 방식이며, 때로는 두 가지 방식을 혼합하거나 활성화 값에 적용하는 등 다양한 연구가 진행 중입니다.
C.1) 추가 비교
C.1.1.1) 텐서별 양자화 (Tensor-wise Quantization)
-
개념: 가장 큰 단위의 양자화 방식입니다. 전체 가중치 텐서(행렬) 하나에 대해 **단일 스케일링 팩터(scaling factor)와 제로 포인트(zero point)**를 계산하여 적용합니다.
-
장점:
- 단순함: 계산이 매우 간단하고 추가적인 오버헤드가 가장 적습니다.
-
단점:
- 낮은 정확도: 텐서 내에 값의 분포가 매우 불균일하거나 일부 극단적인 값(outlier)이 존재할 경우, 해당 이상치가 전체 스케일링 팩터를 결정하게 됩니다. 이로 인해 대부분의 다른 값들이 매우 좁은 범위에 매핑되어 정보 손실이 커지고, 모델의 정확도 저하가 심각할 수 있습니다.
C.1.1.2) 채널별 양자화 (Channel-wise Quantization)
-
개념: 텐서를 특정 차원(주로 채널)을 따라 분할하고, 각 채널마다 독립적인 스케일링 팩터와 제로 포인트를 계산하여 적용합니다. 예를 들어, 컨볼루션 레이어의 출력 채널이나 Linear 레이어의 행(row) 또는 열(column)을 기준으로 양자화합니다.
-
장점:
- 개선된 정확도: 각 채널의 데이터 분포에 맞게 양자화를 수행하므로, 텐서별 방식보다 정밀도가 높습니다. 채널마다 다른 값의 범위를 효과적으로 처리할 수 있습니다.
-
단점:
- 중간 수준의 오버헤드: 채널 개수만큼의 스케일링 팩터와 제로 포인트를 저장하고 계산해야 하므로, 텐서별 방식보다는 오버헤드가 증가합니다.
C.1.1.3) 블록별 양자화 (Block-wise Quantization) / 그룹별(Group-wise)
-
개념: 가장 세밀한 단위의 양자화 방식입니다. 가중치 텐서를 일정한 크기(예: 32, 64, 128개의 값)를 갖는 여러 개의 작은 블록(block)으로 나누고, 각 블록마다 독립적인 스케일링 팩터와 제로 포인트를 계산합니다.
-
장점:
-
높은 정확도: 양자화 단위를 매우 작게 나누어 값의 지역적 분포(local distribution)에 매우 정밀하게 적응할 수 있습니다. 특정 블록에 있는 이상치가 다른 블록에 영향을 주지 않으므로, 정보 손실을 최소화하여 원본 모델의 성능을 가장 잘 보존합니다. LLM에서 특히 효과적입니다.
-
GPTQ, AWQ와 같은 최신 LLM 양자화 기법들이 이 방식을 채택하여 좋은 성능을 보여줍니다.
-
-
단점:
- 높은 오버헤드: 가장 많은 수의 스케일링 팩터와 제로 포인트를 저장해야 하므로 메모리 오버헤드가 가장 큽니다. 또한, 양자화 및 역양자화 과정에서 더 많은 계산이 필요합니다.
C.1.2) 비교 요약표
| 구분 | 텐서별 (Tensor-wise) | 채널별 (Channel-wise) | 블록별 (Block-wise) |
| 양자화 단위 | 전체 텐서 (가장 큼) | 채널 (중간) | 작은 블록 (가장 작음) |
| 정확도 | 낮음 | 중간 | 높음 |
| 오버헤드 | 낮음 | 중간 | 높음 |
| 주요 특징 | 가장 간단하지만 이상치에 매우 취약 | 텐서별 방식의 정확도 문제를 개선 | 이상치에 강건하고, LLM과 같이 거대한 모델에서 성능 저하를 최소화하는 데 효과적 |
| 대표 기법 | 기본적인 양자화 | - | GPTQ, AWQ, QuIP |
C.1.3) 결론
양자화 방식의 선택은 정확도와 효율성 사이의 균형을 맞추는 문제입니다.
-
간단하고 빠른 양자화가 필요하다면 텐서별 방식을 고려할 수 있지만, 성능 저하가 클 수 있습니다.
-
채널별 방식은 합리적인 수준의 정확도와 오버헤드를 제공합니다.
-
최신 거대 언어 모델(LLM)에서는 성능 저하를 최소화하는 것이 매우 중요하기 때문에, 오버헤드를 일부 감수하더라도 정확도가 가장 높은 블록별 양자화가 표준적인 접근 방식으로 자리 잡고 있습니다.
D) 주요 LLM 양자화 방식
LLM 양자화는 크게 훈련 후 양자화(PTQ) 와 양자화 인식 훈련(QAT) 으로 나뉩니다. PTQ는 이미 학습이 완료된 모델을 양자화하는 간편한 방식이며, QAT는 훈련 과정에 양자화를 적용하여 성능 저하를 최소화하는 방식입니다.
최근에는 다음과 같은 다양한 양자화 기법들이 널리 사용되고 있습니다.
D.1) AWQ (Activation-aware Weight Quantization)
AWQ는 이름에서 알 수 있듯이, 모델의 가중치(Weight)뿐만 아니라 활성화값(Activation)도 함께 고려하는 양자화 방식입니다. 추론 시 특정 가중치가 모델 성능에 얼마나 중요한 영향을 미치는지(Saliency)를 활성화값을 통해 파악합니다. 중요한 가중치는 손실을 최소화하는 방향으로 양자화를 진행하고, 중요하지 않은 가중치는 과감하게 압축하여 성능 저하를 최소화하면서 메모리 사용량을 크게 줄이는 것이 핵심입니다.
- 장점: GPTQ 대비 더 큰 메모리 절감 효과와 빠른 추론 속도를 보이며, 성능 저하를 최소화합니다.
D.2) GPTQ (Generalized Post-training Quantization)
GPTQ는 대표적인 훈련 후 양자화(PTQ) 기법 중 하나입니다. 이미 학습된 모델에 적용하기 때문에 추가적인 훈련 과정 없이 빠르게 양자화할 수 있다는 장점이 있습니다.
D.3) Bitsandbytes
Bitsandbytes는 LLM을 8비트 및 4비트로 쉽게 양자화할 수 있도록 지원하는 라이브러리입니다. 이 방식의 특징은 모델의 가중치에서 성능에 큰 영향을 미치는 이상치(outlier)를 감지하여, 해당 부분은 기존의 고정밀도(FP16)로 유지하고 나머지 부분만 저정밀도(INT8)로 양자화하는 것입니다. 이를 통해 성능 저하를 최소화하면서 메모리 효율을 높입니다.
D.4) QLoRA (Quantized Low-Rank Adaptation)
QLoRA는 4비트 NF4(NormalFloat) 데이터 타입과 이중 양자화(Double Quantization)라는 두 가지 핵심 기술을 사용하여 메모리 요구 사항을 획기적으로 줄인 방식입니다. 이를 통해 단일 GPU에서도 대규모 모델을 미세조정(Fine-tuning)하는 것을 가능하게 합니다.
E) 양자화 파라매터
스케일링 팩터(Scaling Factor)와 제로 포인트(Zero Point)는 양자화의 핵심 개념으로, 부동소수점(float) 값을 정수(integer) 값으로 매핑(mapping)하고 다시 되돌리는 방법을 정의합니다.
쉽게 비유하자면, 아주 정밀한 눈금을 가진 ‘부동소수점 자’로 측정된 길이를, 눈금이 1cm 단위로만 표시된 ‘정수 자’로 표현하는 과정과 같습니다.
- 스케일링 팩터(S): ‘정수 자’의 눈금 하나가 실제 얼마의 길이를 의미하는지 알려주는 ‘축척’입니다.
- 제로 포인트(Z): ‘부동소수점 자’의 0cm가 ‘정수 자’의 어느 눈금에 해당하는지를 알려주는 ‘영점’입니다.
E.1.1) 양자화의 기본 공식
양자화는 다음의 선형 변환 공식을 통해 이루어집니다.
실제 값 (r) ≈ 스케일링 팩터 (S) × (양자화된 값 (q) - 제로 포인트 (Z))
-
r: 원래의 부동소수점 값 (예: 3.141592…)
-
S: 스케일링 팩터 (부동소수점 값)
-
q: 양자화된 정수 값 (예: 8비트 정수라면 -128 ~ 127)
-
Z: 제로 포인트 (q와 같은 데이터 타입의 정수 값)
E.1.2) 스케일링 팩터 (Scaling Factor, S)
역할: 양자화의 ‘정밀도’ 또는 ‘해상도’를 결정합니다. 즉, 양자화된 정수 값이 1만큼 변할 때 실제 값이 얼마나 변하는지를 나타내는 비율입니다.
-
계산 방법: S = (실제 값의 최댓값 - 실제 값의 최솟값) / (정수 범위의 최댓값 - 정수 범위의 최솟값)
-
예를 들어, 어떤 텐서의 실제 값(float32) 범위가 [-10.0, 6.0]이고, 이를 8비트 부호 있는 정수(int8, 범위: [-128, 127])로 양자화한다고 가정해 봅시다.
-
S = (6.0 - (-10.0)) / (127 - (-128)) = 16.0 / 255 ≈ 0.0627
-
-
의미: 이 경우, 양자화된 정수 값이 1 증가할 때마다 실제 값은 약 0.0627만큼 증가한다는 의미입니다. 스케일링 팩터가 작을수록 더 정밀한 표현이 가능합니다.
E.1.3) 제로 포인트 (Zero Point, Z)
역할: 실제 값 0.0이 어떤 정수 값에 매핑되는지를 보장하는 ‘오프셋(offset)‘입니다. 이는 원래 데이터의 값 범위가 비대칭일 때 매우 중요합니다.
-
계산 방법: 제로 포인트는 실제 값 0.0이 왜곡 없이 표현되도록 보장합니다. 위 공식에서 r = 0.0일 때의 q 값을 찾아 계산할 수 있습니다.
-
대칭(Symmetric) vs. 비대칭(Asymmetric) 양자화:
-
대칭: 만약 실제 값의 범위가 [-10.0, 10.0]처럼 0을 기준으로 완벽히 대칭이라면, 실제 값 0.0은 정수 0에 매핑하는 것이 가장 이상적입니다. 이 경우 제로 포인트(Z)는 0이 됩니다.
-
비대칭: 하지만 실제 값의 범위가 [-2.0, 6.0]처럼 비대칭인 경우, 0.0은 범위의 중앙이 아닙니다. 이 치우침을 보정해주기 위해 제로 포인트가 필요합니다. 이 경우, 실제 값 0.0이 정수 0이 아닌 다른 값(예: -64)에 매핑될 수 있으며, 이때 제로 포인트(Z)는 -64가 됩니다.
-
E.1.4) 종합 예시
어떤 텐서의 값 범위가 r_min = -2.0, r_max = 6.0이고, 이를 int8 (q_min = -128, q_max = 127)로 양자화해 보겠습니다.
-
스케일링 팩터 계산: S = (6.0 - (-2.0)) / (127 - (-128)) = 8.0 / 255 ≈ 0.03137
-
제로 포인트 계산: Z = round(q_max - r_max / S) = round(127 - 6.0 / 0.03137) ≈ round(127 - 191.25) = -64 (즉, 실제 값 0.0은 정수 -64로 표현됩니다.)
-
양자화 수행: 양자화 공식: q = round(r / S) + Z
-
r = 6.0을 양자화하면: q = round(6.0 / 0.03137) - 64 = 191 - 64 = 127 (최댓값)
-
r = -2.0을 양자화하면: q = round(-2.0 / 0.03137) - 64 = -64 - 64 = -128 (최솟값)
-
r = 0.0을 양자화하면: q = round(0.0 / 0.03137) - 64 = 0 - 64 = -64 (제로 포인트)
-
E.1.5) Tensor/Channel/Block-wise와의 관계
-
Tensor-wise: 텐서 전체에서 r_min, r_max를 찾아 단 하나의 (S, Z) 쌍을 계산합니다.
-
Channel-wise: 각 채널별로 r_min, r_max를 찾아 채널마다 고유한 (S, Z) 쌍을 계산합니다.
-
Block-wise: 각 블록별로 r_min, r_max를 찾아 블록마다 고유한 (S, Z) 쌍을 계산합니다.
이처럼 더 작은 단위로 양자화를 수행할수록 각 단위의 데이터 분포에 더 최적화된 (S, Z) 쌍을 사용하게 되므로, 정보 손실이 줄어들어 정확도가 높아지는 것입니다.