한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
TensorFlow 1.7과 TensorRT를 통합했습니다
2018년 5월 7일 월요일
<블로그 원문은
이곳
에서 확인하실 수 있으며 블로그 번역 리뷰는
신정규(MachineLearning GDE)
님이 참여해 주셨습니다>
게시자:
Laurence Moroney
(Google) 및 Siddarth Sharma(NVIDIA)
오늘 저희는 NVIDIA® TensorRT
TM
와 TensorFlow의 통합을 알려드리고자 합니다. TensorRT는 추론에 맞게 딥 러닝 모델을 최적화하는 라이브러리이자 프로덕션 환경에서 GPU에 배포하기 위한 런타임을 생성하는 라이브러리입니다. TensorRT는 여러 가지 FP16 및 INT8 최적화를 TensorFlow에 적용하며, 추론 중에 GPU에서 처리량을 최대화하고 지연 시간을 최소화하기 위해 플랫폼별 커널을 자동으로 선택합니다. 세계적 수준의 성능으로 TensorFlow 내에서 TensorRT 사용 경로를 단순화해 주는 새로운 통합 워크플로를 발표하게 되어 기쁘게 생각합니다. 저희 테스트에 따르면 ResNet-50은 NVIDIA Volta Tensor Core를 사용하는 TensorFlow-TensorRT 통합에서 TensorFlow 단독 실행 시에 비해 7ms 미만의 지연 시간에 8배 더 빠른 성능을 발휘했습니다.
TensorFlow 내에서 서브그래프 최적화
이제 TensorFlow 1.7에서 TensorRT는 호환되는 서브그래프를 최적화하고 나머지는 TensorFlow가 실행하도록 합니다. 이 접근방식을 사용하면 광범위한 TensorFlow 기능을 사용하여 신속하게 모델을 개발할 수 있으며, 추론 수행 시에 TensorRT를 통해 강력한 최적화가 가능합니다. TensorFlow 모델과 함께 TensorRT를 이미 사용 중인 경우, 아시다시피 지원되지 않는 일부 TensorFlow 레이어를 수동으로 가져와야 했으며, 일부 경우에 많은 시간이 소모될 수 있습니다.
워크플로 관점에서는 TensorFlow의 서브그래프를 최적화하도록 TensorRT에 요청해야 하고 또한 각 서브그래프를 TensorRT 최적화된 노드로 바꾸도록 TensorRT에 요청해야 합니다. 이 단계의 출력은 이전과 같이 TensorFlow에 사용될 수 있는 동결 그래프입니다.
추론 중에 TensorFlow는 지원되는 모든 영역에 대해 그래프를 실행하며, TensorRT 최적화된 노드를 실행하기 위해 TensorRT를 호출합니다. 예를 들어, 그래프에 3개의 세그먼트 A, B, C가 있는 경우 세그먼트 B가 TensorRT에 의해 최적화되어 단일 노드로 바뀝니다. 추론 중에 TensorFlow는 A를 실행한 다음, B를 실행하기 위해 TensorRT를 호출하고, 그런 다음 TensorFlow가 C를 실행합니다.
TensorRT 최적화를 위해 새로 추가된 TensorFlow API는 동결 TensorFlow 그래프를 취하고, 최적화를 서브그래프에 적용하고, 최적화가 적용된 TensorRT 추론 그래프를 TensorFlow로 다시 보냅니다. 아래 코드를 예시로 참조하세요.
# Reserve memory for TensorRT inference engine
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction = number_between_0_and_1)
...
trt_graph = trt.create_inference_graph(
input_graph_def = frozen_graph_def,
outputs = output_node_name,
max_batch_size=batch_size,
max_workspace_size_bytes=workspace_size,
precision_mode=precision) # Get optimized graph
per_process_gpu_memory_fraction 매개변수는 TensorFlow에 사용할 수 있는 GPU 메모리 부분을 정의하며, 그 나머지 부분은 TensorRT에 사용할 수 있습니다. 이 매개변수는 TensorFlow-TensorRT 프로세스가 처음 시작될 때 설정되어야 합니다. 예를 들어, 값 0.67은 GPU 메모리의 67%를 TensorFlow에 할당하고 나머지 33%는 TensorRT 엔진에 할당합니다.
create_inference_graph 함수는 동결 TensorFlow 그래프를 취하고, TensorRT 노드와 함께 최적화된 그래프를 반환합니다. 함수의 매개변수에 대해 살펴보겠습니다.
input_graph_def: 동결 TensorFlow 그래프
outputs: 출력 노드의 이름이 있는 문자열 목록. 예: ["resnet_v1_50/predictions/Reshape_1"]
max_batch_size: 정수, 입력 배치의 크기. 예: 16
max_workspace_size_bytes: 정수, TensorRT에 사용 가능한 최대 GPU 메모리 크기
precision_mode: 문자열, 허용되는 값 "FP32", "FP16" 또는 "INT8"
예를 들어, GPU에 12GB 메모리가 있는 경우 TensorRT 엔진에 ~4GB를 할당하려면 per_process_gpu_memory_fraction 매개변수를 ( 12 - 4 ) / 12 = 0.67로 설정하고
max_workspace_size_bytes
매개변수를 4000000000으로 설정합니다.
새로운 API를 ResNet-50에 적용하고 TensorBoard에서 최적화된 모델이 어떻게 보이는지 알아보겠습니다. 이 예시를 실행하기 위한 전체 코드가 제공됩니다 . 왼쪽 이미지는 TensorRT 최적화가 없는 ResNet-50이고 오른쪽 이미지는 최적화 이후입니다. 이 경우, 그래프의 대부분이 TensorRT에 의해 최적화되어 단일 노드로 바뀝니다(강조 표시됨).
최적화된 INT8 추론 성능
TensorRT는
단정밀도(FP32) 및 반정밀도(FP16)로 훈련된 모델을 취할 수 있으며, INT8 양자화를 사용하여 감소된 정밀도와 최소한의 정확도 손실로 이 모델을 변환하고 배포할 수 있습니다. INT8 모델은 계산 속도가 더 빠르고 대역폭 요구사항은 더 낮지만, 사용 가능한 동적 범위가 감소하기 때문에 신경망의 가중치와 활성화를 표현하는 데 어려움이 있습니다.
동적 범위
최소 양수
FP32
-3.4×1038 ~ +3.4×1038
1.4 × 10−45
FP16
65504 ~ +65504
5.96 x 10-8
INT8
-128 ~ +127
1
이를 해결하기 위해 TensorRT는 FP32 네트워크를 근사화할 때 제한적 8비트 정수 표현으로 정보 손실을 최소화하는 보정 프로세스를 사용합니다.
새로운 통합에서는 TensorRT로 TensorFlow 그래프를 최적화한 후 아래와 같이 보정을 위해 이 그래프를 TensorRT에 전달할 수 있습니다.
trt_graph=trt.calib_graph_to_infer_graph(calibGraph)
추론 워크플로의 나머지 부분은 위에서 변경되지 않은 상태로 유지됩니다. 이 단계의 출력은 앞에 설명한 대로 TensorFlow에 의해 실행되는 동결 그래프입니다.
NVIDIA Volta GPU에서 Tensor Core를 자동으로 사용
추론을 위해 TensorRT는 Volta GPU의 Tensor Core에서 반정밀도 TensorFlow 모델을 실행합니다. Tensor Core는 단정밀도 수학 파이프라인에 비해 8배 더 많은 처리량을 제공합니다. 고정밀도인 FP32 또는 FP64에 비해 반정밀도인 FP16 데이터는 신경망의 메모리 사용량을 줄여줍니다. 이렇게 하면 더 큰 네트워크의 훈련과 배포가 가능하며, FP16 데이터 전송은 FP32 또는 FP64 전송에 비해 시간이 덜 걸립니다.
각 Tensor Core는 D = A x B + C를 수행하며, 여기서 A, B, C, D는 행렬입니다. A 및 B는 반정밀도 4x4 행렬인 반면, D 및 C는 반정밀도 또는 단정밀도 4x4 행렬입니다. V100에서 Tensor Core의 최대 성능은 배정밀도(FP64)에 비해 약 10배 더 빠르고 단정밀도(FP32)에 비해 약 4배 더 빠릅니다.
지원
이번 릴리스에 대해 기쁘게 생각하며, 이 통합을 개선하기 위해 NVIDIA와의 긴밀한 협력을 계속하겠습니다. 이 새로운 솔루션이 TensorFlow의 용이성과 유연성을 유지하면서도 가능한 최고의 성능을 보장해줄 것으로 기대합니다. 또한 TensorRT가 더 많은 네트워크를 지원함에 따라, 코드를 변경하지 않고도 자동 업데이트의 이점을 누릴 수 있게 될 것입니다.
새로운 솔루션을 구하려면, TensorFlow 1.7이 출시된 후에 다음과 같은 표준 pip 설치 프로세스를 사용할 수 있습니다.
pip install tensorflow-gpu r1.7
그 때까지는 여기에서 상세 설치 지침을 찾아보세요:
https://github.com/tensorflow/tensorflow/tree/r1.7/tensorflow/contrib/tensorrt
사용해 보시고 여러분의 의견을 들려주십시오!
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed