새소식

반응형
Vision AI/미분류

mmdeploy에서 TensorRT int8 quantization 모델 변환해보기

  • -
반응형

mmdeploy 환경 세팅

 

😀 사전 지식

- mmpretrain은 mmclassification의 최신 framework 이름이다.

- 경량화 툴킷 정리해본 글 >> https://beelinekim.tistory.com/96

 

1. Docker pull을 받는다. 이 docker에는 CUDA, CUDNN, python, torch, tensorRT, ONNX, OPenVINO, ncnn이 다 세팅되어 있다.

https://github.com/open-mmlab/mmdeploy/blob/main/docs/en/01-how-to-build/build_from_docker.md

docker pull openmmlab/mmdeploy:ubuntu20.04-cuda11.3-mmdeploy

docker 세팅 환경은 다음과 같다. 참고로 이 docker를 받아도 ncnn 변환은 되지 않았다.

Item Version
OS Ubuntu20.04
CUDA 11.3
CUDNN 8.2
Python 3.8.10
Torch 1.10.0
TorchVision 0.11.0
TorchScript 1.10.0
TensorRT 8.2.3.0
ONNXRuntime 1.8.1
OpenVINO 2022.3.0
ncnn 20221128
openppl 0.8.1

 

2. 받은 docker image로 container를 만든다. 네이밍과 마운트는 본인의 환경에 맞게 세팅

docker run -it -d \
        --ipc=host \
        --gpus all \
        --name mmdeploy \
        -w /mnt \
        -v /mnt:/mnt \
        openmmlab/mmdeploy:ubuntu20.04-cuda11.3-mmdeploy \
        /bin/bash

 

3. 필요한 툴을 설치한다. 본인이 쓸 mm framework와 기타 필요한 툴을 설치한다.

pip install mmpretrain future tensorboard

 

4. 이 정도 준비가 됐으면 모델 변환할 준비는 다 되었다. 다행히 docker가 있어서 환경세팅이 어렵진 않다.

 

5. Pytorch FP32 모델을 TensorRT int8 모델로 변환하기

python3 tools/deploy.py \
    configs/mmpretrain/classification_tensorrt-int8_dynamic-224x224-224x224.py \
    /workspace/mmpretrain/my_configs/exp1_resnet50.py \
    /workspace/mmpretrain/work_dirs/exp1_resnet50/epoch_30.pth \
    /workspace/mmpretrain/data/cropped_image/validation/0/image_1.jpg \
    --work-dir ./work_dir/classification_tensorrt-int8_dynamic
    --device cuda
    --quant \
    --quant-image-dir /workspace/mmpretrain/data/validation/0/

명령어를 제외하고 두 번째 줄 부터 순차적으로 설명을 하면,

 

configs/mmpretrain/classification_tensorrt-int8_dynamic-224x224-224x224.py

>> mmdeploy에서 변환에 사용할 config 경로

 

/workspace/mmpretrain/my_configs/exp1_resnet50.py

>> mmpretrain에서 학습했던 config 경로

 

/workspace/mmpretrain/work_dirs/exp1_resnet50/epoch_30.pth

>> mmpretrain에서 학습했던 모델, tensorRT로 변환할 모델 경로


/workspace/mmpretrain/data/cropped_image/validation/0/image_1.jpg

>> 모델 변환 전(pytorch 모델)과 후(tensorRT 모델)에 인퍼런스 테스트를 해 볼 1장의 이미지 경로


--work-dir ./work_dir/classification_tensorrt-int8_dynamic

>> 변환된 tensorRT 모델을 저장할 경로


--device cuda

>> 변환에 사용할 device


--quant

>> quantization 모델을 만들어라는 옵션


--quant-image-dir /workspace/mmpretrain/data/validation

>> Post Training Quantization 적용을 위해 calibration할 데이터셋 폴더 경로

 

6. --work_dir 경로에 모델이 만들어 졌을 것이고, 테스트를 해 볼 수 있다.

python3 tools/test.py \
    configs/mmpretrain/classification_tensorrt-int8_static-224x224.py \
    /workspace/mmpretrain/my_config/exp1_resnet50.py \
    --model ./work_dir/classification_tensorrt-int8_dynamic/end2end.engine \
    --device cuda \
    --speed-test \
    --batch-size 1

end2end.engine이 tensorRT 모델이다.

 

 

내가 테스트 해 봤을 때

 

FP32 torchscript 모델의 용량은 91MB, GPU 처리 속도는 131.69 FPS

INT8 TensorRT 모델의 용량은 24MB, GPU 처리 속도는 1144.47 FPS

의 결과를 보였다. 

 

 

모델 용량 75% 감소, 인퍼런스 속도 8.7배 증가라는 결론을 얻을 수 있었다.

 

 

 

도움이 되셨다면 아무 광고나 클릭 한 번 부탁드립니다👍

 

반응형

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감과 광고 클릭 부탁드립니다~