TensorRT 최적화 성능
TensorRT는 딥러닝 모델에서 inference를 위한 최적화 플랫폼으로 inference optimizer 와 runtime 라이브러리 등을 포함하고 있습니다.
TensorRT를 이용하여 기존의 모델을 어떻게 최적화 하는지, 그리고 최적화 된 모델의 inference 과정에서 속도가 얼마나 향상되는지 확인해 보도록 하겠습니다. 텐서플로우를 이용하여 ResNet 모델을 TensorRT으로 변환하는 방법과 성능을 비교해 보도록 하겠습니다.
실행 환경
TensorRT는 GPU 종류(Compute Capability)마다 지원되는 정밀도 모드(precision mode)가 다릅니다.
따라서 아래의 페이지를 참고하셔서 현재 테스트 예정의 GPU가 FP32, FP16, INT8 등의 TensorRT 정밀도를 지원하는지 확인해 주시기 바랍니다.
https://docs.nvidia.com/deeplearning/sdk/tensorrt-support-matrix/index.html
그리고 Tensorflow와 TensorRT를 모두 설치해 주시고, 텐서플로우에서 TensorRT가 연동이 된 것을 확인해 주시기 바랍니다.
ResNet 모델 다운로드
TensorRT 성능 측정에 사용될 모델은 텐서플로우 공식 ResNet 모델로 ImageNet 데이터셋을 이용하여 학습된 모델입니다. SavedModel 과 Frozen Graph 를 다운로드 받은 뒤에 테스트 할 수 있는데, 이 글에서는 Protobuf 형태의 Prozen Graph를 사용하도록 하겠습니다.
다음 명령어로 홈디렉터리($HOME) 에 학습된 모델 파일을 다운로드 받습니다.
$ wget -q http://download.tensorflow.org/models/official/resnetv2_imagenet_frozen_graph.pb
예제 소스코드 다운로드
그리고 다음 명령어로 예제 소스코드를 다운받습니다. ResNet 모델과 동일한 위치인 사용자 홈디렉터리에 다운 받는 것으로 가정하여 설명드리겠습니다.
$ git clone https://github.com/tensorflow/models.git
$ cd models
$ touch research/__init__.py
$ touch research/tensorrt/__init__.py
$ cp research/tensorrt/labellist.json .
$ cp research/tensorrt/image.jpg .
TensorRT 모델 변환 및 성능 측정
다운로드 받은 models 디렉터리에서 아래와 같은 명령어를 실행합니다.
$ python -m research.tensorrt.tensorrt \
--frozen_graph=$HOME/resnetv2_imagenet_frozen_graph.pb \
--image_file=$HOME/models/image.jpg \
--native --fp32 --fp16 --int8 \
--output_dir=$HOME
실행 결과
위의 명령어를 실행하면, TensorRT으로 그래프를 최적화 하고 실행 테스트를 수행하게 됩니다. 그리고 변환된 그래프가 –output-dir 위치에 저장되게 됩니다. 새롭게 생성되어 저장된 파일들은 다음과 같습니다.
log.txt
tftrt_fp16_resnetv2_imagenet_frozen_graph.pb
tftrt_fp32_resnetv2_imagenet_frozen_graph.pb
tftrt_int8_resnetv2_imagenet_frozen_graph.pb
위의 명령어를 실행 후 출력되는 로그 중에서 TensorRT가 제대로 로드되었는지 확인해 주셔야합니다.
TensorRT으로 그래프를 최적화 한 뒤에는 아래의 샘플 이미지를 이용하여 카테고리에 맞게 분류하게 됩니다.
기존 모델(Native)과 최적화된 모델을 비교했을 경우 1000개의 ImageNet 데이터셋 카테고리에서 중에서 상위 5개의 예측된 카테고리 값이 모두 일치하고 있음을 확인 할 수 있습니다.
Predictions:
Precision: native [u'seashore, coast, seacoast, sea-coast', u'promontory, headland, head, foreland', u'breakwater, groin, groyne, mole, bulwark, seawall, jetty', u'lakeside, lakeshore', u'grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus']
Precision: FP32 [u'seashore, coast, seacoast, sea-coast', u'promontory, headland, head, foreland', u'breakwater, groin, groyne, mole, bulwark, seawall, jetty', u'lakeside, lakeshore', u'grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus']
Precision: FP16 [u'seashore, coast, seacoast, sea-coast', u'promontory, headland, head, foreland', u'breakwater, groin, groyne, mole, bulwark, seawall, jetty', u'lakeside, lakeshore', u'grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus']
Precision: INT8 [u'seashore, coast, seacoast, sea-coast', u'promontory, headland, head, foreland', u'breakwater, groin, groyne, mole, bulwark, seawall, jetty', u'sandbar, sand bar', u'grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus']
TensorRT 최적화 성능
TensorRT으로 최적화된 성능을 비교해 본 결과는 아래와 같습니다. fps 라는 초당 처리속도의 값과 latency 응답 대기시간을 비교해봤습니다. fps 는 처리량을 나타낸값으로 이 값이 높을수록 성능이 좋은 것이고 latency 는 대기시간으로 짧을 수록 성능이 좋은 것입니다.
TensorRT으로 INT8정밀로도 최적화된 모델의 그래프가 최적화 되지 않은 그래프로 보다 inference 과정이 단위 시간에서 3배 이상 많다는 것을 확인 할 수 있습니다.
그리고 latency 값 또한 INT8 정밀도로 TensorRT으로 최적화 된 그래프가 최적화 되지 않은 그래프보다 3배 이상 빠르다는 것을 확인 할 수 있습니다.
FP32와 FP16 정밀도의 경우 기존 Native 보다 성능이 최적화 된 것을 알 수 있지만, 두개의 정밀도의 차이는 크게 나지 않는 것을 확인 할 수 있습니다.
아래의 내용은 log.txt 의 전체 내용입니다.
==========================
network: native_resnetv2_imagenet_frozen_graph.pb, batchsize 128, steps 100
fps median: 616.1, mean: 613.5, uncertainty: 0.6, jitter: 2.2
latency median: 0.20775, mean: 0.20866, 99th_p: 0.21632, 99th_uncertainty: 0.00373
==========================
network: tftrt_fp32_resnetv2_imagenet_frozen_graph.pb, batchsize 128, steps 100
fps median: 916.3, mean: 907.5, uncertainty: 2.4, jitter: 13.2
latency median: 0.13969, mean: 0.14114, 99th_p: 0.15287, 99th_uncertainty: 0.00282
==========================
network: tftrt_fp16_resnetv2_imagenet_frozen_graph.pb, batchsize 128, steps 100
fps median: 923.0, mean: 921.2, uncertainty: 1.1, jitter: 5.8
latency median: 0.13868, mean: 0.13898, 99th_p: 0.14517, 99th_uncertainty: 0.00501
==========================
network: tftrt_int8_resnetv2_imagenet_frozen_graph.pb, batchsize 128, steps 100
fps median: 2109.9, mean: 2098.8, uncertainty: 4.6, jitter: 33.0
latency median: 0.06067, mean: 0.06102, 99th_p: 0.06473, 99th_uncertainty: 0.00027
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)