DEV Community

Sang-moon, Lee
Sang-moon, Lee

Posted on • Edited on

TensorRT를 사용하여 ONNX 모델을 최적화하고 배포하는 방법

Image description

들어가며

딥러닝 모델을 배포할 때 성능 최적화는 중요한 요소이다. NVIDIA의 TensorRT는 이러한 최적화와 메모리를 절약할 수 있도록 하며, 특히 추론 속도 향상과 효율적인 메모리 사용을 통해 실시간 애플리케이션 개발에 도움을 준다. 여기에서는 딥러닝 모델의 표준 형식인 ONNX 모델을 TensorRT 엔진 파일로 변환하는 과정을 다루고자 한다.
ONNX 파일을 TensorRT 엔진으로 변환하는 이유는 여러 가지일 수 있다. 첫째, TensorRT의 다양한 최적화 기술(정밀도 변환, 메모리 최적화 등)을 통해 추론 성능을 극대화할 수 있다. 둘째, TensorRT 엔진 파일로 변환된 모델을 배포 시 GPU 하드웨어의 자원을 최대한 활용하여 빠르고 효율적으로 사용할 수 있게 한다.
TensorRT의 명령줄 도구인 trtexec를 사용하여 ONNX 모델을 다양한 정밀도(FP32, FP16, INT8)로 변환하는 방법도 알아보고, 각 변환 방식에 따른 설정과 강점, 변환된 엔진 파일을 테스트하는 방법도 정리하려고 한다.

trtexec 소개 및 설치 위치

trtexec는 TensorRT에서 제공하는 명령줄 도구로, 사용자가 쉽게 ONNX 모델을 TensorRT 엔진 파일로 변환할 수 있도록 해준다. trtexec는 ONNX 모델의 엔진 파일 생성뿐만 아니라 추론 성능 테스트, 메모리 최적화 등도 수행할 수 있다. 다양한 정밀도와 배치 설정을 할 수 있으며 성능 비교도 가능하다.
일반적으로 trtexec는 TensorRT가 설치된 경로인 /usr/tensorrt/bin/ 폴더에 위치해 있다. 만약 환경 변수에 경로가 추가되지 않았다면 ~/.bashrc를 다음과 같이 설정하고 터미널에서 trtexec 명령어를 바로 실행할 수 있도록 만들어두면 편리하다.

export PATH=$PATH:/usr/src/tensorrt/bin
Enter fullscreen mode Exit fullscreen mode

기본 변환 절차 및 옵션 설명

ONNX 파일을 TensorRT 엔진 파일로 변환할 때 기본적으로 FP32(32비트 부동소수점) 정밀도록 변환하게 된다.

trtexec --onnx=model.onnx --saveEngine=model.engine --explicitBatch
Enter fullscreen mode Exit fullscreen mode
  • --onnx: 변환할 ONNX 모델 파일의 경로를 지정한다. 이 옵션은 필수이다.
  • --saveEngine: 변환된 TensorRT 엔진 파일을 저장할 경로를 지정한다.
  • --explicitBatch: TensorRT에서 명시적으로 배치 사이즈를 사용하도록 설정한다.

INT8 정밀도 변환 및 캘리브레이션 설명

INT8 정밀도는 FP32와 비교해 메모리 사용량과 추론 시간이 크게 줄어들기 때문에, 고성능이 요구되는 애플리케이션에서 유용하다. 다만 INT8 정밀도로 모델을 변환하려면 캘리브레이션 파일이 필요하다. 캘리브레이션 파일에는 특정 데이터셋의 통계 정보가 포함되어 있어, TensorRT가 32비트에서 8비트 정밀도로 전환할 때 모델 정확도를 유지할 수 있도록 해준다.
캘리브레이션 파일이 cal.bin이라는 이름으로 저장된 경우, 다음과 같은 명령어로 INT8 정밀도 엔진 파일을 생성할 수 있다.

trtexec --onnx=model.onnx --saveEngine=model_int8.engine --explicitBatch --int8 --calib=cal.bin
Enter fullscreen mode Exit fullscreen mode
  • --int8: INT8 정밀도를 사용하여 모델을 변환하도록 지정한다.
  • --calib: INT8 변환에 필요한 캘리브레이션 파일을 지정한다. 캘리브레이션 파일이 없으면 정확도가 떨어질 수 있다.

FP16 변환 및 추가 옵션 설명

FP16(16비트 부동소수점) 정밀도는 FP32보다 적은 메모리를 사용하고, INT8보다는 정확도를 높일 수 있지만 속도는 느리다. FP16 변환은 최신 GPU에서 특히 효과적이며, 추가적인 캘리브레이션 파일 없이 바로 사용할 수 있다.

trtexec --onnx=model.onnx --saveEngine=model_fp16.engine --explicitBatch --fp16
Enter fullscreen mode Exit fullscreen mode
  • --fp16: FP16 정밀도로 변환을 수행한다. 이 옵션을 사용하려면 FP16을 지원하는 하드웨어(GPU)가 필요하다.

추가 옵션 및 설정

trtexec에는 성능 최적화를 위해 사용할 수 있는 추가 옵션이 있다.

  • --workspace: 엔진 파일 생성 시 사용할 최대 메모리 공간을 지정한다. 예를 들어 --workspace=1024라고 지정하면, 1GB 메모리를 사용할 수 있다.
  • --verbose: 엔진 생성 및 추론 수행 시 상세한 로그를 출력하여 디버깅을 용이하도록 한다.

변환 후 테스트 및 검증

변환된 엔진 파일의 성능을 검증하기 위해 trtexec를 사용하여 추론 속도와 메모리 사용량 등을 테스트할 수 있다.

trtexec --loadEngine=model_int8.engine --verbose
Enter fullscreen mode Exit fullscreen mode

위 명령어는 model_int8.engine 파일을 로드하여 성능을 검증하며, --verbose 옵션을 통해 상세한 로그를 확인할 수 있다.

마무리

이 글에서는 trtexec를 사용하여 ONNX 모델을 TensorRT 엔진 파일로 변환하는 방법과 FP32, FP16, INT8 정밀도 변환 과정에서 필요한 설정과 옵션을 소개했다. TensorRT를 활용하면 고성능 추론 환경을 구축할 수 있어 실시간 애플리케이션 개발에 도움을 제공한다.

Top comments (0)