딥러닝 모델의 경량화 및 최적화를 위해 사용되는 양자화(Quantization)에 대한 정리

양자화(Quantization)란

  • 신경망의 가중치(weight)와 활성화 함수(activation function) 출력을 더 작은 비트 수로 표현하도록 변환하는 것
  • 모델의 파라미터(fp32)를 낮은 비트(int8 등)로 표현하여 모델 크기를 줄이고 계산 비용을 낮추는 것
  • weight나 activation function의 값이 어느 정도의 범위 안에 있다는 것을 가정하여 이루어 지는 모델 경량화 방법
  • 모델 사이즈 축소, 연산량 감소, 효율적인 하드웨어 사용이 양자화의 주 목적

양자화 개요 및 방법

양자화 개요

딥러닝에서 양자화를 할 때 아래 5가지 전제조건을 따름

  1. Inference Only : Quantization은 inference에서만 사용함. 즉, 학습 시간을 줄이기 위한 것과는 관련 없음.
  2. Not every layer can be quantized : 구현한 딥러닝 모델의 모든 layer가 양자화 될 수 없는 경우가 있음. 이것은 각 layer 자체의 특수성으로 어려운 부분도 있지만 Pytorch와 같은 Framework가 지원하지 않는 경우가 있다.
  3. Not every layer shoud be quantized : 모든 layer가 반드시 양자화 되어야 하는 것이 가장 효율적인 것은 아님. 경우에 따라서는 layer를 fusion 하여 한번에 quantization을 하기도 한다.
  4. Not every model reacts the same way to quantization : 같은 quantization을 적용하더라도 모든 딥러닝 모델이 동일한 효과가 나타나는 것은 아님. layer의 특성이 있기 때문에 layer의 집합인 model에서는 그 현상이 더 크게 나타남.
  5. Most available implementations are CPU only : 양자화가 적용된 많은 연산이 아직 CPU에서 사용해야 하는 경우가 있다.

양자화 방법

딥러닝에서 양자화를 할 때 아래의 6가지 단계를 가지게됨

  1. Module Fusion : layer들을 하나로 묶어주는 Fusion 단계를 의미합니다. 이 단계는 반드시 필요한 것은 아니지만 좋은 성능을 위해서 많이 사용하고 있다. 대표적으로 Conv-BatchNorm-ReLU를 Fusion 하는 방법을 많이 사용하고 있으며, 이 작업은 필요시에만 사용함.
  2. Formula Definition : Qunaitization 시 사용하는 식을 정의. 일반적으로 FP32 → INT8의 방식을 사용하며 반대로 다시 Floting Point로 변경 시 INT8 → FP32로 변경하는 Dequantization 방법도 정의함.
  3. Hardware Deployment : 하드웨어에 따라서 어떻게 calibration하는 지 달라진다. 대표적으로 인텔계열과 ARM계열이 있다.
  4. Dataset Calibration : weight를 변환하기 위한 식의 파라미터를 Dataset을 이용하여 계산함.
  5. Weight Conversion : 실제 weightFP 타입에서 INT 타입으로 변환.
  6. Dequantization : 마지막으로 inference를 통해 얻은 출력을 dequantization을 통하여 다시 Floating 타입으로 변경함. 이 작업은 필요시에만 사용함.

대표적인 양자화 테크닉으로 Dynamic Quantization,  Static Quantization,  Quantization Aware Training 이 있다.

1. Module Fusion

  • CONV2D - BATCHNORM - RELU가 한 쌍으로 되어 있으며, 실제 이 순서대로 layer를 많이 쌓기 때문에 실제 사용 케이스와 유사하다. 주황색은 첫번째 모듈이고 초록색은 두번째 모듈을 뜻함.
  • 첫번째 행의 precision을 살펴보면 quantization이 적용된 layer를 걸칠때마다 precision이 감소하는 것을 알 수 있다. 따라서 같은 모듈에서 quantization 하는 횟수를 3번에서 1번으로 줄여서 정확도를 얻고자 하는 방법으로 Moudel Fusion이 사용된다.
  • quantization 횟수를 줄이면 inference time 과 precision 을 개선할 수 있기 때문.

2. Formula Definition

  • How_To_Quantize.ipynb - Colab

  • Quantization의 가장 큰 핵심인 어떻게 Quantization을 하는 지 formula를 정하는 방법.

  • 위 그림의 왼쪽이 FP32일 때의 숫자이고 오른쪽은 formula를 통해 변환한 INT8에 해당하는 값입니다. 실제로는 FP32과 INT8의 숫자는 딥러닝 모델의 weight에 해당함.

  • 위 도표를 통해서 아래 식 (1), (2), (4)을 통해 정의한 Formula를 연산이 가능함.

  • 는 양자화 하고자하는 값, 는 Scale, 는 Zero Point 를 의미함
  • Scale : 기존 실수값 범위 / 양자화 할 정수값 범위
  • Clipping : 양자화 할 수 있는 실수 범위를 넘어가는 실수 값을 양자화할 수 있는 최소나 최대값으로 양자화 하는 것
  • Zero Point :  양자화 되고 나서 영점. 만약 대칭 Quantization을 하면 z값은 0.
  • 위 표에서 최댓값은 4.67 이고 최솟값은 -4.75 이므로, 가 됨. FP32INT8(Unsigned) 로 변경한다고 가정하면, 가 됨.
  • 식 정리
  • 위 값을 이용하여 z를 구하면,
  • 구한 를 이용해 을 식(1)을 통해 양자화를 진행하면 아래와 같다
  • clipping 은 범위를 초과하는 값을 범위안에 가지도록함

이와 같은 quantization 기법을 uniform quantization이라고 부르며, 결과로 얻어지는 quantized values는 균등하게 분포된다.

3. Hardware Deployment

  • 앞에서 설명한 바와 같이 하드웨어에 따라서 어떻게 calibration하는 지 달라진다. 대표적으로 Intel계열과 ARM계열이 있고 Intel 칩을 사용하는 경우 히스토그램 방식을 이용하고 ARM 칩을 사용하는 경우 위 글에서 다룬 MinMax 방식을 이용합니다.

4. Dataset Calibration

  • MinMax 방법 또는 히스토그램 방법이든 식 의 스케일 값인  를 정할 때  와 같은 범위값을 정하여 formula에 필요한 파라미터를 모두 정의한다.
  • Calibration dataset은 calibration 시 layer의 출력 분포를 계산하기 위해서 사용되는 데이터셋이다. 이 데이터셋을 통해 INT8 layer의 정확도가 측정되기에, 이상적으로는 실제 사용되는 데이터셋의 특징을 모두 담고 있어야 좋다.

5. Weight Conversion

  • Dataset Calibration 과정을 통하여 formula가 정의되면 FP32INT8로 변환함.

6. Dequantization

  • Dequantization은 INT8의 결과를 다시 FP32로 변환하는 것. FP32 → INT8로 변환 시 정보 손실이 발생하기때문에 역으로 INT8 → FP32로 변환 시 잃어버린 정보로 인하여 그대로 변환되지 않음. 이 때 발생하는 Error를 Quantization Error라고 하며 이 Error를 줄이는 것이 좋은 Quantization 알고리즘이라고 말할 수 있다.
  • floating point 값인  를 quantized가 적용된 값을 라고 한다면 de-quantization의 과정은 다음과 같다.

Symmetric vs. Asymmetric Quantization

  • range를 결정하는  가 절대값이 같은 값으나 부호가 다르게 사용된다면 Symmetric이라고 하고 서로 다른 절대값을 가지는 경우라면 Asymmetric 이라고 한다.
  • 앞에서 다룬 위 예시에서 최솟값은 -4.75이고 최댓값은 4.67 이며, 최솟값과 최댓값이 다르므로 이 값을 그대로 사용한다면 Asymmetric 하게 되고, Symmetric 하게 하려면 최솟값과 최댓값 중 절대값이 큰 값을 선택한 다음에  로 사용.
  • Symmetric quantization : [−4.75, 4.75]
  • Asymmetric quantization : [−4.75, 4.67]
  • 즉, Symmetric quantization을 사용할 때에는  가 되기 때문에 식 에 대입하면 다음과 같이 식이 간단해 진다.
  • 만약 식 에서 INT8의 범위가 -128 ~ 127 이라고 가정하면 식 을 통해  임을 알 수 있다.
  • 여기 까지 진행된 내용을 통하여 FP32 → INT8로 mapping을 한 다음에 outlier가 발생 시 INT8의 최솟값 또는 최댓값으로 clipping 되도록 적용하면 quantization이 마무리 된다.

Static vs. Dynamic Quantization

Clipping range 를 결정하는 여러 가지 calibration 방법이 있지만, 언제 clipping range이 결정되는 시점 또한 매우 중요하다. 대부분 모델의 파라미터는 추론 중에서는 고정되므로 이 범위는 weights에 대해서 정적(static)으로 계산될 수 있다. 그러나 activation map은 각 입력 샘플에 따라 다르다. 따라서, activation을 양자화하는 방법에는 dynamic quantization과 static quantization, 두 가지 기법이 있다.

  • Static과 Dynamic의 의미는 앞에서 설명한 clipping range를 어떻게 정하는 지에 따라 달라진다.
  • Static quantization : clipping range는 사전에 미리 계산이 되어서 inference 시에는 고정된 값으로 사용되는 방법을 의미. 고정된 clipping range를 사용하기 때문에 이 방법은 추가적인 계산 비용이 발생하지 않지만 dynamic quantization 방법에 비해 낮은 성능을 보이곤 한다. static quantization의 clipping range를 사전에 정하는 대표적인 방법은 샘플 입력 데이터를 준비하여 range를 정해보는 것이며, 이 방법을 calibration이라함.
  • Dynamic quantization : 동작 중 (runtime)에 각 activation map에 해당하는 clipping에서 clipping range가 동적으로 계산됨. 동작 중에 동적으로 계산되어야 하기 때문에 실시간성이 보장되는 계산 방법이 이용되며 대표적으로 min, max, percentile 등이 있다. 추가 계산 비용이 들지만 매번 input에 맞춰서 clipping range가 결정되기 때문에 dynamic quantization 방법은 static quantization 방법보다 더 좋은 성능을 보임.

Quantized Matrix Multiplication

  • 위에서는 임의의 스칼라 값에 대한 affine Quantization Mapping 이란 방법을 이용하여 Quantization 하는 방법에 대하여 알아보았다.
  • 딥러닝에서 다루는 데이터는 최소 Matrix 이며 Tensor 범위까지 늘어나기 때문에 가장 기본이 되는 Matrix 에서의 Quantization이 어떻게 이루어 지는지 살펴보자.
  •  
  • 위의 공간 및 조건의 행렬이 있을 때, 행렬곱의 식은 아래와 같이 나타냄

  • 즉, 행렬에서 원소 하나의 값을 구하기 위하여 번의 floating point 곱 연산과 합 연산이 필요함
  • 따라서, 전체 행렬 를 계산하기 위해서는 번의 floating point 곱, 합 연산이 필요함

행렬에서의 Quantization

  • 전개되는 수식은 다음과 같다.
  • 위 식에서 각각의 Quantization이 적용된 Matrix. 는 각각의 scale이고, 는 각각의 zero point 이다.
  • 위 식에서 다음 4가지 성분은 inference 시 상수값이므로 inference 하기 전에 미리 구해놓으면 효율적으로 계산할 수 있다.

  • 위 식과 같이 를 정리하였을 때, 는 integer의 곱과 합으로 나타나지며 이러한 integer matrix multiplication은 다양한 하드웨어에서 자체적으로 연산 최적화 방법을 제공함. 예를 들어 NVIDIA의 Tensor Core나 Tensor Core IMMA Operation이라는 것을 사용하여 일반적인 실수 행렬 계산시보다 integer matrix multiplication일 때 더 빠르게 계산할 수 있다고 한다. 아래는 NVIDIA Tensor Core Operations 관련 그림


Quantization Methods in Deep learning

  • Quantization 종류 및 장단점

  • 예제 코드 : Static Quantization for Semantic Segmentation 코드 예제

  • Dynamic Quantization(동적 양자화)

    • 가중치는 미리 양자화 되지만, 활성화는 inference 동안 동적으로 양자화가 됨
  • Static Quantization(정적 양자화)

    • Post Training Quantization 또는 PTQ라고 불림
      • 학습된 모델을 quantization 하는 Post Training Quantization
      • Traning한 후에 양자화를 적용하는 기법
      • 파라미터 size 큰 모델에서 정확도 하락 폭이 작음
        → 파라미터 size 작은 소형 모델에서는 적합하지 않음
  • Quantization aware training(양자화 인식 교육)

    • training 시점에서 양자화가 됐을 때 loss가 어떻게 될 지 시뮬레이션을 같이 돌린다

Post Training Quantization 과 Quantization Aware Traing 비교

1. Post Training Quantization

  • floating point 모델로 학습을 한 뒤 결과 weight 값들에 대해 양자화하는 방법. 즉, 학습을 완전히 끝내 놓고 양자화 에러를 최소화하도록 한다. 
  • 장점 : 파라미터 사이즈가 큰 대형 모델의 정확도 하락 폭이 적다. 
  • 단점 : 파라미터 사이즈가 작은 소형 모델의 정확도 하락 폭이 크다.
  • PTQ를 사용하면 소형 모델에서 정확도가 하락이 많이 되는 이유는 다음과 같다. 소형 모델에서는 weight 및 layer의 갯수가 작아 weight가 가지는 정보의 양이 상대적으로 작기 때문에, 여러 에러나 outlier에 민감해지는데, 양자화로 인해 학습을 통해 얻은 실제 weight와 달라지는 경우 그 영향이 더 커져서 정확도 하락이 크다.

2. Quantization Aware Training

  • 학습 진행 시점에 inference 시 양자화 적용에 의한 영향을 미리 시뮬레이션 하는 방식. 최적의 weight를 구하는 것과 동시에 양자화를 진행.
  • 장점 : 양자화 이후 모델의 정확도 감소를 최소화 할 수 있다.
  • 단점 : 모델 학습 이후 추가 학습이 필요하다.
QAT의 의의

양자화를 해야하는 상황은 Edge Device와 같은 환경에서 사용해야 하고, 이때 주로 소형 모델을 사용한다. 그런데 PTQ를 소형모델에 사용하기에는 양자화 성능이 좋지 않다. 따라서 QAT를 이용해 학습을 통해 얻은 실제 weight와 양자화 후 weight의 차이를 최소화하는 작업이 필요하다. 그러므로 mobilenet과 같은 소형 모델에서는 QAT가 필수적이다.

왼쪽이 단순 int형으로 양자화하는 모습이고, 오른쪽이 QAT를 사용한 모습이다. 오른쪽 QAT 그림에서 act quant(activation quantization)과 wt quant(weight quantization) = fake quantization node이 있는 것을 볼 수 있다. 

  • QAT는 forward / backward 에서 weight와 activation function 출력에 대한 양자화를 학습 중에 시뮬레이션 한다.
  • 빨간 노드(act quant, wt quant) 을 fake quantization node라고 하고 forward / backward pass에서 quantization 적용 시 영향을 시뮬레이션하게 된다.
  • 추가적으로 batch normalization은 inference에 사용되는 모드를 적용하여 시뮬레이션을 하게 된다.\
QAT의 메커니즘
  • floating point 모델에서 양자화된 정수 모델로 변환하는 동안 양자화가 발생하는 위치에 fake quantization module, 즉 quantization / dequantization 모듈을 배치하여 정수 양자화에 의해 가져오는 Clipping 및 round 에러 효과를 시뮬레이션한다.
  • fake quantization 모듈은 scale과 weight, activation의 zero point를 모니터링한다.
  • QAT가 끝나면 floating point 모델은 fake quantization 모듈에 저장된 정보를 사용해 양자화된 정수 모델로 변환될 수 있다.

참고