Technology
일반적으로 크기가 큰 고성능 AI 모델을 서버 대비 하드웨어 리소스가 제약된 Edge에서 구동하기 위해서는 모델의 정확도 손실을 최소화하면서 가볍고 빠르게 만드는 AI 모델 경량화 기술이 필수적인데요. 이번 게시물에서는 가장 대표적인 경량화 기술인 Quantization(양자화) 기술에 대해 알아보도록 하겠습니다.
Sungmin Woo
2025년 6월 10일
안녕하세요. 에너자이 사업개발팀 우성민(Sungmin Woo)입니다. 지난 게시물에서도 간단히 소개드렸지만 자동차, 스마트폰, 로봇, 가전제품 등 다양한 디바이스에 AI 모델이 적극적으로 도입되는 추세이며, 이로 인해 Edge에서 고성능 AI 모델을 On-device로 구동하기 위해 필요한 기술들에 대한 관심 또한 커지고 있습니다.
일반적으로 크기가 큰 고성능 AI 모델을 서버 대비 하드웨어 리소스가 제약된 Edge에서 구동하기 위해서는 모델의 정확도 손실을 최소화하면서 가볍고 빠르게 만드는 AI 모델 경량화 기술이 필수적인데요. 이번 게시물에서는 가장 대표적인 경량화 기술인 Quantization(양자화) 기술에 대해 알아보도록 하겠습니다.
Quantization이란?
딥러닝에서 Quantization은 모델의 가중치(weight) 또는 활성값(activation)을 더 낮은 비트수로 표현하여 메모리 사용량 및 연산량을 줄이는 기법입니다. Pytorch, Tensorflow를 비롯한 대부분의 머신러닝 프레임워크에서는 데이터를 32비트 부동소수점(FP32) 형식으로 표현하는데요. FP32 모델의 경우 매우 넓은 수치 범위를 표현할 수 있기 때문에 정밀도가 높다는 장점이 있지만, 메모리 사용량이 크고 연산량이 늘어난다는 단점이 있습니다. 최근에는 학습에 소요되는 시간 및 비용을 절감하기 위해 FP16 형태로 모델을 학습하거나, FP16과 FP32를 모두 사용하는 Mixed Precision Training 개념도 도입되는 추세입니다. 부동소수점 표현 방식에 대한 구체적인 내용은 아래 링크 참고 부탁드립니다.
Optimium 탐구(4) - Mixed Precision Inference
일반적으로 Quantization은 FP32 → INT8 변환을 뜻하는 경우가 많은데요. 단순 계산으로도 메모리 사용량을 4배 가량 절감할 수 있으며(실제로는 weight만 Quantize하는 경우도 많고, Quantization 과정에서 Scale factor, Clipping value 등 추가로 저장되는 값들이 생기기 때문에 메모리 절감 폭은 4배보다 적을 수 있습니다), 그 외에도 추론 속도 및 전력 효율성 측면에서도 큰 이득을 얻을 수 있습니다. 특히, 대부분의 NPU들이 INT8(또는 더 낮은 비트 정수) 연산을 중심으로 설계되어 있기 때문에 NPU에서 AI 모델을 구동하기 위해서는 Quantization이 필수적입니다. 최근에는 거대 언어 모델(LLM)을 효율적으로 활용하기 위해 INT4, INT2 등 더 낮은 비트로의 Quantization에 대한 연구도 활발히 진행되는 추세입니다.

Source: Advances in the Neural Network Quantization: A Comprehensive Review
Quantization은 이처럼 매우 유용하지만, 표현할 수 있는 수치의 범위가 좁아지기 때문에 필연적으로 어느 정도의 정확도 손실을 동반할 수밖에 없는데요. 관련 연구가 활발해지면서 다양한 Quantization 방법론들이 등장하고 있지만, 공통적인 목표는 이러한 정확도 손실을 최소화하는 것이라고 볼 수 있습니다.
Quantization 방법론
Quantization에서 정확도 손실과 메모리 절감 및 속도 향상의 Trade-off를 고려하여 몇 bit까지 낮출 것인지 결정하는 것도 중요하지만, 모델의 특성 및 데이터 분포를 고려하여 적합한 방식을 선택하는 것 또한 필요한데요. 대표적인 방법론들에 대하여 간략히 정리하였으니 참고 부탁드립니다.
Uniform vs non-Uniform

Source: INTEGER QUANTIZATION FOR DEEP LEARNING INFERENCE
Quantization은 실수값을 균일한 간격(Step size)으로 정수에 매핑하는 Uniform quantization과 값에 따라 간격이 다르게 설정되는 Non-uniform quantization으로 구분됩니다.
Uniform Quantization은 Scale factor(실수 범위를 정수 범위로 매핑하는데 사용되는 배율 계수) 하나로 변환이 가능하기 때문에 구현이 쉽고, 일반적인 CPU/GPU 환경에 배포할 때도 유리해 일반적으로 많이 사용되는 방식인데요. 선형 변환의 성격을 띠므로 Linear Quantization이라고 하기도 합니다.
Non-uniform Quantization은 가중치의 분포를 고려하여 Step size를 설정하는 방식으로, 값이 몰려 있는 구간을 더 정밀하게 표현하도록 설계할 수 있기 때문에 더 효과적으로 정확도 손실을 방지할 수 있습니다. 대표적으로, Log scale을 사용하는 Log Quantization을 들 수 있는데요. 실수값의 대부분이 0 근처에 분포할 경우 효과적인 방식이 될 수 있습니다. 다만 별도의 LUT(Lookup Table)이나 커스텀 로직이 필요하기 때문에 구현이 어렵다는 단점이 있습니다.

Source: Weighted-Entropy-based Quantization for Deep Neural Network
Symmetric vs Asymmetric
일반적으로 Uniform Quantization에서는 아래와 같은 형태의 Affine 변환을 사용하여 실수값을 정수 공간으로 매핑합니다.
x_q = round(x/S + Z)
x_q: 실수값 x에 대응되는 Quantized output
S: Scale factor. [2.6] 범위 내 실수를 [0,255] 범위 내 정수로 매핑하려고 한다면 Scale factor=(6–2)/255 = 0.0157
Z: Zero-point. 실수 0에 대응되는 정수값으로, Zero-point를 통해 입력 데이터의 분포를 고려하여 양자화 수행 가능
다만, 입력되는 실수 데이터 범위와 매핑되는 정수 범위가 모두 대칭적인 형태를 이룰 경우(ex. [-5,5] 범위 내 실수를 [-127,127]로 매핑)에는 입력 데이터 내 실수 0이 정수 0과 정확히 대응되므로, Z=0이 되는데요. 이러한 경우를 데이터 범위가 대칭적일 때 사용하는 방식이라고 해서 Symmetric Quantization, Zero-point를 활용하여 입력 데이터와 매핑되는 정수 공간의 영점을 맞추는 방식을 Asymmetric Quantization이라고 부르기도 합니다. Symmetric Quantization의 경우 연산이 간단해지기 때문에 더욱 빠르고 효율적이라는 장점이 있지만, Asymmetric Quantization에 비해 범용성은 떨어지는 편입니다.

Source: A Survey of Quantization Methods for Efficient Neural Network Inference
Granularity
Granularity란 Quantization parameter를 부여할 때 얼마나 세분화하여 부여할 지에 대한 척도를 뜻합니다. 세분화된 단위로 Quantization을 수행할 수록 정확도 손실은 줄일 수 있지만, 기대할 수 있는 메모리 및 Latency 절감 폭은 줄어들게 됩니다. (연산이 복잡해지고, 저장해야 하는 Quantization parameter가 늘어나기 때문에)
Per-tensor: Weight 또는 Activation tensor 전체에 하나의 Scale/Zero-point를 사용하는 방식
Per-channel(or Per-group): Tensor를 구성하는 Channel 또는 Group마다 Scale/Zero-point를 다르게 설정하는 방식

Source: Hugging Face
PTQ vs QAT
Quantization에서 고려해야 하는 또 다른 중요한 요소들 중 하나는 모델 학습 단계에서 Quantization을 고려할지 여부인데요. 추가적인 학습 없이 Pre-trained 모델에 대해 Quantization을 수행하는 방식을 Post-Training Quantization(PTQ), 학습 단계에서부터 Quantization으로 인해 발생하는 오차를 반영하는 Quantization-Aware Training(QAT)라고 합니다.
PTQ는 추가적인 학습을 필요로 하지 않기 때문에 신속하고 효율적인 Quantization이 가능하다는 것이 특징이며, Quantization이 이루어지는 시점에 따라 다시 Dynamic quantization과 Static quantization으로 구분됩니다. Scale factor를 결정하기 위해서 입력되는 실수 데이터의 범위(Clipping range)를 결정하는 과정을 Calibration이라고 하는데요. Weight의 경우 Quantization을 수행하는 시점에 일괄적으로 Calibration을 수행해도 아무 문제가 없지만, Activation의 경우 입력 데이터에 따라 값이 변화하기 때문에 실행 시점(런타임) 이전에는 정확한 Range를 도출하기 어렵습니다.
Dynamic quantization이란 모델이 실행되는 시점에 Input 데이터를 기반으로 Activation에 대한 Quantization parameter를 설정하여 Quantization을 수행하는 방식을 의미합니다. Input 데이터에 따라 Activation이 큰 폭으로 변화하는 경우 효과적으로 정확도를 보존할 수 있지만, Quantization parameter를 구하기 위한 연산을 추가로 수행해야 하기 때문에 추론 속도가 느려질 수 있다는 단점이 있습니다.

Source: https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization
Static quantization이란 Calibration 데이터셋(추론 단계에서 모델에 들어올 입력 데이터와 분포가 유사한 데이터셋)을 모델에 입력하여 도출된 Activation 값들을 기반으로 Range를 정하고, 해당 Range를 기반으로 설정된 Quantization parameter를 사용하는 방식입니다. 추론 단계에서 Quantization을 위한 추가적인 연산 Overhead가 없다는 장점이 있지만, 별도의 Calibration 데이터셋이 필요하고 Activation 분포 예측이 잘못될 경우 정확도가 크게 저하될 수 있다는 것이 아쉬운 점입니다.

Source: https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization
💡 Clipping range를 결정하는 대표적인 Calibration technique
1. Min-Max: 입력 데이터에서 가장 작은 값과 가장 큰 값 기준으로 설정. 가장 구현이 용이하나, Outlier에 민감
2. Percentile: 입력 데이터의 상하위 특정 %만큼 제외하는 방향으로 설정(ex. 0.1%~99.9%만 사용)
3. Entropy (KL-divergence): FP32 값과 Quantized 된 값의 차이를 최소화하는 방향으로 설정
QAT는 AI 모델의 학습 단계에서 Quantization으로 인해 발생하는 오차를 Simulate하기 위해 Fake quantization이라고 하는 방법을 사용하는데요.

Source: https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization
Fake quantization이란 Weight 및 Activation에 대해 가상으로 Quantization을 수행하여 그로 인해 발생하는 오차를 손실 함수에 포함시키는 방식으로, Quantization으로 인해 발생하는 오차를 최소화하는 방향으로 학습되기 때문에 PTQ에 비해 정확도가 잘 보존된다는 장점이 있습니다. 주목할 만한 부분은 어디까지나 ‘가상의’ Quantization이라는 점인데요. 학습 단계에서 저장될 때는 Weight 및 Activation 모두 다시 FP32로 복원되어(Dequantize) 저장되며, 이를 통해 역전파 시 손실 함수에 대한 정확한 Gradient를 구해 성공적으로 Weight를 업데이트할 수 있습니다.
QAT의 또 다른 특징은 손실 함수가 최소화되는 지점을 찾을 때 기울기가 완만한 Wide minima로 수렴하게 된다는 점입니다.

Source: https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization
위 그림에서 만약 Quantization을 고려하지 않고 학습을 진행할 경우, Weight의 변화에 따른 Loss의 변화 폭이 큰 Narrow minima 값으로 Weight가 업데이트될 가능성이 높은데요. 이러한 상황에서 Quantization을 진행할 경우 Weight가 조정되면서 Loss가 급격히 커지기 때문에 큰 규모의 Quantization error가 발생하게 됩니다. 반면에, Wide minima가 선택될 경우 Weight가 조정되어도 Loss가 증가하는 폭이 작기 때문에 Quantization error를 최소화할 수 있습니다.

Source: https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization
따라서, 정확도 손실을 최소화하면서 Quantization을 수행하려고 한다면 상대적으로 QAT가 PTQ보다 유리하며, 이러한 경향성은 Low-bit로 갈수록 더욱 강해진다고 볼 수 있습니다. 다만, QAT의 경우 학습 과정이 매우 복잡해 시간이 오래 걸리고 많은 연산 자원을 필요로 한다는 단점이 있습니다.
Emerging trend: Low-bit Quantization
전통적으로 Quantization은 INT8 변환을 의미했지만, 오늘날 막대한 메모리 및 연산량을 필요로 하는 LLM의 보급이 빠르게 확산되면서 INT4, INT2 등 더 낮은 Bit로의 Quantization에 대한 수요가 늘어나고 있는데요. 정밀도(Precision)가 낮아질수록 Quantization error가 가파르게 증가하기 때문에 모델의 성능을 보존하기 위해서는 QAT가 적절한 방식이지만, 학습의 난이도가 매우 높기 때문에 오늘날에는 4bit 이하에서 정확도 손실을 최소화하기 위한 PTQ 방법론들에 대한 연구 또한 활발히 이루어지고 있습니다.
GPTQ
GPTQ는 4bit Quantization을 수행할 때 가장 보편적으로 사용되는 방식들 중 하나인데요. 기본적으로 각 Layer에 대해 독립적으로 수행되는 Layer-wise quantization입니다.

Source: https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization
GPTQ에서는 각 Weight들의 중요성(해당 Weight가 모델의 성능에 미치는 영향)을 평가하기 위해 Inverse Hessian을 활용합니다. Hessian은 손실 함수를 두 번 미분해서 도출되는 값으로, 각 Weight에 대한 곡률을 나타내는데요. Inverse Hessian의 경우 작을수록 모델 성능에 큰 영향을 주는 중요한 Weight라고 볼 수 있습니다.

Source: https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization
GPTQ에서 주목할 만한 부분은 특정 Weight를 Quantization했을 때 발생하는 Error가 다른 Weight들에 미치는 영향을 고려하여 Weight 값들을 업데이트한다는 점인데요. 구체적으로는 각 Weight에 대해 발생한 Quantization error를 다른 Weight 값들에 재분배하되, 이 때 Inverse Hessian 값으로 Error를 가중평균하여 Weight의 중요성을 고려합니다. 즉, 중요한 Weight는 적게 조정하고 상대적으로 중요성이 떨어지는 Weight는 크게 조정하는 식으로 전체 Layer의 Overall Quantization Error를 최소화하게 되는 것이죠.
GGUF
GGUF란 인공지능 모델(특히 LLM)을 GPU뿐만 아니라 CPU를 포함한 다양한 하드웨어에 효율적으로 배포하기 위해 개발된 파일 포맷으로, 다양한 Quantization 방식을 지원합니다. 즉, 특정 모델을 GGUF로 저장할 때 필요에 따라 모델의 Weight를 여러 방식으로 Quantize하여 저장 가능하며, 일반적으로 Q4_K, Q8_0와 같은 형식으로 저장됩니다.

Source: Hugging Face
위 그림에도 나오는 Q4_K_M을 예시로 GGUF 모델들이 어떻게 명명되는지 알아보도록 하겠습니다.
Q4: 4bit로 Quantize된 모델
K: K-Quant 방식으로 Quantize된 모델. Weight를 일정 개수의 Block으로 구분하고, Block마다 다른 Scale을 적용하여 Quantization 수행. Q4_0과 같이 이 부분에 K가 아니라 0이나 1이 위치할 경우 하나의 Scale로 단순 Quantize된 모델임을 의미.
M: Quantization 목적으로 실수 Weight를 정규화할 때 각 Block의 평균을 사용한 모델. Q4_K_S와 같이 M이 아니라 S가 위치할 경우 블록 내 표준편차를 기준으로 정규화를 수행했다는 의미.
AWQ
Weight를 Quantize할 때 Activation의 영향까지 고려하여 Quantization error를 최소화하는 방식으로, 일부 중요도가 높은 Weight들은 부동소수점(FP) 형태로 유지하여 원본 모델의 성능을 보존하는 것이 특징입니다.

Source: AWQ: Activation-aware Weight Quantization for On-Device LLM Compression and Acceleration
위 그림은 FP16 언어 모델을 Quantize했을 때 발생하는 성능 손실(Perplexity, 언어 모델의 예측 능력을 평가하는 지표로 낮을수록 우수한 성능)을 나타낸 것인데요. 전체 Weight를 단순 반올림(RTN, Round to Nearest)했을 때 성능이 급격히 떨어졌지만, 일부 Channel의 FP 값을 보존하는 것만으로 기존 모델의 성능이 보존되는 것을 확인할 수 있습니다.
What’s next: Below 4-bit
위에서 소개 드린 것처럼 GPTQ, AWQ 등 정확도 손실을 최소화하면서 효율적으로 Low-bit Quantization을 수행할 수 있는 방법론들에 대한 연구가 활발하게 이루어지고 있습니다. 그러나 현존하는 대부분의 PTQ 방법론들은 4 bit까지는 준수한 성능을 보여주지만, 그보다 낮은 Precision에서는 급격한 성능 저하로 인해 활용하기 어려운 상황인데요.
그렇기 때문에 현존하는 4 bit 미만의 Extreme low-bit 모델들은 대부분 학습 단계에서부터 Low-bit 연산에 최적화된 구조로 설계된 모델들이며, 최근 마이크로소프트가 공개한 BitNet b1.58 2B4T도 기존의 High precision 선형 연산 Layer들을 ‘BitLinear’라는 자체 개발 1.58bit 연산 Layer들로 대체한 것이 핵심입니다.

Source: Microsoft
위 그림에서 BitNet b1.58 모델이 유사한 크기의 언어 모델들에 비해 추론 속도, 메모리/전력 효율성 측면에서 압도적으로 뛰어나다는 것을 확인할 수 있는데요. 그럼에도 불구하고 현재 이와 같은 Extreme low-bit 모델들이 본격적으로 활용되지 못하고 있는 이유는 학습의 난이도가 매우 높을 뿐만 아니라, 4 bit 미만 연산을 지원하는 추론 Backend가 부재하기 때문입니다.
에너자이는 최근 차세대 AI 추론 엔진 Optimium을 활용하여 학습 단계에서부터 자체적으로 개발한 1.58 bit Whisper Small 모델을 Arm 기반 SoC에서 구동하는데 성공했는데요. 추후에도 AI 경량화 및 최적화 분야 지속적인 연구개발을 통해 더 다양한 Low-bit 모델들(LLM, VLM 등)을 On-device 구동 가능한 형태로 구현할 계획입니다. 에너자이 팀이 개발한 1.58 bit Whisper 모델에 대한 보다 자세한 내용은 별도의 게시물에서 다룰 예정이니 많은 관심 부탁드립니다.