기초 지식

TensorRT란?

도시쥐 2022. 2. 27. 00:14

안녕하세요!

 

 

오늘은 NVIDIA의 TensorRT에 대해 알아보려고 합니다.

 

NVIDIA의 TensorRT

 

TensorRT란, NVIDIA사에서 개발한 딥러닝 연산 최적화 엔진입니다. 기존 딥러닝 프레임워크(PyTorch, TensorFlow, Caffe 등)가 네트워크를 구성하고 이를 모델로 만들었다면, TensorRT는 이러한 모델을 자체적인 여러가지 최적화 과정을 거쳐 NVIDIA의 GPU, DLA등에 효율적으로 싣는 역할을 합니다. 또한 최적화 과정을 거쳐 만들어낸 '엔진'을 binary 형태로 저장(blob의 형태로 저장합니다)하고 사용할때 마다 '엔진'을 deserialize하여 사용합니다.

 

 

https://opac.tistory.com/5

 

blob 이란?

Blob이란 무엇일까요? Binary Large Object의 약자로 어떠한 큰 객체를 Binary(2진수) 형태로 저장하는 데 사용합니다. 독립체(entity)로 된 2진수의 집합이라고 볼 수 있습니다. 그럼 여기서 2진수로 된 객

opac.tistory.com

 

 

 

앞으로 블로그에서 기존 딥러닝 프레임워크(PyTorch, TensorFlow등)을 거치지 않고 직접 (학습된 가중치를 따로 가져와야하지만..) TensorRT API를 통한 TensorRT 프로그래밍도 다룰 예정입니다. 

 

 

 

 

TensorRT는 여러가지 최적화 기법을 사용해 딥러닝 모델을 최적화 시켜 연산속도를 향상시킵니다.

 

 

 

 

 

TensorRT에서 이용하는 대표적인 최적화 기법에 대해 몇가지 소개하자면

 

 

 

 

 

1. Graph Optimization

TensorRT Graph Optimization

TensorRT에 적용되는 Graph Optimization으로 여러단계로 설정되어 있는 Layer들을 Layer Fusion과 Tensor Fusion을 통해 '동시에' 연산하여 속도를 향상 시킵니다. 자세히는 Layer Fusion은 Vertical Fusion과 Horizontal Fusion 그리고 Tensor Fusion을 통해 Model Graph를 단순화 시키고 모델의 Layer개수가 크게 감소하게 됩니다.

 

 

 

 

TensorRT Optimization LOG기록

 

위 로그는 실제 TensorRT 엔진을 생성할 때 나오는 로그입니다. Layer fusion등을 통해 Layer수가 줄어드는 것을 확인할 수 있습니다.

 

 

 

 

 

 

2. Quantization & Precision Calibration

TensorRT Quantization & Calibration

TensorRT는 자체적으로 FP16, INT8 datatype까지의 reduced Precision 기술을 지원합니다. 낮은 Precision의 Network일수록 당연하게 data의 크기 및 weight의 bit수가 작기 때문에 빠르고 효율적인 연산이 가능합니다.

 이를테면, weight를 표현하는 bit수가 작아질수록 DRAM에서 GPU가 읽어와야 할 데이터의 크기는 줄어들 것입니다. 이러한 Data Movement가 줄어들면 energy consumption이 줄어들 수 있습니다. 또한 실제 연산시간도 줄일 수 있을 것입니다.

 

 

 

 

 

Bit-Precision에 따른 Operation별 Energy Cost와 Area Cost

위의 차트는 딥러닝 모델의 대부분을 이루고 있는 MAC연산과 DRAM에서 데이터를 불러올 때 요구되는 Energy CostArea Cost를 나타낸 표입니다. 표에서 보시는바와 같이 Add연산의 경우 bit수에 따라 약 2배씩, Multiply연산과 DRAM Read연산의 경우 bit수에 따라 지수적으로 증가하는 것을 볼 수 있습니다. 

 

 

 

 

TensorRT는 INT8과 같이 Accuracy-drop이 크게 예상되는 네트워크에서는 Calibration을 지원합니다. 종류는 EntropyCalibrator, EntropyCalibrator2를 지원하고 이를 이용해 Quantization(양자화)를 수행할 때 weight와 intermediate tensor들의 정보 손실의 최소화 할 수 있습니다.

 

 

 

 

이와 같이 TensorRT에서는 INT8까지의 Quantization을 지원하여 딥러닝 모델을 Energy-efficient하게 연산을 더욱 효율적으로 처리할 수 있게되는 것입니다. 

 

 

 

 

 

 

3. Kernel Auto-tuning

TensorRT는 사용하는 플랫폼별로 엔진을 따로 생성해줘야 합니다. 예를들어, Jetson AGX Xavier 보드에서 생성한 엔진은 NX Xavier 보드에서는 실행할 수 없는 것입니다. 이러한 이유는 TensorRT가 NVIDIA에서 제공하는 다양한 플랫폼과 아키텍쳐에 맞는 Runtime을 따로 생성해주기 때문입니다. 

 

 

TensorRT는 각기 다른 플랫폼에서 engine의 개수, 아키텍쳐, 메모리등 최적의 kernel을 찾아서 선택적으로 엔진을 생성해주게 됩니다.

 

 

 

 

 

 

4. Dynamic Tensor Memory & Multi-stream execution

자체적인 Memory Management 시스템으로 footprint를 줄여 데이터의 Reuse기회를 늘려줄 수 있는 Dynamic tensor memory기능이 있습니다.

 

 

 

CUDA Stream기술을 활용해서 여러개의 input stream을 스케쥴링을 통해 최적의 병렬처리 효율을 만들어 낼 수 잇습니다. 이를 Multi-stream execution기술이라고 합니다.

 

 

 

 

 

 

 

이상으로 TensorRT에 대한 설명을 마치겠습니다.

 

 

 

추후 TensorRT API를 통한 TensorRT 프로그래밍에 대해서도 많은 관심 부탁드립니다.

 

 

감사합니다!

 

 

 

*올바른 피드백은 언제나 환영입니다.

'기초 지식' 카테고리의 다른 글

blob 이란?  (0) 2022.02.15
구글 드라이브와 코랩(Colab) 연동하기  (0) 2022.02.07