논문

[논문]INTERGER QUANTIZATION FOR DEEP LEARNING INFERENCE: PRINCIPLES AND EMPRICAL EVALUATION

수타. 2024. 10. 10. 22:58

https://arxiv.org/abs/2004.09602

 

Integer Quantization for Deep Learning Inference: Principles and Empirical Evaluation

Quantization techniques can reduce the size of Deep Neural Networks and improve inference latency and throughput by taking advantage of high throughput integer instructions. In this paper we review the mathematical aspects of quantization parameters and ev

arxiv.org

 

Abstract
  • 양자화 기법은 정수를 활용하여, 추론시간(inference latency)과 처리량(throughput)을 개선할 수 있습니다. 이 논문에서는 양자화 매개변수(quantization parameters)의 수학적 측면을 검토하고, 비전, 음성 및 언어를 포함한 다양한 응용분야에 대한 광범위한 신경망 모델에서 이를 평가합니다. 또한 높은 처리량의 정수 수학 파이프라인을 가지는 프로세서에 의해 가속화 될 수 있는 양자화 기법에 중점을 둡니다. 그리고 MobileNets , BERT-large와 같이 양자화하기 더 어려운 모델을 포함하여 연구된 모든 네트워크에서 부동 소수점 기준선의 1% 이내의 정확도를 유지할 수 있는 8비트 양자화 워크 플로우를 제시합니다.
Introduction
  • 딥 러닝에서는 FP32를 많이 사용하였지만, 대부분의 DL accelerators(GPU, TPU 등 딥러닝 가속기)가 지원하는 16비트 부동소수점 (FP16) 으로 신경망을 훈련하는 것이 일반화 되고 있습니다. 훈련이 완료된 신경망은 부동소수점, 고정 소수점 및 정수를 포함한 더 낮은 정밀도 형식을 사용하여 추론할 수 있습니다. 낮은 정밀도 형식의 이점에는 메모리 절약, 연산속도 향상, 전력소비감소 등이 있습니다.
    • 많은 프로세서가 저비트 형식에 대해 더 높은 처리량의 수학 파이프 라인을 제공하여 합성곱 및 행렬 곱셈과 같은 math-intensive(수학 집약적인) 작업을 가속화 할 수 있습니다. (정밀도를 줄였기 때문에 물리적으로 계산할 량이 줄어 속도가 향상됩니다)
    • 더 작은 워드 크기는 메모리 대역폭 부담을 줄여 대역폭이 제한된 계산의 성능을 향상시킵니다. (즉 DL 가속기의 성능은 충분하지만, 메모리 대역폭(memory bandwith, 메모리로부터 데이터를 읽고 쓰는 속도)가 느려서 성능이 줄어드는 경우가 줄어듭니다. 낮은 비트 형식을 사용하면 대역폭을 더 효율적으로 사용할 수 있어, 같은 대역폭 내에서 더 많은 데이터를 전송할 수 있게 됩니다)
    • 더 작은 워드 크기는 메모리 크기 요구 사항을 줄여 캐시 활용도 및 메모리 시스템 작동의 다른 측면을 개선할 수 있습니다 (시에 더 많은 데이터를 저장할 수 있기 때문에, 메모리 접근 횟수가 줄어들고 결과적으로 데이터 전송 속도를 높이는 효과를 줍니다)

  • NVIDA GPU에서 다양한 유형의 데이터 연산 처리량입니다. INT8에서 실행되는 수학 작업은 FP32에서 동일한 작업에 비해 최대 16배의 속도향상을, 메모리 제한 작업은 최대 4 배의 속도향상을 보입니다.
  • 이 후로는 다양한 정수 양자화 선택의 수학적 기초와 양자화로 인해 손실된 정확도를 회복하기 위한 기술을 검토합니다.

 

Quantization Fundamentals
  • Uniform Integer Quantization(균일 정수 양자화)란 정수 도메인에서 행렬 곱셈, 합성곱등을 계산할 수 있게 하여 높은 처리량의 정수 수학 파이프 라인을 사용할 수 있게 합니다. (Uniform integer quatization 은 연속적인 실수 값을 일정한 간격의 정수값으로 변환하는 방법, 구현 및 계산이 쉽지만, 변화 할 신호의 분포가 비 균일 할 경우 그 집중된 구간의 해상도가 낮아질 수 있음, Non-Uniform Integer Quantization은 반대로 입력 값의 분포에 따라, 데이터의 밀집도가 높은 영역에서는 더 많은 구간을 할당하고, 밀집도가 낮은 영역에서는 더 적은 구간을 할당합니다. 데이터의 분포를 반영하여 중요한 정보가 손실되는것을 막아, 특정부분에서 높은 해상도를 유지할 수있는 반면 구현이 복잡하고 계산이 더 많이 필요합니다.) 먼저 양자화 할 실수의 범위를 선택하고 이 범위를 벗어난 값은 고정합니다(clamping ,즉 상한,하한을 둠). 그리고 실수 값을 양자화된 표현의 비트 너비로 표현 가능한 정수로 매핑합니다(각 매핑된 실수 값을 가장 가까운 정수 값으로 반올림 함)
  • 사전 훈련된 부동 소수점 신경망에서 정수 연산을 가능하게 하려면 두 가지 기본 작업이 필요합니다. Quantize(양자화) : 실수를 양자화된 정수 표현으로 변환합니다(FP32 → INT8) Dequantize(양자화 해제): 양자화 된 정수 표현에서 실수로 변환합니다.(INT32 →FP16)
  • Range Mapping

        Affine Quantization 

    • $f(x) = s \dot x + z$ 의 변환식을 써보면

        Scale Quantization 

    • $f(x) = s \dot x $ 의 변환식을 써보면

    • $B$부터 $A$범위의 값들을 비트크기 b로 양자화를 싴다고 했을때 이값들은 $-2^{b-1}$부터 $2^{b-1}-1$의 범위를 갖게 됩니다.(총합 $2^b$), 이논문에선 Uniform transformations만 따지고 있기 때문에, 할 수 있는 것이 $f(x) = s \dot x + z$ 와 $f(x)= s dot x$두가지 입니다. 이를 각각Affine, scale이라고 부르겠습니다(사실 특별해 보이지만 식을 보면 알 수 있듯이, scale affine의 z가 0일때를 뜻합니다. 즉 scale은 affine의 special case임을 알 수 있습니다)
Tensor Quantization Granularity(텐서 양자화 세분성)
  • TQG 활성화에 대해 행 단위, 텐서 단위의 양자화가 가능하고, 가중치는 열 단위, 텐서 단위의 양자화가 가능한데, 활성화의 경우 성능상의 이유로 텐서 단위 양자화 만이 실용적입니다. Depthwise convolution의 경우에는 연산이 채널 별로 수행되므로 per-channel ****granularity를 적용해야 한다.
  • 양자화 세분성이란 쉽게말해 데이터나 연산을 어느 수준으로 양자화 할지를 결정하는 기준입니다. 논문에선 거친(coarest) 양자화는 텐서 요소마다(per-tensor) 양자화를 , 세밀한(finest)양자화는 각 요소마다(per-element) 양자화를 진행하게 됩니다. 세밀해 질 수록 성능저하의 가능성은 줄어들지만 연산 복잡도와 메모리 요구량이 커지기 때문에 트레이드 오프를 잘 고려하여 결정해야 합니다.
Computational Cost of Affine Quantization

    • 첫번째항은 정수 내적이고, 두번째 향 역시 정수 가중치와 제로 포인트로만 구성되어, 오프라인에서 계산할 수 있으며,(오프라인 계산이란 추론중에 실시간으로 계산이 필요한가, 미리 계산해서 저장해둘수 있는가 를 뜻합니다.) 추론시에 요소별 덧셈만 추가하면 되는데 반해, 세번째 항은 양자화된 입력 행렬 $X_q$를 포함하으로 오프라인에서 계산할 수 없게 되고(미리 계산할 수 없고, 실시간으로 계산해야함), 구현에 따라 상당한 오버헤드르 초래할 수 있기 때문에, 추론 성능을 극대화 하기 위해 가중치에 대해 스케일 양자화를 사용하게 됩니다. 후에 실험 결과로 INT8 양자화를 할 때 스케일 양자화 만으로 성능이 충분하다는 것을 보여줍니다.
    • Affine 과 Scale 방법 둘다 정수 산술을 할 수 있지만 Affine 양자화는 더 많은 계산 비용이 드는 추론을 합니다.
Calibration
  • Max : 캘리브레이션 중에 관찰된 최대 절대값을 사용합니다.
  • Entropy : 기존의 FP값과 양자화된 형식으로 표현된 값사이에 정보 손실을 최소화 하기위해 KL divergence(KL 발산)을 사용합니다.
  • Percentile : 캘리브레이션 중에 관찰된 절대값 분포의 백분위 수로 범위를 설정합니다.(예를 들면 99% 캘리브레이션이라고 하면 하위 1퍼센트의 경계에 해당하는 값을 사용하여 그 밑의 극단적인 값들은 clip시켜버립니다.)
  • 캘리브레이션은 양자화를 할때 $A$와 $B$를 선택하는 과정입니다. 편의상 스케일 양자호에 필요한 대칭범위의 캘리브레이션을 설명하겠습니다. 방법에는 총 3가지가 있습니다
Post Traning Quantization(PTQ)
  • PTQ는 이미 학습된(훈련된)신경망 모델을 양자화 하는 방법 중 하나로 모델을 다시 학습시키지 않고 완료된 후 양자화를 적용하는 방식입니다. 추가적인 학습이 필요하지 않으며 offline 에서 calibration을 진행합니다. 보통 추론 성능을 향상시키고, 메모리 사용량 및 연산 비용을 줄이기 위해 사용됩니다.
  • Weight Quantization
    • fp8에 대한 값들인데 fp32의 값들과 크게 차이 나지 않고 , 배치 정규화(BN, Batch Normalization)을 하게 되면 메모리 작업을 제거하여 추론속도를 올리게 되는데, BN 매개변수가 채널별로 학습되기 때문에, EfficientNet b0에서는 영향이 큰것으로 보인다.
    • 양자화를 독립적으로 평가함에 앞서, Max Calibration이 INT8 가중치의 정확도를 유지하는데 충분하다는 것을 보여줍니다.
  • Acivation Quntization
    • 아래 표는 다양한 캘리브레이션 방법에 대하 activation qunatization결과를 보여줬으며 대부분의 네트워크에서는 허용가능한 정도의 정확도를 달성하는 방법이 적어도 하나는 존재했지만 모든 네트워크에서 최선인 방법은 없습니다.

 

Techniques to Recover Accuracy
  • 네트웤 학습 이후 PTQ를 적용 했을때 정확도를 유지 하는 네트워크도 있는 반면, 정확도가 상당히 감소하는 경우도 존재했습니다. 이렇게 감소한 정확도를 복구하기위한 방법중 가장 간단한 방법은 partial quantization입니다. 즉 양자화에 민감한 레이어는 양자화 하지 않고 부분적으로 양자화를 진행하는것이고 또 다른 방법은 학습할때 양자화를 같이 진행하는방식 입니다.
Quantization-Aware Training
  • 둘을 비교하면 cost가 QAT가 더 많이드는 만큼 성능이 더 좋은데, 단순히 낮은 정밀도 때문이 아니라 PTQ방법은 이미 학습이 완료되어서 Global Minimum에 최적화되어있는 가중치를 덜 최적화된곳으로 보내는데 이때 만약 Loss가 Deep Convex(Loss의 최소값 주위의 영역이 좁고 깊다)라면 Loss가 크게 상승하게 됩니다. 이때 QAT방법은 학습을 진행하면서 최적화를 진행하기 때문에 가중치가 Deep Convex에 빠지기 어렵고 , 양자화가 진행되면 Loss가 Wide(손실함수의 최적화 영역이 넓어 최소값 근처에서 가중치가 변해도 성능에 큰영향을 주지않음)하게되어 PTQ방식보다 성능이 좋게 됩니다. 또한 QAT방식은 Fake Quantization(QAT는 모델을 학습하는 동안 정수연산의 영향을 고려하여 성능을 최적화 하는 방식인데, 훈련과정에서 가중치와 활성화 값을 FP가아닌 정수값으로 양자화된것처럼 처리하지만 실제 연산은 여전히 부동소수점으로 수행됩니다. 이렇게하면 모델이 학습중에 양자화된 연산의 영향을 반영하면서도, 역전파 과정에서는 부동소수점을 사용하여 정확한 기울기 계산이 가능합니다. 이는 학습중에만 사용되며 실제로 추론단계에서는 정수양자화가 진행됩니다. )를 이용하여, 영산비용에서 상당히 이점을 가져올 수 있습니다.
  • 이미 학습이 완료된 모델에 양자화를 적용하는 PTQ(Post-Training Quatization)과 달리 QAT(Quantization-Aware Training)은 양자화를 염두에 두고 학습을 진행하는 방식입니다. 모델을 학습하는 동안 8비트 정수와 같은 낮은 정밀도 연산의 영향을 미리 고려하여, 모델이 양자화 후에도 성능을 유지할 수 있도록 훈련됩니다. 학습시에 FP대신 양자화된 연산을 시뮬레이션 하므로 양자화로 인한 정확도 손실을 학습중에 보정할 수 있습니다.
Recommended Workflow

INT8 양자화 방법으로는 아래와 같이 적용합니다.

  • weight: Scale Quantization 방식과 Per-Channel, Per-Column granularity를 적용
  • Calibration으로는 Max 방법을 사용
  • Activation: Scale Quantization 방식과 Per-Tensor granularity를 적용

신경망을 양자화하기 위한 과정으로는 아래와 같은 순서로 적용

  • PTQ: PTQ 방법을 우선적으로 고려, 앞서 학습했던 Max, Entropy, Percentile Calibration에 대해서 다양하게 적용해가며 성능을 확인
  • Partial Quantization: PTQ 방법이 조금 아쉬울때 적용. Sensitive 기준으로 내림차순하여 하나씩 양자화를 죽여나가며 성능을 확인.
  • QAT: 위 두가지 방법으로도 성능이 개선되지 않을때 사용.
  • int8 양자화 방법으로는 아래와 같이 적용합니다.