Quantization
프로젝트에서 사용될 언어 모델의 규모가 너무 커
기존에 연구하기 위해 사용해본 torch.quantization 모듈은 추론시 GPU를 사용할 수 없다는 단점이 있었습니다.
이를 해결하기 위해 ONNX를 활용할 수 있을 것입니다.
먼저 Pytorch를 활용하여 Activation과 Weight에 대한 Scale을 진행하는 Layer를 생성하고, ONNX로 변환하여 Quantization을 진행합니다.
그리고 GPU로 불러와서 추론을 진행하는 방식으로 해결해볼 생각입니다.
ONNX
어쩌면 ONNX에서 모듈을 수정할 수 있을 것 같아서 먼저 ONNX가 무엇인지, Pytorch와는 어떤 관계인지 알고 가야할 것 같습니다.
ONNX Quantization
위 방법을 실행하기 전에 Scaling을 진행하는 레이어에 대해서는 Quantization이 진행되지 않아야 하는 것을 확인해야 합니다.
또 pytorch 모델을 onnx로 변환하고 이를 Quantization 하여 추론하는 방법을 알아야 하죠.
간단한 모델을 활용해서 테스트를 해보자구요.
1
1
먼저 SmoothQuant의 레이어와 같이 입력에 Scaling을 적용한 후 연산을 진행하는 방법으로 간단한 모델을 구현해봤습니다.
Dummy 입력을 모델에 넣었더니, 52.9578 이라는 결과를 얻을 수 있었습니다.
1
1
이제 이 모델을 ONNX로 변환하였습니다.
변환시 입력의 크기를 알기 위해 Dummy Input을 요구하더라구요.
이후 변환된 ONNX 파일을 불러와 추론을 하였습니다.
PyTorch 모델과 같은 결과를 얻는 것을 볼 수 있었죠.
1
1
Dynamic Quantization을 사용하여 모델을 변환하고 이를 같은 입력에 대해 추론을 진행하였습니다.
기존 결과와 약간 달라지는 것을 볼 수 있었죠.
아무튼 이런 방식으로 Quantization을 적용할 수 있겠네요.
그런데 과연 우리가 원하는 대로 Non-Learnable Parameter에 대해서도 양자화가 진행되는지 확인할 필요가 있을 것 같습니다.
그래야 SmoothQuant를 적용할 수 있으니까요.
1
1
결과를 보니 CustomModule에서 설정한 scale 값을 양자화 없이 입력 x에 곱하고난 후 Linear 레이어에 넣는 것을 확인할 수 있습니다.
아마 ONNX에서 미리 지정해둔 형식의 레이어에 대해서만 Quantization을 진행하는 것 같아요.
SmoothQuant를 적용하는 것이 어렵지 않겠네요.
ONNX SmoothQuant
위와 같은 방식으로 ONNX에서 SmoothQuant를 적용하여 GPU를 이용한 추론을 진행할 수 있다는 것을 보았습니다.
그렇다면 실제로 BERT 모델에 적용하여 테스트를 진행해볼게요.
1
SmoothQuant가 작은 모델에 대해서 좋은 성능을 내지 못하지만,
예전에 테스트를 진행했던 BERT-Large 모델의 QNLI 작업은 SmoothQuant를 적용하였을 때 기존의 Quantization 방식보다 더 높은 정확도를 보여주었기에 이를 활용하겠습니다.
1
ONNX 모델과 비교를 하기 위해 test 데이터를 통해 추론을 진행하였습니다.
또 모델을 기본적인 Quantization 방법을 적용하여 테스트한 결과와 비교하기 위해
1