[AI System] Model Quantization

"Model Quantization"

[Model Quantization]

· 일반적으로 Weight는 32-bit Floating Point로 저장 (각 Weight마다 32-bit 필요)
→ Quantization으로 각 Weight를 정수형으로 Mapping하여 정수형 행렬을 사용

△ 메모리 절약 : 데이터를 저장하는 데 필요한 Bit 수가 줄어들기 때문에 저장 공간 절약 가능
△ 연산 절약 : 항상 그런 것은 아니지만, 부동소수점 연산보다 가벼운 정수형 연산을 사용하여 필요한 연산량 감소

[Data Type]

▣ Integer
> Unsigned Integer
· 음수 없이 0과 양수만을 표현
· n-bit → [0, 2n - 1]

> Signed Integer
· 최상위 Bit를 부호 Bit로 사용 (0 : 양수 / 1 : 음수)
· n-bit → [-2n - 1 + 1, 2n - 1 - 1]
· 000 … 000, 100 … 000 모두 0을 의미

> Two's Complement Integer
· n-bit → [-2n - 1, 2n - 1 - 1]
· 000 … 000 = 0
· 100 … 000 = -2n - 1

▣ Fixed-Point Number
· 정수 형태의 데이터 구조에서 소수점의 위치를 미리 고정해 두고 Bit를 이동시켜 소수점 이하의 자리를 표현
· {Sign Bit, Integer, Fraction}으로 구성
· 2의 보수 표현법 사용 가능

△ Floating-Point보다 단순
▼ 표현 가능한 범위와 정밀도에 제한

▣ Floating-Point Number
· {1-bit(Sign) + 8-bit(Exponent) + 23-bit(Fraction)}으로 구성


> Exponent Bit가 모두 0
· (-1)Sign x (1 + Fraction) x 2Exponent - 127 대신 (-1)Sign x Fraction x 2Exponent - 127 사용

· Fraction도 모두 0인 경우, Sign Bit와 상관없이 모두 0

> Exponent Bit가 모두 1
· Fraction Bit가 모두 0인 경우 : 부호에 따라 +∞ / -∞

· Fraction Bit가 하나라도 0이 아닌 경우 : Nan(Not a Number)

△ Exponent Bit : 넓은 범위 표현 가능
△ Fraction Bit : 값의 정밀도 조절 가능

· IEEE FP32 : 1-bit(Sign) + 8-bit(Exponent) + 23-bit(Fraction) = 32-bit
· IEEE FP16 : 1-bit(Sign) + 5-bit(Exponent) + 10-bit(Fraction) = 16-bit
· BF16 : 1-bit(Sign) + 8-bit(Exponent) + 7-bit(Fraction) = 16-bit
· E4M3(FP8) : 1-bit(Sign) + 4-bit(Exponent) + 3-bit(Fraction) = 8-bit
· E5M2(FP8) : 1-bit(Sign) + 5-bit(Exponent) + 2-bit(Fraction) = 8-bit

[Quantization Method]

▣ K-Means Quantization
· Weight 값을 K개의 Cluster로 묶고, 각 Cluster의 Centroid로 Weight를 대표 → 각 Weight는 가장 가까운 Centroid에 배정
    (Ex. K = 4 → Centroid = 4개 → 각 Weight는 4개 중 하나를 가리키면 되므로 log24 = 2-bit만 필요)

① K개의 Centroid를 무작위로 설정
② 각 데이터 Point를 가장 가까운 Centroid에 배정
③ 각 Cluster의 평균을 다시 Centroid로 설정
④ 데이터 배정이 더 이상 바뀌지 않을 때까지 반복

△ 32-bit Weight들이 2-bit 정수 Index로 변환되며 엄청난 용량 이득 발생
▼ 원래 값과 Centroid 사이의 차이인 Quantization Error 발생

> K-Means Clustering Background
· 일반 K-Means는 2차원 데이터도 Clustering 가능
→ Weight Quantization에서는 각 Weight 값이 하나의 숫자이므로 1차원 값들에 K-Means 적용
→ K 값이 달라지면 Cluster 개수와 Centroid가 달라지므로 양자화 결과도 달라짐

> 저장 공간 비교

<Parameter 개수 : M개, Centroid 개수 : K개 → 각 Weight Index : log2K(=N)-bit>
 - 기존 용량
· 각 Weight가 32-bit Float
    → 32M-bit 필요

 - 양자화 후 용량
· 각 Weight 자리에 Index(N-bit)를 저장할 공간(MN)과, 32-bit로 저장해야 하는 K개의 Centroid 값 저장 공간 필요
    → MN + 32 x K-bit 필요

> 성능 비교
· Model 크기를 많이 줄일수록 정확도 손실↑
→ 단일 기법보다 Pruning + Quantization이 더 작은 Model 크기에서도 정확도 손실↓

> 추론 시 동작
 - In Storage 상태
· 저장할 때는 실제 Weight 전체를 저장하지 않고, 2-bit 정수 Cluster Index와 Centroid Table을 저장

 - During Computation 상태
· 실제 연산이 일어나는 추론 시 Cluster Index를 Centroid 값으로 변환해서 32-bit Floating Point 형태로 Weight를 복원한 후 계산

∴ 저장 공간은 감소하지만, 실제 계산과 메모리 접근은 여전히 Floating-Point 연산 → 무거움

▣ Linear Quantization
· 32-bit Float Weight를 작은 Bit-Width(2-bit)의 Integer로 바꾸고, 다시 복원할 때는 Shift 값(-1)과 Scale 값(1.07)을 이용하여 복원
· 추론 중 저장되는 것은 32-bit Float Weight가 아니라 Quantized Weights, Shift, Scale
    = 32-bit Float Weight 전체를 저장하지 않고, 작은 정수 Weight와 복원에 필요한 Parameter만 저장

 - 기존 용량
· 각 Weight가 32-bit Float
    → 32M-bit 필요

 - 양자화 후 용량
· 각 Weight 자리에 Index(N-bit)를 저장할 공간(MN)과, 정수형 Shift(N-bit), Scale(32-bit) 저장 공간 필요
    → MN + N + 32-bit

△ 작은 정수 Weight와 Shift, Scale만 저장하면 되므로 Inference 단계에서 저장 공간 크게 감소

> Architecture
 - Quantization Process
· Original Float Weight(W)를 Quantized Integer Weight(q)로 변환

 - Reconstruction Process
· Quantized Integer Weight(q)를 다시 Float Weight(W')으로 복원
    → W와 W'이 최대한 비슷하게 만드는 것이 목표

> Reconstruction Process
· Quantized Integer Weight(q) → Reconstructed Weight(W')
· 정수 공간에서 일정 간격으로 배치된 값들이 Scale(S)에 의해 Float Weight 공간의 일정 간격 값들로 대응
→ 원래 Weight로 유사하게 복원하여 추론 시 안정적인 예측 가능

> Quantization Process
· Original Float Weight(W) → Quantized Integer Weight(q)
· round를 통해 Float Weight를 이용해 계산된 실수 값을 반올림하여 정수로 변환
→ 추론 시 Model의 저장 용량 절약

> Designing Shift(Z) & Scale(S)
Wmin = (qmin - Z)S  &  Wmax = (qmax - Z)S

    · Ex)

· Linear Quantization을 잘 적용하면 Weight뿐만 아니라 Input도 정수로 표현 가능
    → Integer Operation을 사용해 계산량 감소 가능

[Quantization-Aware Training]

· K-Means/Linear Quantization은 보통 학습이 끝난 후 적용 = Post-Training Quantization → Model 성능 저하

> Fine-Tuning Quantized Model
· 각 Weight가 어떤 Centroid에 속하는지에 대한 Cluster 구조는 그대로 유지하고, 학습을 통해 Centroid 값만 Update
→ 저장 구조는 유지하면서 Quantization Error↓

** K-Means Quantization뿐만 아니라 Linear Quantization도 적용 가능, But, 설명하기 어려움

> QAT(Quantization-Aware Training)
① 학습 중 Forward 단계에 Quantization 효과를 적용(Fake Quantization)하여 Loss 계산
    (W : Original FP32 Weight / Q(W) : Quantization된 Weight / a : Activation or Input / z : Layer Output)
② Backward 단계에서 Integer 사용으로 Gradient를 전달하지 못하므로 STE(Straight-Through Estimator)로 Gradient 통과
③ 실제 Update는 FP32 Weight(W)에 적용

· 학습 중 모델이 Quantization Error를 미리 경험
· 학습이 끝나면 최종 Weight를 실제 Quantization하고, Inference에서는 Quantized Model 사용

** Linear Quantization : 추론 중 사용 (for 저장, 연산 효율↑) / QAT : 학습 중 사용 (for Quantization에 의한 성능 저하↓)

[Reference]

· Model Quantization (AI System : Week 11) - Dongjun Han

댓글

이 블로그의 인기 게시물

[Mini-NPU RTL] NN Reference Model

[Mini-NPU RTL] TPU (Study Paper)