AI/ML System

[논문 리뷰] I-BERT: Integer-only BERT Quantization

민사민서 2025. 5. 21. 21:46
반응형

Integer-only Quantization의 필요성

* 모델의 사이즈(파라미터 수)가 계속해서 커지는 중

* 지금까지의 integer quantization method는 simulated quantization (=fake quantization), 모든(혹은 대부분의) 연산은 실질적으로 floating point arithmetic으로 이루어짐

* Neural Accelarator 혹은 부동소수점 연산 지원하지 않는 edge processor에서 돌릴 수 없다 (ex. ARM Cortex-M)

* 또한 low-precision integer의 효율적인 연산을 지원하는 Tensor Core를 fully leverage 하지 못함

* 따라서 floating point arithmetic을 추론 과정에서 완벽히 지우는 게 과제이다

 

왜 어렵냐

- GELU, Softmax는 non-linearlity를 가진다, 무슨 말이냐면 S * F(x/S) 이 값이 F(x) 와 같지 않다 !!

- LayerNorm 같은 경우는 variance 구할 때 square root 같은 연산 동적으로 해야한다

- 무작정 low-precision으로 approximate 하면 accuracy가 급격히 떨어진다

 

Efficient Neural Network

pruning, knowledge distillation, efficient neural architecture design, hardware-aware NN co-design, quantization

 

Quantization

- parameter만, 혹은 activation 까지

- PTQ (그냥 후처리만) vs. QAT (quantization-aware training, fine-tune 필요)

- 연산 중간에 dequantize 하여 fp32로 실제 연산을 수행하는 simulated quantization, 혹은 integer-only quantization

 

- uniform quantization (scale factor fixed, precomputed) vs. dynamic quantization

 

- uniform quantization은 또다시 symmetric vs. asymmetric으로 나뉨

거창한 건 아니고 실수 0에 대응되는 quantized value도 0이면 symmetric, 아니면 asymmetric이다. asymmetric이면 zero point를 빼서 (bias) dequantize 필요

 

Quantization Method used in I-BERT

- -a ~ a로 clip, scaling factor S = a / (2^(b-1) -1)

- uniform, symmetric이므로 dequantize는 단순히 S 곱하면 됨

 

 

Quantization in second-order polynomial a(x+b)^2+c

- quantized된 q와 scaling factor S 를 받았을 때 (x=qS) 이차함수 값을 리턴하는 (q_out*S_out = f(x)) 함수

- f(x) = a(qS+b)^2 + c = aS^2 ((q+b/S)^2 + c/aS^2) 이렇게 생각한다음 각 element를 floor()로 가까운 정수로 근사

 

핵심 아이디어는 non-linear activation 함수를 polynomial로 근사하자.

polynomial로 근사할 수만 있다면 Algorithm1 을 활용해 integer operation만으로 함수값을 구할 수 있다

 

How to approximate non-linear → polynomial ?

다항식 보간법 활용

n+1개의 함수위의 점을 "잘" 선택한다면, at most n차원의 다항 L로 근사할 수 있다

 

오차항은 이정도라 하는데 크게 안중요

 

good approximation을 위해 차원 n을 무작정 많이 높일 수 있겠지만, 이 논문에선 n=2 사용

1) 고차원 다항식은 연산/메모리 오버헤드가 크다

2) high-order 연산 도중에 overflow가 발생할 가능성이 크다, nonlinear 연산 특성상 곱셈이 많을텐데 전부 fp32로 할수는 없으니까

 

Integer-only GELU

what is GELU?

 

error function => 가우시안 누적 분포(구간면적)을 표준화한 형태

기존 시도 1) non-linear sigmoid function으로 근사, 하지만 integer-only가 아니라 floating point 연산이 섞임

기존 시도 2) sigmoid를 ReLU를 활용해 hard-sigmoid (h-Sigmoid)로 근사, 상당한 정확도 하락

why? 아래 사진을 보면 0 부근에서 h-GELU와 GELU 차이가 엄청 크다

 

objective: GELU 내의 erf 함수를 잘 모델링하는 polynomial을 구하자

전체 도메인에서 최적화하기보다, x>0 으로 도메인을 한정했고 (erf(-x) = -erf(x)), x가 무한대로 가면 1/-1 다가감 활용해 구함

저자들은 이 식과 coefficient가 최적임을 찾았다고 함.

이후 ablation study에서 End-to-end 성능 차이도 크더라

 

알고리즘은 다음과 같아요

- pre-computed된 a,b,c

- 부호 구하고, I-Poly()에 넣어줄 q를 clipping으로 구해서 q_L, S_L (q_L*S_L = a(qx+b)^2 + c) 를 얻는다

- q_sgn만 곁들이면 q_out * S_out = erf(x)

- 최종 GELU는 x/2 * (1+erf(x)) 니까 scale factor , quantized value를 합치면 됨~

 

Integer-only Softmax

과거 시도 1) look up table => 진정한 arithimetic based method는 아님

과거 시도 2) high-degree polynomials => limited application

exponential function value가 unbounded고 빠른 속도로 바뀌니까 힘듦

 

numerical stability 때문에 이렇게 구하기도 하는데, 이러면 exp value의 범위가 상당부분 제한되는데?

x_i - x_max 는 -ln2로 나눈 몫 z와 나머지 p로 표현 가능하고, exp(x_hat) 은 단순한 integer operation으로 바뀐다

=> 즉 [-ln2, 0] 범위에 있는 exp(p) 만 polynomial로 근사하면 된다

 

저자들은 [-ln2, 0] 범위에서 exp(p)를 가장 잘 근사하는 polynomial은 a=0.3585, b=1.353, 0.344 임을 찾아냈다

 

알고리즘은 다음과 같다

- input으로 x = qS 만족하는 q, S를 받는다

- ln2를 quantized 형태로 만들고, z를 계산한다 (quantized_x / quantized_ln2 나눗셈을 통해)

- p를 quantized된 형태로 만든다, q_p와 scale factor S를 I-Poly에 넣어주면 q_L, S_L이 나온다 (exp(p) = q_L*S_L)

- q_L >> z 하면 exp(x) 의 quantized version을 얻을 수 있다

 

- softmax 연산은 quantized된 상태로 max 값을 빼고, prob를 계산한다

 

Integer-only LayerNorm

가장 문제는 square-root를 runtime에 dynamic하게 정수만으로 구해야 한다는 것이다.

 

이건 f(x)=x^2 - n 의 근을 구하는 Newton method를 사용하면 iterative하게 구할 수 있다

초기값을 x>>sqrt(n) 정도로 잡아두고, x_i+1 = x_i - f(x_i)/f'(x_i) 이렇게 가면 몇 번의 iteration만에 근을 구할 수 있음

나머지 연산은 어렵지않게 integer-only로 수항 가능하다

 

 

Implementation

Matmul은 INT8로, 그 결과를 INT32로 accumulate / Embedding layer도 INT8로 처리

non-linear operation은 INT32 precision으로, 그 뒤 requantization을 통해 다시 INT8로 돌아옴

quantized INT8 model은 customized kernel 사용했다

 

Evaluation

accuracy
inference speedup

=> specialized hardware를 잘 활용하면 fp32에 비해 상당한 speedup 가능하다

 

Evaluation metric

accuracy

- classification accuracy : (정답으로 맞춘 샘플) / (전체 샘플) , 직관적이지만 클래스 불균형 생기면 지나친 낙관

- F1 score: precision=TP/(TP+FP) , recall=TP/(TP+FN) , F1 = 2* (Precision*Recall)/(Precision+Recall) , 단순 accuracy로는 놓치기 쉬운 FP*FN tradeoff를 판별하기 위해

- Pearson 상관계수 : 예측과 실제 간의 선형 상관관계

- 스피어만 순위상관계수 : 데이터를 값이 아닌 순위(rank) 로 바꾼 뒤, 그 순위들에 대해 Pearson rr 을 계산, 절댓값보다 순위?

- Matthews Correlation Coefficient (MCC)

 

Latency

- Google Cloud Platform virtual machine

반응형