6/27/2019

TensorRT 5.0 (Jetson AGX Xavier)

1. NVIDIA DEEP LEARNING SOFTWARE

가장 중요한 사이트 같으며, 며칠사이에 못보던 것들이 늘어, 이를 일일히 정리하는 것은 의미가 없을 것 같어 링크만 연결한다. (못보고 지나친건지?)
추후 이 기술들이 어떻게 통합될지도 현재 잘 모르겠으며, 변화 중이라 이 사항들은 개발관련 것만 알아두도록 하자.
  1. Mixed precision in AI frameworks (Automatic Mixed Precision)
  2. Deep Learning Primitives (cuDNN)
  3. Input Data Processing (DALI)
  4. Multi-GPU Communication (NCCL)
  5. Deep Learning Inference Engine (TensorRT)
  6. Deep Learning for Video Analytics (DeepStream SDK)
  7. Optical Flow for Video Inference (Optical Flow SDK)
  8. High level SDK for tuning domain specific DNNs (Transfer Learning Toolkit)
  9. AI enabled Annotation for Medical Imaging (AI-Assisted Annotation SDK)
  10. Deep Learning GPU Training System (DIGITS) 
  11. Linear Algebra (cuBLAS)
  12. Sparse Matrix Operations (cuSPARSE)

  https://developer.nvidia.com/deep-learning-software

1.1 TensorRT의  inference 최적화



( X축은 처리량(throughput), Y축은 응답시간(Latency) ,상위 숫자는 Batch Size)

GPU 와 CPU를 비교를 해보면, Batch Size가 두배씩 커질때마다 Latency만 비교해 보면 GPU는 크게 차이는 나지는 않지만, CPU는 많이 차이가 난다.
(GPU의 중요성)

최근에 찾은자료로 TensorRT Engine 관련내용으로 비록 오랜된 자료지만, 충분히 볼만한 것 같다.

출처:
  https://www.slideshare.net/deview/232-dl-inference-optimization-using-tensor-rt-1-119162975


2. Jetson AGX Xavier 의 TensorRT 

Jetson TX2의 TensorRT와 거의 유사하지만, 다른점은 DLA은 HW적 지원GPU의 성능이 다르므로, 관련 지원사항을 반드시 확인해야한다.
그리고 더불어 AGX Xavier에서는 TensorRT 이외 Vision Accelerator 가 존재하므로, 이 것이 Visionwork 혹은 OpenCV 기능 지원가능한지 파악을 해야겠다.
OpenVX기능을 Vision Accelerator라고 하는 것 같음

현재  문서로봐서는 VisionWork에서만 지원이 되는 것 같은데, 세부소스를 보고 분석한 다음 좀 파악을 해야할 것 같다.
HW적으로 TensorCore도 지원을 해준다고 한다.

그리고 더불어 TensorRT의 Manual update되고 있으므로, 관련기술들을 이해하기가 쉬워지는 것 같다.


ONNX Model로 TensorRT를 사용한다면, 아래와 같이 동작
  1. ONNX Model import 하고 Build TensorRT Engine 생성하여, Serialized Engine 생성
  2. Inference 로 사용될 경우, Deserialize Engine을 진행하고 이를 Inference 수행 


세부내용은 아래문서를 참조

출처:
  https://devblogs.nvidia.com/speed-up-inference-tensorrt/


2.1  TensorRT Release 정보 및 Version 
관련 특징과 필요 Package들을 파악하며, DLA 검색해서 관련 기능 파악

  • TensorRT Version 및 Package 확인
Xavier의 기본 TensorRT Package 확인 ( JetPack 4.1.1,  추후 4.2와 비교)

$  dpkg -l | grep TensorRT     // TensorRT의 Version Check 
ii  libnvinfer-dev                             5.0.3-1+cuda10.0                             arm64        TensorRT development libraries and headers
ii  libnvinfer-samples                         5.0.3-1+cuda10.0                             all          TensorRT samples and documentation
ii  libnvinfer5                                5.0.3-1+cuda10.0                             arm64        TensorRT runtime libraries
ii  tensorrt                                   5.0.3.2-1+cuda10.0                           arm64        Meta package of TensorRT

TensorRT 5.0.3 Release
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-release-notes/tensorrt-5.html#rel_5-0-3

TensorRT 5.x.x Release
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-release-notes/tensorrt-5.html#tensorrt-5


2.2 TensorRT Install Guide 

TensorRT를 사용하기 위해서 설치해야할 부분 (X86전용 Manual이므로 참조만 )
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html

Jetson TX2에서 설치한 Package 설명 (상위 Manual 기반)
  https://ahyuo79.blogspot.com/2019/05/jetpack-42.html

2.3 TensorRT의 주요기능  

TensorRT Engine의 구성은 C++로 구현이되었으며, 현재 Python API도 지원이 가능하다고 한다. 하지만 기본이 C++ 이므로 이점을 잊지말아야한다.

TensorRT의 Layers
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#layers

  • TensorRT의 Key Interface
  1. Network Definition: Network Layer를 직접 추가하고 이를 설정가능한 interface
  2. Builder: Builder는 Network Definition에서 최적화된 Engine 부터 다른 최적화기능 Interface 제공 
  3. Engine : Inference를 실행할수 있는 Engine 생성하는 Interface 
  4. Caffe Parser : Caffe Model의 Parser 기능 
  5. UFF Parser :  UFF Model의 Parser 기능 
  6. ONNX Parser : ONNX Model Parser 기능  


TensorRT의 Key Interface 설명
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#api


  • Network Definition/Builder/Engine C++ API  
Network Definition (INetworkDefinition, C++ API)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_network_definition.html

Builder (IBuilder, C++ API)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_builder.html

Engine( ICudaEngine, C++ API )
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_cuda_engine.html


2.4 TensorRT의 C++/Python API 

우선 아래의 사이트에서 C++로 TensorRT를 작성하는 예제를 이해를 해보자.
우선 TensorRT Inference Engine을 실행하기 위해서는 IExecutionContext Object필요하며,
IExecutionContext를 만들기 위해서는 상위 ICudaEngine(Engine) 을 생성해야한다고 한다.

IExecutionContext (C++API)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_execution_context.html


  • Engine 만드는 법은 두가지 방법 중 하나로 생성가능 
  1. User Model에서 직접 Network Definition을 생성, 이 경우 Engine은 옵션으로 Serialize하여 나중에 사용을 위해서 저장  
  2. disk에서 Serizilized Engine을 읽어서 실행하는 경우로 이게 성능이 좋다고하며, Model을 Pasreing하는 단계 이후에 가능  


  • 1번째방법
아래의 예제를 보면, C++ iLogger를 생성만들고 이를 iBuilder에 넣어 생성후 직접 NetworkDefinition 생성

  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#create_network_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#create_network_python


  • 2번째방법
상위 3가지 Parser중 Model을 구문분석하여, NetworkDefinition 생성
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#import_model_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#import_model_python


  • Creating the TensorRT Engine
iBuilder는 iCudaEngine을 생성
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#build_engine_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#build_engine_python


  • Creating the TensorRT Engine
Engine은 옵션으로 Serialize 하고 이를 File로 저장
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_python

  • Creating an execution context
Execution context는 Inference를 실행에 사용되어진다고 한다. (실제 inference 실행)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#perform_inference_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#perform_inference_python


  • Creating TensorRT runtime
만약 Serialized Engine File로 존재하면, 상위의 단계를 넘어갈수가 있다.
createInferRuntime(gLogger)는 아래의 iRuntime를 생성할 수 있다고 한다.


이는 DeserializeCudaEngine을 실행하면서 실제 실행을 진행한다고 하는데, 상위를 보면 Serialized를 했을 경우인것 만 같다.
(Engine은 Serialize로 File 저장)

  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_python


iRuntime
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_runtime.html


TensorRT C++ API
세부내용아래참조
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#c_topics

TensorRT API (C++ API/ Python API)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/index.html


3. TensorRT 의 Sample

기존 Jetson TX2와 거의 동일하며, 차이라면, 상위에서 설명한 DLA가 trtexec 에서 HW적으로 지원을 해준다는 것이다.

아래의 소스를 다 검토해보는 시간이 없기에, 이전에 Jetson TX2에서 실행해본 것을 참조하고 넘어가자.


$ cd /usr/src/tensorrt/samples   // Jetson TX2 의 Sample 과 거의유사함 
$ ls
common     Makefile         sampleCharRNN     sampleGoogleNet  sampleINT8API  sampleMNIST     sampleMovieLens  sampleOnnxMNIST  sampleSSD       sampleUffSSD
getDigits  Makefile.config  sampleFasterRCNN  sampleINT8       sampleMLP      sampleMNISTAPI  sampleNMT        samplePlugin     sampleUffMNIST  trtexec

$ sudo make -j4    // Build Sample , Jetson TX2와 동일 

$ cd  /usr/src/tensorrt/bin   // 실행해보면, model을 못찾는데,  이것이 tensorrt 내에도 없다. Jetpack.4.1.1 말고 추후 4.2에서 테스트 

$ ls 
chobj                     sample_fasterRCNN        sample_int8_api_debug  sample_mnist_api_debug  sample_onnx_mnist        sample_uff_mnist
dchobj                    sample_fasterRCNN_debug  sample_int8_debug      sample_mnist_debug      sample_onnx_mnist_debug  sample_uff_mnist_debug
download-digits-model.py  sample_googlenet         sample_mlp             sample_movielens        sample_plugin            sample_uff_ssd
giexec                    sample_googlenet_debug   sample_mlp_debug       sample_movielens_debug  sample_plugin_debug      sample_uff_ssd_debug
sample_char_rnn           sample_int8              sample_mnist           sample_nmt              sample_ssd               trtexec
sample_char_rnn_debug     sample_int8_api          sample_mnist_api       sample_nmt_debug        sample_ssd_debug         trtexec_debug


Xavier TensorRT Sample
  https://developer.ridgerun.com/wiki/index.php?title=Xavier/Deep_Learning/TensorRT/Building_Examples

TensorRT Sample Guide
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-sample-support-guide/index.html

3.1 DIGITS(the Deep Learning GPU Training System)

DIGITS가 아래의 Deep Learning GPU Training System이며, 숫자(DIGITS)하고 혼동하지말자
이 부분은 Training 관련부분이기때문에 이곳에서 생략하고, 추후에 사용할 경우 자세히 읽고 사용방법을 알아보자.

  https://docs.nvidia.com/deeplearning/digits/digits-installation/index.html

DIGITS Source ( DIGITS Server 운영)
  https://github.com/NVIDIA/DIGITS/releases

NVIDIA GPU Cloud와 사용가능한 것 같으며, 이전에 파악했던것으로 NVIDIA GPU Gloud는 ARM은 미지원으로 Training 위주로 사용되어진것으로 알고 있다.
(추후 GPU Cloud 접속후 지속적으로확인)
그리고 더불어 NVIDIA Docker 역시 ARM은 미지원인것으로 알고 있는데, 추후 확인하자.

  https://developer.nvidia.com/digits
  https://github.com/NVIDIA/DIGITS/blob/master/docs/ModelStore.md
  https://github.com/NVIDIA/DIGITS/tree/master/docs

DIGIST SERVER 관련 Manual
  https://docs.nvidia.com/deeplearning/digits/digits-installation/index.html#startingserver

  • Xavier의 DIGITS Model Download 기능 
이 기능을 보면, Training System을 구축한 곳에  DIGITS Server를 구축하여 이를 쉽게 Model을 가져오는 기능같다.
현재 Training System 부분의 Server가 없으므로 무용지물

$ cd /usr/src/tensorrt/bin     // DIGIT 의 기능 
$ ls 
download-digits-model.py  giexec  trtexec   

// Jetson TX2와 동일 상위 참조 , 상위 python 실행을 위해 기본설치 
$ sudo apt-get install -y python-pip python-dev  // python2    상위소스가 python 2이므로 이것만설치 
$ sudo apt-get install -y python3-pip python3-dev // python3  , 다른 소스는 python3 이므로 설치  
$ pip install wget

$ pip install requests

$ python download-digits-model.py             
usage: download-digits-model.py [-h] [-n HOSTNAME] [-p PORT] output_file
download-digits-model.py: error: too few arguments

$ python download-digits-model.py -h           // 상위 DIGITS Source는 보면, Server 돌리는 것이며, 이 python은 Local에서 DIGITS Server 주소와 연결하는 기능같다.  
usage: download-digits-model.py [-h] [-n HOSTNAME] [-p PORT] output_file

Download a DIGITS model tarball

positional arguments:
  output_file           output file (should end with .zip, .tar, .tar.gz or
                        .tar.bz2)

optional arguments:
  -h, --help            show this help message and exit
  -n HOSTNAME, --hostname HOSTNAME
                        hostname for the DIGITS server [default=127.0.0.1]
  -p PORT, --port PORT  port for the DIGITS server [default=80]


3.2 TensorRT의 DLA(Deep Learning Accelerator) 

이전의 Jetson TX2의 SW적으로 지원하던 gieexec와 trtexec기능이 Xavier에서는 HW적으로 DLA로 지원가능하며,
상위 Sample에서도 README 글을 읽어보면 지원이 가능하다.


$  cd /usr/src/tensorrt/bin     // DLA 의 기능 
$ ls 
download-digits-model.py  giexec  trtexec   

$ ./trtexec  // 옵션 과 사용법도 거의 유사

Mandatory params:
  --deploy=      Caffe deploy file
  OR --uff=      UFF file
  OR --onnx=     ONNX Model file

Mandatory params for UFF:
  --uffInput=,C,H,W Input blob name and its dimensions for UFF parser (can be specified multiple times)
  --output=      Output blob name (can be specified multiple times)

Mandatory params for Caffe:
  --output=      Output blob name (can be specified multiple times)

Optional params:
  --input=          Input blob name (can be specified multiple times)
  --model=          Caffe model file (default = no model, random weights used)
  --batch=N               Set batch size (default = 1)
  --device=N              Set cuda device to N (default = 0)
  --iterations=N          Run N iterations (default = 10)
  --avgRuns=N             Set avgRuns to N - perf is measured as an average of avgRuns (default=10)
  --percentile=P          For each iteration, report the percentile time at P percentage (0<=P<=100, with 0 representing min, and 100 representing max; default = 99.0%)
  --workspace=N           Set workspace size in megabytes (default = 16)
  --fp16                  Run in fp16 mode (default = false). Permits 16-bit kernels
  --int8                  Run in int8 mode (default = false). Currently no support for ONNX model.
  --verbose               Use verbose logging (default = false)
  --engine=         Engine file to serialize to or deserialize from
  --calib=          Read INT8 calibration cache file.  Currently no support for ONNX model.
  --useDLACore=N          Specify a DLA engine for layers that support DLA. Value can range from 0 to n-1, where n is the number of DLA engines on the platform.
  --allowGPUFallback      If --useDLACore flag is present and if a layer can't run on DLA, then run on GPU. 
  --useSpinWait           Actively wait for work completion. This option may decrease multi-process synchronization time at the cost of additional CPU usage. (default = false)



TensorRT의 DLA 사용법
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#dla_topic

TensorRT의 DLA 실제 사용예제
  https://devtalk.nvidia.com/default/topic/1041768/jetson-agx-xavier/tensorrt-5-docs-and-examples-solved-/

TensorRT의 DLA 가 지원하는 Layers
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#dla_layers

Xavier 관련 한글사이트 발견
  https://goodtogreate.tistory.com/entry/TensorRT%EC%9D%B4%EC%9A%A9%ED%95%9C-Xavier-DLA-NVDLA-%EC%8B%A4%ED%96%89

성능설정 부분 Jetson TX2와 거의 동일
  https://goodtogreate.tistory.com/entry/Jetson-AGX-Xavier-%EB%8F%99%EC%9E%91-%EB%AA%A8%EB%93%9C-%EB%B3%80%EA%B2%BD-%EB%B0%8F-TensorFlowGPU-%EC%84%A4%EC%B9%98%EC%99%80-%EC%8B%A4%ED%96%89-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%84%B1%EB%8A%A5-%EB%B6%84%EC%84%9D

  • TensorRT의 최적화 와 Profile 방법 (NSIGHT 이용 및 TensorRT의 batch등등)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-best-practices/index.html

4. Visionworks  sample

Visionworks는  Khronos OpenVX 지원을 하고 있다고 한다. Sample 예제들은 Jetson TX2의 예제들과 거의 비슷하다.
현재 HW적으로, Xavier는 Vision 관련부분이 지원하므로,  성능문제라면, Visionworks를 사용해야할지 모르겠다.

OpenVX
  https://www.khronos.org/openvx/

$  /usr/share/visionworks/sources/install-samples.sh ~/
$ cd ~/VisionWorks-1.6-Samples/
$ make -j4 # add dbg=1 to make debug build 

$ cd  ~/VisionWorks-1.6-Samples/bin/aarch64/linux/release
$ ls 
nvx_demo_feature_tracker        nvx_demo_motion_estimation  nvx_sample_nvgstcamera_capture   nvx_sample_opengl_interop
nvx_demo_feature_tracker_nvxcu  nvx_demo_stereo_matching    nvx_sample_object_tracker_nvxcu  nvx_sample_player
nvx_demo_hough_transform        nvx_demo_video_stabilizer   nvx_sample_opencv_npp_interop

$ ./nvx_demo_feature_tracker  // Jetson TX2 와 거의 비슷하다. 

$ cd  ~/VisionWorks-SFM-0.90-Samples/bin/aarch64/linux/release
nvx_sample_sfm


  https://developer.ridgerun.com/wiki/index.php?title=Xavier/JetPack_4.1/Components/VisionWorks