Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

ShuyaVision

[Quantization] Quantizing deep convolutional networks forefficient inference 정리 본문

plusAlpha

[Quantization] Quantizing deep convolutional networks forefficient inference 정리

Sangbro 2023. 8. 15. 00:56

Abstract

해당 논문은 convolutional NN을 INT weights와 activations로 quantization하는 기술에 대한 개요를 제시한다. 

1. 다양한 CNN NN에 대해 weights를 Channel별 quantization, activations의 Layer별 quantization을 하여 8 bits로 양자화 후, post-training을 통해 floating NN에 비해 2% 내의 분류 정확도를 달성한다. (Section 3.1)

2. 8 bits로 양자화하여 모델의 크기를 4배 이상 줄인다. 8bits 연산이 지원되지 않는 경우에도, post-training을 통해 이를 달성할 수 있다. (Section 3.1)

3. CPU 및 DSP에서 quantized 된 모델의 Latency를 측정하여 float 모델이 CPU에서 동작하는 것에 비해 2-3배의 빠른 속도를 관찰했다. Qualcomm QDSP와 같이 fixed point SIMD capabilites가 존재하는 경우, 최대 10배의 속도 향상이 관찰된다. (Section 6)

4. QAT를 통해 8 bit quantization에서 float NN과의 차이를 1%로 줄인다. QAT는 weights를 4 bit로 하더라도 2%~10%의 차이를 달성할 수 있다. (Section 3.2)

5. TensorFlow 및 TensorFlowLite에서 CNN을 quantization하기 위한 tool을 제공한다. (Section 3)

6. QAT에 대한 case를 분석한다. (Section 4)

7. Weights의 채널별 quantization과 activations의 Layer별 quantization이 HW 가속화와 kernel 최적화를 위한 quantization scheme이 되도록 권장한다. 또한, 미래의 HW 가속기를 제안한다. (Section 7)

 

Introduction

  NN이 edge applications에 점점 더 많이 사용됨에 따라, 모델의 크기를 줄이고, 더 빠른 inference와 더 낮은 power consumptions를 달성하는 것이 매우 중요해졌다. 이에 따라 MobileNet이 개발되었으며, quantization이나 pruning, 그리고 여러 압축 기술들 또한 적용되었다. 그리고 GEMMLOWP나 Intel MKL-DNN, Qualcomm SNPE의 Framework을 통해 HW에서의 추론 성능을 높였다.

  이러한 작업들의 목표를 달성하기 위해 가장 단순한 방법은, 모델의 복잡도를 줄이는 것인데, 이는 weights와 activations의 precision requirements(a.k.a 비트수)를 줄이는 것이다. 이 접근법은 다양한 장점을 제공한다. 해당 논문에서는 quantization은 광범위하게 사용 가능하며, 모델의 크기를 줄이고, 연산 속도 또한 더 빠르며, 전력을 낮게 사용하기 때문에, 모델의 정확도를 최소한으로 줄이면서 On Device 환경에서 수 많은 장점을 가질 수 있다고 말한다.

 

Quantizer Design

2.1 Uniform Affine Quantizer

  Uniform Affine Quantizer는 quantization을 할 때, 균일한 간격으로 quantization을 진행하며, zero-point를 사용해 0을 정확히 quantize 하여, 0에 대한 quantization 오류를 제거하는데 효과적이다. ( 딥 러닝 모델에서 0은 패딩, 또는 pruning을 진행 한 후, 또는 특정 연산에서 중요한 표현을 할 만큼 중요한 역할을 하기 때문에, zero-point를 활용해 0을 정확히 quantize하는 것은 매우 중요하다고 한다.)

  수식은 아래와 같다. 

quantization된 weights와 activations 사이의 conv 연산에 대한 수식은 아래와 같다.

  • y(k, l, n): y는 conv의 출력을 나타낸다. k, l, n은 각각 공간 위치와 출력 채널을 나타내는 index이다.

(4)에서는 conv 연산 내에서 zero-point 보정이 이루어지고, (5), (6)에서는 zero-point 연산이 conv 밖에서 이루어진다.

(4)에서는 (16/32 bit)의 연산이 발생할 수 있어 속도가 느려질 수 있는 단점이 존재한다. 따라서 두번째 식을 활용하면 더 효율적인 구현이 가능하다. 하지만 이 또한 conv kernel을 최적화하는 것을 필요로 한다. “Gemmlowp:building a quantization paradigm from first principles.” 에서 더 자세한 내용을 찾을 수 있다. (gemmlowp는 Tensorflow Lite에서 사용되며, 8-bit로 low-precision matrix multiplication을 수행하는 C++ 라이브러리이다)

 

2.2 Uniform Symmetric Quantizer

  Affine quantizer의 zero-point를 0으로 강제한 방법이다. 수식은 아래와 같다.

  논문에서는 더 빠른 SIMD 구현을 위해 수식을 weights의 범위를 아래와 같이 제한한다. (-128 ~ 127) -> (-127, 127)
(SIMD : Single Instruction, Multiple Data로, 한번의 명령으로 여러 데이터에 동시에 연산을 수행하는 병렬 처리 컴퓨팅 방식을 의미한다)

2.3 Stochastic quantizer

  Stochastic quantizer는 반올림 연산을 하기 전에 -0.5 ~ 0.5 사이의 값을 random하게 추가한 뒤에 반올림 연산을 수행한다. 수식은 아래와 같다.

  이 연산은 두가지 장점이 존재하는데, 첫번째로는 무작위성을 추가하여 오차의 분포를 다양하게 만들 수 있다는 것이다. 일반적인 quantization의 경우에는, epsilon 값이 존재하지 않기 때문에 일정한 오차 분포를 가진다. 하지만 반복적으로 quantization을 진행하는 경우에, 오차의 분포를 epsilon 값을 통해 다양하게 가져갈 수 있다면, 오차의 평균 또한 원래의 값에 더 가까워져 보다 더 정확한 quantization 결과를 이끌어 낼 수 있다. 두번째로는, 기울기를 계산할 수 있다는 장점이 존재한다. 하지만 Stochastic quantizer의 경우, 대부분의 HW에서 지원하기 어렵기 때문에, 학습 시에는 사용할 수 있으나, inference에서는 사용하기 힘들다.

 

2.4 Determining Quantizer parameters

  QAT에서는 quantization의 동작에 따른 시뮬레이션 된 quantization 연산을 사용한다.

  Uniform quantizer function은 대부분 0이므로 역전파 과정에서 quantizer를 모델링하기 위해서는 근사치가 필요하다. 이는 STE를 통해 단순히 항등함수로 취급하고, 나머지 gradient를 계산하는 방식으로 수행할 수 있다.

2.5 Determining Quantizer parameters

  Quantization의 parameters는 여러 기준을 사용해 결정될 수 있다. 예를 들어 TensorRT의 경우 기존 분포와 quantization된 분포 사이의 KL 발산을 최소화해 단계 크기를 결정한다. 본 논문에서는 더 간단하게, weights의 경우 실제 min max 값을 사용하고, activations의 경우, batch 간 min과 max의 이동 편균 값을 사용해 parameters를 사용한다. PTQ에서는 quantizer paramters를 적절히 고르는 것으로 모델의 정확도를 향상시킬 수 있다.

 

2.6 Granularity of quantization

  Tensor내 각 kernel에 대해 quantizer parameters를 적용함으로써 더 높은 정확도를 달성할 수 있다. 예를 들어 weight tensor는 4차원이며, 3-d conv kernel의 모음으로 각각 하나의 feature map을 만든다. 채널별 quantization은 각 3-d conv kernel 마다 다른 scale과 offset을 적용함으로써, kernel의 특성과 분포에 따라 최적의 quantization 성능을 가져올 수 있다. Activations(입력값, 출력값)에 대한 per-channel quantization은 conv 및 matmul operations의 inner product를 복잡하게 할 수 있기 때문에 고려하지 않는다. 그러나 Per-Layer와 Per-Channel 모두 kernel당 quantizer parameters가 고정되어 있기 때문에 효율적인 dot product와 convolution 구현을 가능하게 한다.

 

Quantized Inference : Performance and Accuracy

 

3.1 Post Traning Quantization

  많은 경우에 re-train 과정 없이 quantization을 진행해야하는 경우가 있다. PTQ는 이러한 경우에 사용하며, limited data로도 quantization이 가능하며, 사용하기 간편하다. 본 논문에서는 asymmetric range로 per-channel quantization을 할 때 float 모델과 가장 근접한 결과가 나오는 것을 실험적으로 보여준다.

 

  3.1.1 Weight only quantization

   가장 간단한 접근법으로 model의 weights만 float에서 8bit으로 quantization하는 방법이 있다. Weights만 업데이트하기 때문에, validation data가 필요가 없다. 이 방법은 단순히 size만을 줄일 때 좋은 접근 방법이 될 수 있다.

 

  3.1.2 Quantizing weights and activations

  Quantize할 대상에 대해 모든 quantizer parameters를 계산해서 8bit로 quantize할 수 있다. Dynamic range를 가지는 activations가 quantized 되기 때문에, calibration data가 필요하다. 일반적으로 100 mini-batches의 데이터면 range를 cover할 수 있다고 한다.

 

  3.1.3 PTQ Summary

    1. Per-channel quantization, 그리고 asymmetric quantization이 상대적으로 우수한 성능을 보인다.

    2. Activations는 8 bit로 quantize 될 때 "almost no loss in accuracy"를 달성할 수 있다.

       - Batch normalization with no scaling 과 ReLU6을 활용하면 activations의 dynamic range를 낮추어 8 bit안에 대부분           의 값을 담을 수 있기 때문에 더 유용하게사용 할 수 있다.

    3. MobileNet과 같이 parameters가 적은 모델에 비해, ResNet과 같이 parameters가 더 많은 경우에 더 강력한 성능을            보인다.

    4. 특히, MobileNet 의 경우, Layer 별로 quantize 될 때 큰 하락을 보인다.

    5. 대부분의 accuracy loss는 weight quantization을 했을 때 발생한다.

  Layer별로 weights quantization을 했을 때, accuracy loss는 대부분 batch normalization으로 인해 발생한다. 이는 단일 layer의 conv kernel에 걸쳐 dynamic range에 큰 변동을 초래한다. Channel별 quantization은 batch-norm scaling으로부터 자유롭기 때문에, 이 문제를 회피할 수 있다.

 

3.2 Quantization Aware Training

  QAT는 PTQ에 비해 높은 성능을 자랑하는 기법이다. 본 논문에서는 다양한 접근법을 시도했는데, PTQ에서 가장 낮았던 per-layer quantization도 QAT를 활용했을 때는, PTQ에 비해 높은 성능을 보여주었다. 또한 weights와 activations 모두를 대상으로 quantization을 진행했으며, backward pass를 할 때 gradient가 0이 되는 문제는 STE(straight through estimator)를 통해 해결했다. 다만, weights는 gradient updates를 진행할 때 floating point로 계산을 한 후에 quantize를 진행했다. 이를 통해 아주 작은 gradient에서 점진적으로 update가 될 수 있도록 하였다. SGD 수식은 아래와 같다.

  QAT 모델을 training한 steps는 아래와 같다.

  1. (권장) floating point 모델에서 fine-tuning을 1차적으로 진행한다.

  2. Estimator에 quantization oprations를 추가한다. (여기서 Estimator는 Tensorflow에서 사용하는 API 이름이다)

  3. 학습한다. 모든 quantities quantization 정보, scale과 zero point 등 최종 정보를 저장한다.

  4. 모델을 바꾼다. (TOCO : tf.contrib.lite.toco_convert를 활용해서 flatbuffer file을 생성한다.)

  5. 모델을 실행한다.

 

  3.2.1 Operation Transformations for Quantization

  Quantization을 올바르게 수행하기 위해서는 몇가지 주의사항을 지킬 필요가 있다.

  1. 훈련 중, wieghts와 activations가 제대로 update 될 수 있도록 모델링하는 것이 필요하다. 예를 들어, out-of-range values가 존재할 때 적절히 처리 되는지, 특히 값이 더해지거나 빼질 때 제대로 수행되는 지 주의가 필요하다.

  2. inference 중, oprations의 융합(fusion)이 정확하게 되도록 모델링 해야한다. 예를 들어, ReLU와 덧셈은 inference 시간을 줄이기위해 fusion 될 수 있다.(더 했을 때 0보다 작은 경우, 그냥 0으로)

 

  3.2.2 Batch Normalization

  Batch Normalization은 output layer에서 activations statistics를 normalize하는 기법이다.

  아래 수식은 각각 training시, inference 시 사용되는 BN 수식이다. µB와 σB에서 B는 Batch를 뜻한다.

  Inference 시에는, 아래 수식을 이용해서 batch normalization을 fold한다.

   Quantized inference를 위해서는 먼저 folding batch norms을 고려해서 training을 진행해야한다. 본 논문에서 착안한 아이디어는, training 시에는 batch statistics를 사용하지만, inference 때는 long term statistics를 사용한다는 점이다. Batch statistics는 모든 batch에서 변동성이 있기 때문에, 매 배치마다 가중치 값이 불가피하게 변동될 수 있다. 이러한 문제를 해결하기 위해 본 논문에서는 초기 단계에서는 batch norms의 효과를 유지하기 위해 기본적인 batch statistics를 활용한다. 어느 정도 진행한 다음에는 batch norms를 그대로 활용하는 것이 아닌 long term moving averages를 활용해서 batch norms를 진행한다. 이를 통해 training 중에도 inference 시 사용될 moving averages를 기반으로 모델을 훈련 시킬 수 있다. 

  내용이 약간 복잡한데, 이해한 바로는, QAT는 pre-trained 된 모델에 대해서 re-training을 통해 quantization을 진행하는 기법이다. Float 모델과 최대한 비슷한 성능을 내기 위해서는 re-training 시에 batch norm 기법의 동적인 특성을 최대한 줄이는 것이 중요하다. 따라서 학습을 할 때 초기에는 일반적인 batch statistics를 활용하다가, 훈련 중간부터는 moving average를 사용하여 모델의 성능을 최적화하는 것이다. 추가적으로, folding을 유지한 채로 quantization을 진행하는데 이는 Batch norm Layer를 추가적으로 quantize할 필요가 없고, 학습과 추론의 과정이 일관성이 생기는 추가적인 장점 또한 존재하기 때문이다.

 

3.2.3 Experiments

  3.2.4 Lower Precision Networks

  본 논문에서는 8-bits 뿐 아니라, 4-bits에서도 QAT를 진행했는데, per-channel quantization이 per-layer quantization에 비해 훨씬 좋은 것을 4-bit에서 확인했다고 한다. 또한 Fine-tuning을 진행하고 하는 것이 추가적인 accuracy 증가에 도움을 준다고 한다. 이는 weights는 8-bits로, activations을 4-bits로 quantization을 진행했을 때도 동일했다고 한다.

 

 

아래는 논문에서 정리한 Quantization을 할 때의 Tips과 같은 내용들이다.

Training best practices

1. Stochatic Quantization은 accuracy를 향상시키지 않는다고 한다. Stochastic quantization은 mini-batch마다 quantized된 weights가 변동하도록 하기 때문에, float 모델에 근접하기 힘든 경향이 존재한다고 한다.

2. Floating point checkpoint에서 quantization을 진행하는 게 더 나은 성능을 보인다고 한다. 또한 fine tuning을 하는 것을 강력하게 추천한다고 한다.

3. Batch normalization을 inference시에 사용하는 moving average와 일치시키는 것이 성능 향상에 도움을 준다고 한다.

4. Quantization 시에 exponential moving average를 사용하는 것은 위험할 수 있다.

 

Model Architecture recommendations

1. Activation function ReLU6를 ReLU로 교체하는 것이 조금 더 나은 성능을 가져올 수 있다. (PTQ인지 QAT인지 정확히 나오지는 않으나, PTQ에서는 ReLU6를 추천하는 식으로 말했지만, 구태여 ReLU6로 기존 모델을 만들어서 성능을 떨어뜨릴 필요가 없다는 뜻으로 보인다)

2. 오히려 모델의 크기를 키웠다가 quantization을 하는 게 더 나을 수도 있다. 기존에는 4-bits는 8bits에 비해 현저히 떨어지는 성능을 보인다. 그러나 over-parmaterized model을 8-bits로 quantize한 모델과 4-bits로 quantize한 모델은 거의 비슷한 성능을 보여줄 수 있다. 따라서, over-parmaterized model을 만들고 이를 4-bits로 quantize한다면, 보다 더 좋은 성능을 갖추면서도 더 적은 메모리를 차지할 수도 있는 것이다.

 

Neural network accelerator recommendations

1. Aggressive operator fusion을 통해 가능한 많은 연산을 한 번에 수행하는 것이 좋다.

2. Compressed memory access을 지원하게 해 메모리 대역폭을 최적화할 수 있다.

3. Lower precision arithmetic을 지원하도록 해서 4, 8, 16 bits 모두 적절히 사용하는 것이 좋다.

4. Per-layer selections of bitwidts를 통해서 모델 크기를 줄일 수 있다.

5. Per-channel quantization을 통해 HW에 model deployment가 쉬워질 수 있고, specific fine-tuning이 필요없을 수 있으며 lower precision computation이 가능할 수 있다.