Deep Learning

Pytorch를 이용한 Quantization

jinmc 2023. 1. 25. 17:32
반응형

Quantization이란 무엇일까요?

딥러닝이라고 하면 보통 여러개의 node들과 이들로 이루어진 layer, 그리고 layer들을 서로 연결하는 activation들로 이루어져 있다고 할 수 있겠습니다. 각각의 Node들은 각자 Weight과 Bias들을 가지고 있으며, activation들은 RELU, softmax, Sigmoid, Tanh, Leaky Relu 등 여러가지가 있다고 볼 수 있을 것입니다.

 

레퍼런스에 따르면, pytorch 1.3, 그리고 1.4에서 torchvision 0.5에서 지원된다고 합니다.

 

그럼 Quantization은 왜 하는 걸까요?

위에서 말한 Weight 와 Bias들은 보통 float32로 표현되는데, float32에서 32의 표현은 

32비트를 사용한다는 의미입니다.

Quantizaition을 하는 경우에는 int8을 사용하는데, int8의 경우 8bit를 사용하는 것으로 알려져 있습니다.

정수연산이 보통 소수연산보다 빠르고, 저장하는데에도 32비트가 아닌 8비트를 사용하기 때문에,

모델 크기도 작아지기 때문에 이론적으로 훨씬 빨라지면서도 정확성 측면에서 약간만 떨어지는 걸 목표로 합니다.

 

그럼 얼마나 빨라질까요?

라고 합니다.

pytorch 공식 블로그에서는, 다음과 같이 2배에서 4배 정도 빨라진다고는 하는데, 정확한 건 해봐야 알것 같습니다.

 

그럼 Pytorch 에서 Quantization을 하게 하는 방법은?

다음과 같은 과정을 통해서 quantization을 직접 한다고 하네요.

 

1. Pytorch에서는 Quantized Tensor라는 datatype이 있다고 합니다. 

2. 이 Quantized Tensor를 floating point tensor 같이 kernel을 구현하는 것이 가능합니다. Pytorch는 torch.nn.quantized, torch.nn.quantized.dynamic 등의 name-space를 통해서 quantized module을 서포트합니다.

3. quantized한 모델들은 floating point model들과 함께 섞어서 사용 가능하며, 같은 형식으로 취급 됩니다.

4. floating point tensor랑 quantized tensor를 매핑하는데 oberserver/fake-quantization block 을 사용해서 조작이 가능합니다.

 

그럼 Quantization의 종류는 무엇무엇이 있나요?

1. Dynamic Quantization

 - Dynamic Quantization은 Activation을 int8로 바꿔주는 것 분만 아니라 행열 연산 도중 float를 int로 바꾼 이후 정수연산 이후 결과는 다시 float로 메모리에 저장하는 형태라고 합니다.

2. Post-Training Static Quantization

 -  모델의 weight와 activation의 quantization을 사전에 진행합니다.

  • weight와 activation을 fusion
  • calibration하는 동안 활성화가 설정됨

 

3. Quantization Aware Training

 - 모델의 weight와 activation을 training 하면서 quantization을 같이 진행

 - fake-quantization modules/nodes를 양자화가 되는 부분에 위치를 시킨다고 합니다.

 

 - dynamic, static quantization으로 성능이 나오지 않는 CNN모델에서 활용된다고 합니다.

이렇게 세 가지 종류가 있습니다.

 

그리고 각각 언제 사용하면 좋은지는 다음과 같습니다.

 

Reference : 파이토치 블로그(영어), velog_quantization

반응형