EfficientML

EfficientML.ai Lecture 6 - Quantization(Part 2)

hariver1s20 2024. 9. 5. 12:36

MIT Song Han 교수님의 EfficientML 강의를 듣고 배운 내용을 정리하기 위한 포스팅이다. 

 

Instructor: Prof. Song Han
Slides: https://efficientml.ai

 

Course - MIT HAN Lab

Course collection of MIT HAN Lab.

hanlab.mit.edu

k-mean-based는 storage를 아낄 수 있는데 이는 LLAMA2랑 HW2에서 확인할 수 있음.

LINEAR의 경우는 저장공간도 계산도 효율적으로 할 수 있음.

 

Post-Training Quantization (PTQ)

Quantization Granularity

  • Per-Channel Weight Quantization
    • scaling factor와 bias가 channel별로 다르게 관찰됨. r_max와 r_min이 달라지므로

 

원래 S를 구할때는 (q_max - q_min)/(r_max - r_min)이라고 했는데. 0을 bias로 삼고 싶은건가? 그래서 q_max도 1이고 q_min도 -1이 되도록하고 S도 간략히 나타낸거..? r의 절대값의 max를 취한 이유,,? → W의 절대값도 SYMMETRIC이니까

 

  • 위 그림을 보면 quantize error가 channel별 quantization이 더 저렴한 것을 확인할 수 있다. 하지만 저장해야하는 값들이 더 증가하기 때문에 no free lunch이다.

아래 왼쪽 weight matrix에서 칠해진 -1의 경우 channel별 quantize는 S2= 1.92로 나누게 되므로 절대값이 0.5보다 크기 때문에 -1.92로 복원되지만 오른쪽 그림의 경우 S= 2.12이므로 절대값이 0.5보다 작아서 0으로 복원됨.

finer granularity → more redundancy, higher accuracy

 

\

  • MX4,MX6,MX9는 level0의 group size는 2로 동일하며 S1로 (1비트 부호+1비트 지수(2 values))를 나타내고 각각 M2,4,7로 2,4,7의 유효숫자를 표현함.
  • level1의 group size는 16으로 동일하며 8비트의 지수를 표현함. (dynamic range가 동일.)
  • MX4,6,9의 effective bit width가 4,6,9로 precision이 4,6,9bit정도가 됨.
  • Dynamic Range Cliping
    • range를 select하는 것이 중요한데다 activation range의 변화가 매우 심하기 때문에 (image들만 봐도 다양한 데이터가 있음.)
      • Type 1 : During Training
        • 모든 epoch의 batch마다 r_min과 r_max를 관찰하여 smoothing 기법으로 range를 선정.
        • batch별 min max를 구하고 mean을 구함.
        • activation의 분포를 관찰하고 centroid와 가쪽의 적절한 위치를 clip해야함.
          • 너무 가쪽을 clip하면 sparsity가 커지고 small 분포를 보존하기 위해 wasting the centroid
          • 너무 centroid를 clip하면 quantization error가 너무 커짐.
      • Type 2: Trained model에서 batch samples를 calibration함.
        • Activation이 gaussian이나 laplace분포를 따른다고 전제하고 closed form을 분석함. 그리고 휴리스틱하게 clipping을 정하고 sparsity와 centroid의 tradeoff를 관찰함.
        • KL Divergence를 최소화하는 방향으로, cliping하여 정보의 손실을 최소화함.

적은 분포들이 다 clip되면서 activation들이 많은 분포의 값들을 선정하여 error가 증가하게 됨.

 

  • Rounding(반올림)
    • weight는 correlated되어있으므로 each마다 하는 것은 best가 아님.
    • 학습가능한 0과 1사이의 값인 delta를 각각의 weight에 더해서 반올림을 적용.
    • 아래 수식에 따르면 h()가 그 delta를 결정하고 rectified sigmoid가 사용됨.

이 방법을 적용해서 W와의 차이를 최소화함.

지금까지 배운 내용

Zero Point(=bias)

Asymmetric, Symmetric

Scaling Granularity

Per-Tensor, Per-Channel, Group Quantization

Range Clipping (Activation, Weight의 범위를 제한하는 방법)

Exponential Moving Average, Minimizing KL Divergence, Minimizing MSE

원본 분포와 양자화된 분포 간의 KL Divergence를 최소화

원본과 양자화된 값 간의 평균 제곱 오차(MSE)를 최소화

Rounding(quantized value를 근사할때 사용하는 방법)

Round-to-Nearest, AdaRound(데이터 분포를 고려하여 학습된 방법으로 반올림)

 

Quantization - Aware Training (QAT)

  • 목표 : Precision의 손실을 최소화하여 모델을 quantization하고 inference에 사용함.
  • 제안 방법 : quantization을 하면 성능이 떨어지기 때문에 사전에 quantization을 고려하여 모델을 학습함.

ex) 0이라는 weight값이 한번의 iteration을 거쳐 1의 lr과 0.1의 gradient error를 가졌다면 floating point를 round하면 error도 0이되어 다음 iteration에서 weight값이 0이됨. 하지만 이를 5번 반복하게되면 누적된 error는 0.5가 되고 이를 round하면 weight가 1로 업데이트가 됨.

→ 그래서 이러한 small change를 keep 축적해야 함. +명언 타임

  • 학습과정에서 weight quantization을 update할 때, floating point weight이 사용되기에 온전한 quantization이라고 할 수는 없지만 추론과정에서는 quantization weight만을 이용함.

reconstruction을 거친 weight를 Q(W)라고함. 앞서 봤던 q_w는 int로 idx로 표현되고 Q(W)는 복원된 floating point임. Q(Y) 역시 floating point로 연산됨.

inference 단계에서 original W로 추론되는 것이 아니고 quantization을 거쳐 복원된 Q(W)로 추론됨.

quantization은 discrete-value이기때문에 gradient는 항상 0이다. 그렇기 때문에 네트워크가 학습을 하지 못하는 문제가 발생한다. 그래서 STE가 사용되는데(gradient가 모두 1이라고 가정함)

gw를 계산할 때, Q(W) 대신에 W를 사용하여 학습을 지속적으로 진행할 수 있게끔함.

결론적으로 성능 감소를 최소화한 채로 양자화를 성공함.

Binary Quantization

bitwise computation : operation을 floating point weight를 binary로 변환해서 memory와 computation의 연산량을 감소시킴.

 

Stochastic Binarization

  • Deterministic Binarization : 0을 기준으로 크면 +1 작으면 -1로 할당
  • Stochastic Binarization : 1보다 크면 1 -1보다 작으면 -1이지만 그 사이는 선형적으로 일대일 대응

이렇게 이진화로 weight matrix를 표현하게 되면, error가 매우 클 것이다.

→ 이를 해결하기 위해 scaling factor를 적용함. 이 scaling factor를 연산하는 방법은 원본 가중치 W의 절대 평균으로 선정.

만약 Activation과 weight가 모두 binarize됐다면 output값을 다 -1이라고 assume하고 XNOR인 것의 개수만큼 1을 곱해서 더하면 최종 출력을 구할 수 있따…?

XNOR은 bit가 같으면 1 다르면 0을 출력. 1의 개수를 세는 popcount

y_i = -n + popcount( W_i XNOR x) ≪1

y_i = -4 + popcount(1010 XNOR 1101=1000)≪1

y_i =−4 + 1≪1=−4+2(=10, 왼쪽으로 1bit 이동하는 연산)=−2

  • BWN (Binary Weight Network): 가중치만 이진화하고, 활성화 값은 이진화하지 않는 방법.
    • 이진화를 적용하면 메모리와 계산 자원을 크게 절약할 수 있지만, 정확도가 감소함.
    • 정확도 손실이 적은 편.
  • BNN (Binarized Neural Network): 가중치와 활성화 값 모두를 이진화하는 방법. 이때 스케일 팩터를 사용하지 않음.
    • 활성화 값까지 이진화하면 정확도 손실이 상당히 커짐.
  • XNOR-Net: 가중치와 활성화 값 모두를 이진화하며, 스케일 팩터를 사용하는 방법.
    • 정확도 손실을 줄이기 위한 방법이지만 여전히 한계가 존재함.

Ternary Quantization

신경망의 가중치(weight)를 3진수 값(1, -1, 0)으로 양자화(quantization)하여 연산을 효율적으로 만드는 방법

Δ는 threshold로 전체 가중치의 절대값 평균의 일정 비율로 설정됨.

TTQ에서는 학습 가능한 파라미터를 사용해 양자화된 값이 좀 더 최적화될 수 있게 만들 수 있음.

 

keep in mind : 8 bit 4,binary, ternary bit quantization에 대해 알아보았고, computation is cheap, memory reference is expensive : 연산 자체는 비교적 적은 비용이 들지만, 메모리에서 데이터를 읽고 쓰는 과정이 더 많은 비용을 요구한다 = 메모리 사용량을 줄이는 것이 중요하다. as you go deeper and deeper quantize the model you have diminishing return . 8bit to 2 bit , you get 4 times less memory but how much reduction of compute do you have 16 times. Computing is quadratic with the number of bits. aggressively reducing the precision giving you linear return of memory but quadratic return on the computer saving computation. : bit의 감소는 메모리 사용량에서는 선형적인 감소를 가져오고 연산 비용은 제곱의 감소를 줌. precision의 영향력에는 memory는 선형, computation은 제곱이다.

 

Mixed Precision Quantization

layer마다 다른 bit로 quantization을 진행함.

몇몇 layer는 매우 민감하게 quantization에 반응하기에 좀 덜 sensitive하게 quantizationn을 진행.

challenge : layer가 너무 많아지면 design의 choice가 너무 많아짐.

solution : design automation

추가로, device가 cloud냐 edge냐에 따라 다른 quantization scheme을 나타냈다고 함.