4/30/2019

NVIDIA의 Deep Learning-TensorRT

1. NVIDIA DEEP LEARNING SDK 구조 및 기본설명

NVIDIA의 Deep Learning 전체 시스템을 간단히 보면, TRAINING 과 INFERENCE 로 나누어지며, TRAINING을 통해 DATA MODEL을 만들고,
이 MODEL를 가지고 INFERENCE 에서 적용하는 방식이다.

정말 단순하고 당연한 구조이지만, NVIDIA만의 특징은 상위 두 기능에 각각의 NVIDIA의 기능들을 제공하고 있기때문이다.

Training And Inference


NVIDIA Deep Learning SDK

상위에서 설명한 기능들을 살펴보자.
현재 NVIDIA의 공식사이트에서 확인된 기술은 다음과 같으며, 확인할때 마다 지속적으로 변경되는 것으로 보아 앞으로도 확장이 될 것 같다.
  1. Deep Learning Primitives (CUDA® Deep Neural Network library™ (cuDNN))
  2. Deep Learning Inference Engine (TensorRT™ )
  3. Deep Learning for Video Analytics (NVIDIA DeepStream™ SDK)
  4. Linear Algebra (CUDA® Basic Linear Algebra Subroutines library™ (cuBLAS))
  5. Sparse Matrix Operations (NVIDIA CUDA® Sparse Matrix library™ (cuSPARSE))
  6. Multi-GPU Communication (NVIDIA® Collective Communications Library ™ (NCCL))


CUDA는 NVIDIA에서 제공하는 Graphic Library로 그중에서 포함된 기능들을 설명한다.

  • CUDA/CuDNN
CuDNN은 CUDA Deep Learning Network Library라고 하며, DNN위한 Library라고 한다.
Convolution , Pooling,을 제공을 해주며, 다양한 Deep Learning Framework에서 사용되어진다고 한다.


  • CUDA/cuBLAS
선형대수라고하며, CPU의 MKL BLAS Library보다, 6배이상으로 빠르다고 하면, GPU Library 라고하는데, 사용을 해봐야 알것 같다.
CUDA 내부 역할을 잘모르기 때문에, 이부분을 단정지어 말하기가 애매하다.


  • CUDA/cuSPARSE
cuBLAS와 cuPARSE와의 차이는 잘모르겠으며,  CPU의 MKL BLAS의 역할하는 것 같으며, 명확하지 않다.
Matlab 처럼 Matrix의 기능을 빠르게 지원을 해주는 것으로 생각된다.


일단 상위 3개의 기능이 CUDA에 포함이 되고 있으며, 이를 구분해서 알아두자.


  • TensoRT
Training은 Host PC에서 진행을 할 것이며, 만들어진 Model기반으로 이를 적용할 NVIDIA의 Inference Engine 및 Framework라고 생각하면 되겠다.
이는 x86/ ARM 을 다 지원하므로, 개별 부분은 다 자세히 알아봐야 한다.
현재 Jetson에서는 C++만을 지원하고 있다. (추후 Python은 어떻게 될지 모르겠다.).


  • Deep Stream SDK
TensorRT와 마찬가지로, C++로 Inference에서 사용이되며, Deep Learning을 이용한 빠른 Video 분석을 위한 Library라고 생각하는데, 추측으로는 TensorRT를 Gstream 처럼 만들어서 넣는 개념인 것 같다.
만약 사용이되어지면, 실시간으로 비디오 Yolo와 비슷 할 것 같다.
( TensorRT에서 현재 Yolo 지원)


  • NCCL 
멀티 GPU 통신 기능로, 주로 Training할 때 사용될 것으로 생각이 된다.
Host PC에서 여러개의 GPU와 통신하여 빠른 기능을 사용할때 사용할 것 같다.


상위내용은 아래에서 확인
  https://docs.nvidia.com/deeplearning/sdk/introduction/index.html


JetsonTX2 기준으로 본다면, 사용할 부분은  Training은 PC에서 특정 Framework을 이용하여 Model을 만드는 것을 진행 한 후  Inference은 Jetson TX2의 TensorRT로 최적화를 진행
(Tensorflow->TensorRT)


TensorRT Install 및 구조파악
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html

Nvidia Jetson Tutorial
  https://developer.nvidia.com/embedded/learn/tutorials

Nvidia 의 TensorFlow to TensorRT
  https://developer.nvidia.com/embedded/twodaystoademo


1.1 NVIDIA Deep Learning SDK Manual

상위 NVIDIA Manual을 보면 좌측을 보면 아래와 같이 구성이 되어있으며, 필요한 부분만 보자.

  • Deep Learning SDK:  반드시 봐야하며, 전체 구조를 쉽게 파악가능 
  • Performance:  Nvidia의 제공하는 성능에 대해서 설명해주지만, 현재 이해 불가능 
  • Training Library:  상위 cuDNN/NCCL 설명이 Training 중심으로 나오지만, 추후 자세히 
  • Inference Library: TensorRT가 Inference 엔진이 가장중요하며, 이부분을 이해 
  • Inference Server: Docker를 이용하여 동작되며, HTTP/GRPC제공하며, Tensorflow server와 비슷한 것 같다. 
  • Data Loading: Data Loading Library 라고 하는데, 읽어보면, Trainning시 Bigdata를 말하는 것 같다. 
  • Archives: 상위 각각의 설명을 Guide로 설명해주고 있다. 

NVIDIA Deep Learning SDK
  https://docs.nvidia.com/deeplearning/sdk/index.html

NVIDIA DGX (추후 파악)
  https://docs.nvidia.com/deeplearning/dgx/
  https://docs.nvidia.com/deeplearning/dgx/install-tf-jetsontx2/index.html

NVIDIA DEV COMMUNITY
  https://devtalk.nvidia.com/


1.2 Jetson TX2의 Jetpack 설치 및 환경확인

Jetson TX2에서 진행을 하고 있기 때문에 제약사항은 반드시 확인을 해야한다.

  1. Jetson TX2  (Ubuntu 16.04)
  2. Jetpack 3.3  설치  (TensorRT 4.0.2)
  3. Tensorflow 1.8.0 설치 

Jetpack 3.3 관련내용
  https://developer.nvidia.com/embedded/jetpack-3_3

Jetpack 4.1 관련내용
  https://developer.nvidia.com/embedded/downloads#?search=L4T%20Jetson%20TX2%20Driver%20Package


TensoRT는 x86과 Jetson에서도 돌아가는 시스템이지만 Manual을 볼때 반드시 체크해야할 것이 Jetson에도 적용이되는지를 확인을 해야한다.
TensorRT는 NVIDIA에서 제공하는 Deep Learning inference Engine을 말한다.


현재 TensorRT 5.x까지 지원을 하고 있으며,  현재 본인의 TensorRT version 아래와 같이 확인해보자.

nvidia@tegra-ubuntu$  dpkg -l | grep TensorRT
ii  libnvinfer-dev                              4.1.3-1+cuda9.0                              arm64        TensorRT development libraries and headers
ii  libnvinfer-samples                          4.1.3-1+cuda9.0                              arm64        TensorRT samples and documentation
ii  libnvinfer4                                 4.1.3-1+cuda9.0                              arm64        TensorRT runtime libraries
ii  tensorrt                                    4.0.2.0-1+cuda9.0                            arm64        Meta package of TensorRT

  https://devtalk.nvidia.com/default/topic/1050183/tensorrt/tensorrt-5-1-2-installation-on-jetson-tx2-board/

Download TensorRT
  https://developer.nvidia.com/nvidia-tensorrt-download

How To Upgrade TensorRT (x86기반)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html#installing-debian

  https://medium.com/@ardianumam/installing-tensorrt-in-jetson-tx2-8d130c4438f5


2. Training Framework

Manual의 Index를 보면, Training Library를 보면, CUDA의 cuDNN/NCCL 기능을 활용되는 기능만 설명이 되어있다.

현재 실제 Training을 해보지 않은 입장에서는 어떻게 Training을 진행해야하는지는 모르기 때문에, 추후 알게 된다면, 관련부분을 다시 자세히 서술하자.

Manual의 Performance에서 Training with Mixed Precision부분을 보면 다양한 Framework를 통해 진행을 하는 것 같다.

NVCaffe, Caffe2, MXNet, Microsoft Cognitive Toolkit, PyTorch, TensorFlow and Theano
그리고, 다양한 Format을 이용하여, 정확도를 변경하여 최적화를 진행을 하는 것 같다.
이 부분은 실제로 Training을 진행해봐야 아는 부분이기에, Manual만 읽고 이해하기로 한다.

  • Framework들 
  https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html#framework


3. Inference (TensorRT)

TensorRT의 기능은 위에서 설명했듯이 NVIDIA의 Inference의 엔진이며, C++로 구현이 되어있다.
그리고, 다른 Deep Learning Framework에서 작성된 Network Model을 가져와 이곳에 맞게 사용되어지는 것 같다.


  • TensorRT의 사용법
  1. Deep Learning Framework와 연결하여 사용
  2. TensorRT 단독사용 

상위 두개로 지원을 해주는 것 같으며, 최종으로는 TensorRT만 사용하도록 갈 것 같다.
TensorRT도 Deep Learning Framework 같지만, 오직 Inference 기능만 제공하기에,
다른 Framework과 다른 것 같다.


TensorRT의 최신기능 및 설명 ( 성능 )
  https://developer.nvidia.com/tensorrt
  http://www.nextplatform.com/wp-content/uploads/2018/01/inference-technical-overview-1.pdf



TensorRT의 기능설명 및 지원  Parser
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html

TensorRT는 C++로 구현되었으며, Python도 구현이 되어있다고 한다.

Network 정의를 보면,  input/output tensors들을 정의하고, Layer들을 추가 및 설정변경하고,  다양한 설정을 제공하는 것을 알 수 있다.

  1. Network Definition : Network Model 관련된 부분( Deep Learning 공부를 해야함)
  2. Builder: Network의 최적화에 관련된 부분 같다. 
  3. Engine: Inference Engine 이라고 하는데 이 세개는 정확히 구분하기가 애매하다. 



  • TensorRT의 Parser 
다른 Framework, 작성된 Network를 직접 가져올수 있다고 하며, Caffe or UFF or ONNX format으로 형태로 가져와서 이를 최적화 하는 기능 가지고 있다고 한다.
  1. Caffe Parser
  2. UFF Parser
  3. ONNX Parser

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


TensorRT는 다양한 Deep learning Framework를 연결지원하여, 생성된 Trained Model을 TensorRT에 최적화 진행이 가능하며 이때 이용하는 것이 Parser기능이다.

  • Framework(TensorFlow)와 TensorRT 사용법 및 Convert 
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#build_model
  https://github.com/NVIDIA-AI-IOT/tf_to_trt_image_classification

  • TensorFlow to UFF Convert Format 
  https://devtalk.nvidia.com/default/topic/1028464/jetson-tx2/converting-tf-model-to-tensorrt-uff-format/

  • TensorFlow에서 TensorRT Import 방법 및 사용법 
TensorFlow와 TensorRT를 같이 사용하는 방법
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#import_tf_python


  • TensorFlow에 TensorRT 적용
tf : Tensorflow
trt: TensorRT

  https://jkjung-avt.github.io/tf-trt-models/
  https://github.com/NVIDIA-AI-IOT/tf_trt_models


  • TensorRT Support Matrix 
TensorRT의 Parser 정보 지원확인
TensorRT의 Layer와 Features의 제약사항확인
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-support-matrix/index.html


  • TensorRT Release version 의 기능확인
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-container-release-notes/index.html


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


  • TensorRT docker 사용법 
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-container-release-notes/running.html

  • TensorRT의 Sample 사용법 
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-sample-support-guide/index.html
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-sample-support-guide/index.html#mnist_sample


nvidia@tegra-ubuntu$ ls /usr/src/tensorrt/samples/
common     Makefile         sampleCharRNN     sampleGoogleNet  sampleMNIST     sampleMovieLens  sampleOnnxMNIST  sampleUffMNIST  trtexec
getDigits  Makefile.config  sampleFasterRCNN  sampleINT8       sampleMNISTAPI  sampleNMT        samplePlugin     sampleUffSSD

nvidia@tegra-ubuntu$ cd /usr/src/tensorrt/samples
nvidia@tegra-ubuntu$ sudo make 


Jetson의 TensorRT의 Python은 미지원이지만, 차후 지원
  https://devtalk.nvidia.com/default/topic/1036899/tensorrt-python-on-tx2-/


3.1 TensorRT Sample TEST

Jetson TX2에서 Jetpack을 설치된 상태에서 Test를 진행을 했으며, 처음에는 Compile이 되지 않았기 때문에, 내부에서 Build를 해서 실행파일을 생성해야한다.
그리고, Network Model은 내부에 제공을 해주지만, Caffe Model로 지원을 해주고 있다.

trt : tensorRT

nvidia@tegra-ubuntu$  cd /usr/src/tensorrt/bin/
nvidia@tegra-ubuntu$ ls
$ ls
chobj                     sample_fasterRCNN        sample_mnist            sample_nmt               sample_uff_mnist
dchobj                    sample_fasterRCNN_debug  sample_mnist_api        sample_nmt_debug         sample_uff_mnist_debug
download-digits-model.py  sample_googlenet         sample_mnist_api_debug  sample_onnx_mnist        sample_uff_ssd
giexec                    sample_googlenet_debug   sample_mnist_debug      sample_onnx_mnist_debug  sample_uff_ssd_debug
sample_char_rnn           sample_int8              sample_movielens        sample_plugin            trtexec
sample_char_rnn_debug     sample_int8_debug        sample_movielens_debug  sample_plugin_debug      trtexec_debug

nvidia@tegra-ubuntu$ $ ls ../data/                               // sample의 모델과 관련정보 
char-rnn  faster-rcnn  googlenet  mnist  movielens  ssd

nvidia@tegra-ubuntu$ ./sample_mnist              
Reading Caffe prototxt: ../data/mnist/mnist.prototxt
Reading Caffe model: ../data/mnist/mnist.caffemodel

Input:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@#-:.-=@@@@@@@@@@@@@@
@@@@@%=     . *@@@@@@@@@@@@@
@@@@%  .:+%%% *@@@@@@@@@@@@@
@@@@+=#@@@@@# @@@@@@@@@@@@@@
@@@@@@@@@@@%  @@@@@@@@@@@@@@
@@@@@@@@@@@: *@@@@@@@@@@@@@@
@@@@@@@@@@- .@@@@@@@@@@@@@@@
@@@@@@@@@:  #@@@@@@@@@@@@@@@
@@@@@@@@:   +*%#@@@@@@@@@@@@
@@@@@@@%         :+*@@@@@@@@
@@@@@@@@#*+--.::     +@@@@@@
@@@@@@@@@@@@@@@@#=:.  +@@@@@
@@@@@@@@@@@@@@@@@@@@  .@@@@@
@@@@@@@@@@@@@@@@@@@@#. #@@@@
@@@@@@@@@@@@@@@@@@@@#  @@@@@
@@@@@@@@@%@@@@@@@@@@- +@@@@@
@@@@@@@@#-@@@@@@@@*. =@@@@@@
@@@@@@@@ .+%%%%+=.  =@@@@@@@
@@@@@@@@           =@@@@@@@@
@@@@@@@@*=:   :--*@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Output:

0: 
1: 
2: 
3: **********
4: 
5: 
6: 
7: 
8: 
9: 

nvidia@tegra-ubuntu$ ./sample_uff_mnist
../data/mnist/lenet5.uff



---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@+  :@@@@@@@@
@@@@@@@@@@@@@@%= :. --%@@@@@
@@@@@@@@@@@@@%. -@= - :@@@@@
@@@@@@@@@@@@@: -@@#%@@ #@@@@
@@@@@@@@@@@@: #@@@@@@@-#@@@@
@@@@@@@@@@@= #@@@@@@@@=%@@@@
@@@@@@@@@@= #@@@@@@@@@:@@@@@
@@@@@@@@@+ -@@@@@@@@@%.@@@@@
@@@@@@@@@::@@@@@@@@@@+-@@@@@
@@@@@@@@-.%@@@@@@@@@@.*@@@@@
@@@@@@@@ *@@@@@@@@@@@ *@@@@@
@@@@@@@% %@@@@@@@@@%.-@@@@@@
@@@@@@@:*@@@@@@@@@+. %@@@@@@
@@@@@@# @@@@@@@@@# .*@@@@@@@
@@@@@@# @@@@@@@@=  +@@@@@@@@
@@@@@@# @@@@@@%. .+@@@@@@@@@
@@@@@@# @@@@@*. -%@@@@@@@@@@
@@@@@@# ---    =@@@@@@@@@@@@
@@@@@@#      *%@@@@@@@@@@@@@
@@@@@@@%: -=%@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => 14.2556  : ***
1 => -4.83078  : 
2 => 1.09185  : 
3 => -6.29008  : 
4 => -0.835606  : 
5 => -6.92059  : 
6 => 2.40399  : 
7 => -6.01171  : 
8 => 0.730784  : 
9 => 1.50033  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@+ @@@@@@@@@@@@@@
@@@@@@@@@@@@. @@@@@@@@@@@@@@
@@@@@@@@@@@@- @@@@@@@@@@@@@@
@@@@@@@@@@@#  @@@@@@@@@@@@@@
@@@@@@@@@@@#  *@@@@@@@@@@@@@
@@@@@@@@@@@@  :@@@@@@@@@@@@@
@@@@@@@@@@@@= .@@@@@@@@@@@@@
@@@@@@@@@@@@#  %@@@@@@@@@@@@
@@@@@@@@@@@@% .@@@@@@@@@@@@@
@@@@@@@@@@@@%  %@@@@@@@@@@@@
@@@@@@@@@@@@%  %@@@@@@@@@@@@
@@@@@@@@@@@@@= +@@@@@@@@@@@@
@@@@@@@@@@@@@* -@@@@@@@@@@@@
@@@@@@@@@@@@@*  @@@@@@@@@@@@
@@@@@@@@@@@@@@  @@@@@@@@@@@@
@@@@@@@@@@@@@@  *@@@@@@@@@@@
@@@@@@@@@@@@@@  *@@@@@@@@@@@
@@@@@@@@@@@@@@  *@@@@@@@@@@@
@@@@@@@@@@@@@@  *@@@@@@@@@@@
@@@@@@@@@@@@@@* @@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => -5.21897  : 
1 => 14.7033  : ***
2 => -3.10811  : 
3 => -5.6187  : 
4 => 3.30519  : 
5 => -2.81663  : 
6 => -2.79249  : 
7 => 0.943604  : 
8 => 2.90335  : 
9 => -2.76499  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@*.  .*@@@@@@@@@@@
@@@@@@@@@@*.     +@@@@@@@@@@
@@@@@@@@@@. :#+   %@@@@@@@@@
@@@@@@@@@@.:@@@+  +@@@@@@@@@
@@@@@@@@@@.:@@@@: +@@@@@@@@@
@@@@@@@@@@=%@@@@: +@@@@@@@@@
@@@@@@@@@@@@@@@@# +@@@@@@@@@
@@@@@@@@@@@@@@@@* +@@@@@@@@@
@@@@@@@@@@@@@@@@: +@@@@@@@@@
@@@@@@@@@@@@@@@@: +@@@@@@@@@
@@@@@@@@@@@@@@@* .@@@@@@@@@@
@@@@@@@@@@%**%@. *@@@@@@@@@@
@@@@@@@@%+.  .: .@@@@@@@@@@@
@@@@@@@@=  ..   :@@@@@@@@@@@
@@@@@@@@: *@@:  :@@@@@@@@@@@
@@@@@@@%  %@*    *@@@@@@@@@@
@@@@@@@%  ++  ++ .%@@@@@@@@@
@@@@@@@@-    +@@- +@@@@@@@@@
@@@@@@@@=  :*@@@# .%@@@@@@@@
@@@@@@@@@+*@@@@@%.  %@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => -2.20233  : 
1 => -0.773752  : 
2 => 23.4804  : ***
3 => 3.09638  : 
4 => -4.57744  : 
5 => -5.71223  : 
6 => -5.92572  : 
7 => -0.543553  : 
8 => 4.85982  : 
9 => -9.1751  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@#-:.-=@@@@@@@@@@@@@@
@@@@@%=     . *@@@@@@@@@@@@@
@@@@%  .:+%%% *@@@@@@@@@@@@@
@@@@+=#@@@@@# @@@@@@@@@@@@@@
@@@@@@@@@@@%  @@@@@@@@@@@@@@
@@@@@@@@@@@: *@@@@@@@@@@@@@@
@@@@@@@@@@- .@@@@@@@@@@@@@@@
@@@@@@@@@:  #@@@@@@@@@@@@@@@
@@@@@@@@:   +*%#@@@@@@@@@@@@
@@@@@@@%         :+*@@@@@@@@
@@@@@@@@#*+--.::     +@@@@@@
@@@@@@@@@@@@@@@@#=:.  +@@@@@
@@@@@@@@@@@@@@@@@@@@  .@@@@@
@@@@@@@@@@@@@@@@@@@@#. #@@@@
@@@@@@@@@@@@@@@@@@@@#  @@@@@
@@@@@@@@@%@@@@@@@@@@- +@@@@@
@@@@@@@@#-@@@@@@@@*. =@@@@@@
@@@@@@@@ .+%%%%+=.  =@@@@@@@
@@@@@@@@           =@@@@@@@@
@@@@@@@@*=:   :--*@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => -10.1173  : 
1 => -2.8161  : 
2 => -2.5111  : 
3 => 19.4893  : ***
4 => -2.07457  : 
5 => 6.91505  : 
6 => -2.07856  : 
7 => -0.881291  : 
8 => -0.81335  : 
9 => -7.68046  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@.*@@@@@@@@@@
@@@@@@@@@@@@@@@@.=@@@@@@@@@@
@@@@@@@@@@@@+@@@.=@@@@@@@@@@
@@@@@@@@@@@% #@@.=@@@@@@@@@@
@@@@@@@@@@@% #@@.=@@@@@@@@@@
@@@@@@@@@@@+ *@@:-@@@@@@@@@@
@@@@@@@@@@@= *@@= @@@@@@@@@@
@@@@@@@@@@@. #@@= @@@@@@@@@@
@@@@@@@@@@=  =++.-@@@@@@@@@@
@@@@@@@@@@       =@@@@@@@@@@
@@@@@@@@@@  :*## =@@@@@@@@@@
@@@@@@@@@@:*@@@% =@@@@@@@@@@
@@@@@@@@@@@@@@@% =@@@@@@@@@@
@@@@@@@@@@@@@@@# =@@@@@@@@@@
@@@@@@@@@@@@@@@# =@@@@@@@@@@
@@@@@@@@@@@@@@@* *@@@@@@@@@@
@@@@@@@@@@@@@@@= #@@@@@@@@@@
@@@@@@@@@@@@@@@= #@@@@@@@@@@
@@@@@@@@@@@@@@@=.@@@@@@@@@@@
@@@@@@@@@@@@@@@++@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => -5.58382  : 
1 => -0.332037  : 
2 => -2.3609  : 
3 => 0.0268471  : 
4 => 9.68715  : ***
5 => 0.345264  : 
6 => -5.68754  : 
7 => 0.252157  : 
8 => 0.0862162  : 
9 => 4.92423  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@=   ++++#++=*@@@@@
@@@@@@@@#.            *@@@@@
@@@@@@@@=             *@@@@@
@@@@@@@@.   .. ...****%@@@@@
@@@@@@@@: .%@@#@@@@@@@@@@@@@
@@@@@@@%  -@@@@@@@@@@@@@@@@@
@@@@@@@%  -@@*@@@*@@@@@@@@@@
@@@@@@@#  :#- ::. ::=@@@@@@@
@@@@@@@-             -@@@@@@
@@@@@@%.              *@@@@@
@@@@@@#     :==*+==   *@@@@@
@@@@@@%---%%@@@@@@@.  *@@@@@
@@@@@@@@@@@@@@@@@@@+  *@@@@@
@@@@@@@@@@@@@@@@@@@=  *@@@@@
@@@@@@@@@@@@@@@@@@*   *@@@@@
@@@@@%+%@@@@@@@@%.   .%@@@@@
@@@@@*  .******=    -@@@@@@@
@@@@@*             .#@@@@@@@
@@@@@*            =%@@@@@@@@
@@@@@@%#+++=     =@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => -4.68429  : 
1 => -5.85174  : 
2 => -11.9795  : 
3 => 3.46393  : 
4 => -6.07335  : 
5 => 23.6807  : ***
6 => 1.61781  : 
7 => -2.97774  : 
8 => 1.30685  : 
9 => 4.07391  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@%.:@@@@@@@@@@@@
@@@@@@@@@@@@@: *@@@@@@@@@@@@
@@@@@@@@@@@@* =@@@@@@@@@@@@@
@@@@@@@@@@@% :@@@@@@@@@@@@@@
@@@@@@@@@@@- *@@@@@@@@@@@@@@
@@@@@@@@@@# .@@@@@@@@@@@@@@@
@@@@@@@@@@: #@@@@@@@@@@@@@@@
@@@@@@@@@+ -@@@@@@@@@@@@@@@@
@@@@@@@@@: %@@@@@@@@@@@@@@@@
@@@@@@@@+ +@@@@@@@@@@@@@@@@@
@@@@@@@@:.%@@@@@@@@@@@@@@@@@
@@@@@@@% -@@@@@@@@@@@@@@@@@@
@@@@@@@% -@@@@@@#..:@@@@@@@@
@@@@@@@% +@@@@@-    :@@@@@@@
@@@@@@@% =@@@@%.#@@- +@@@@@@
@@@@@@@@..%@@@*+@@@@ :@@@@@@
@@@@@@@@= -%@@@@@@@@ :@@@@@@
@@@@@@@@@- .*@@@@@@+ +@@@@@@
@@@@@@@@@@+  .:-+-: .@@@@@@@
@@@@@@@@@@@@+:    :*@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => 0.409332  : 
1 => -3.60869  : 
2 => -4.52237  : 
3 => -4.49587  : 
4 => -0.557327  : 
5 => 6.62171  : 
6 => 19.9842  : ***
7 => -9.71854  : 
8 => 3.16726  : 
9 => -4.7647  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@%=#@@@@@%=%@@@@@@@@@@
@@@@@@@           %@@@@@@@@@
@@@@@@@           %@@@@@@@@@
@@@@@@@#:-#-.     %@@@@@@@@@
@@@@@@@@@@@@#    #@@@@@@@@@@
@@@@@@@@@@@@@    #@@@@@@@@@@
@@@@@@@@@@@@@:  :@@@@@@@@@@@
@@@@@@@@@%+==   *%%%%%%%%%@@
@@@@@@@@%                 -@
@@@@@@@@@#+.          .:-%@@
@@@@@@@@@@@*     :-###@@@@@@
@@@@@@@@@@@*   -%@@@@@@@@@@@
@@@@@@@@@@@*   *@@@@@@@@@@@@
@@@@@@@@@@@*   @@@@@@@@@@@@@
@@@@@@@@@@@*   #@@@@@@@@@@@@
@@@@@@@@@@@*   *@@@@@@@@@@@@
@@@@@@@@@@@*   *@@@@@@@@@@@@
@@@@@@@@@@@*   @@@@@@@@@@@@@
@@@@@@@@@@@*   @@@@@@@@@@@@@
@@@@@@@@@@@@+=#@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => -6.70799  : 
1 => 0.957398  : 
2 => 3.31229  : 
3 => 2.58422  : 
4 => 3.30001  : 
5 => -3.82085  : 
6 => -6.51343  : 
7 => 16.7635  : ***
8 => -2.20583  : 
9 => -5.96497  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@%+-:  =@@@@@@@@@@@@
@@@@@@@%=      -@@@**@@@@@@@
@@@@@@@   :%#@-#@@@. #@@@@@@
@@@@@@*  +@@@@:*@@@  *@@@@@@
@@@@@@#  +@@@@ @@@%  @@@@@@@
@@@@@@@.  :%@@.@@@. *@@@@@@@
@@@@@@@@-   =@@@@. -@@@@@@@@
@@@@@@@@@%:   +@- :@@@@@@@@@
@@@@@@@@@@@%.  : -@@@@@@@@@@
@@@@@@@@@@@@@+   #@@@@@@@@@@
@@@@@@@@@@@@@@+  :@@@@@@@@@@
@@@@@@@@@@@@@@+   *@@@@@@@@@
@@@@@@@@@@@@@@: =  @@@@@@@@@
@@@@@@@@@@@@@@ :@  @@@@@@@@@
@@@@@@@@@@@@@@ -@  @@@@@@@@@
@@@@@@@@@@@@@# +@  @@@@@@@@@
@@@@@@@@@@@@@* ++  @@@@@@@@@
@@@@@@@@@@@@@*    *@@@@@@@@@
@@@@@@@@@@@@@#   =@@@@@@@@@@
@@@@@@@@@@@@@@. +@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => -5.12389  : 
1 => -3.94476  : 
2 => -0.990646  : 
3 => 1.20684  : 
4 => 3.48777  : 
5 => -0.614695  : 
6 => -4.78878  : 
7 => -2.69351  : 
8 => 14.321  : ***
9 => 3.12232  : 




---------------------------



@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@%.-@@@@@@@@@@@
@@@@@@@@@@@*-    %@@@@@@@@@@
@@@@@@@@@@= .-.  *@@@@@@@@@@
@@@@@@@@@= +@@@  *@@@@@@@@@@
@@@@@@@@* =@@@@  %@@@@@@@@@@
@@@@@@@@..@@@@%  @@@@@@@@@@@
@@@@@@@# *@@@@-  @@@@@@@@@@@
@@@@@@@: @@@@%   @@@@@@@@@@@
@@@@@@@: @@@@-   @@@@@@@@@@@
@@@@@@@: =+*= +: *@@@@@@@@@@
@@@@@@@*.    +@: *@@@@@@@@@@
@@@@@@@@%#**#@@: *@@@@@@@@@@
@@@@@@@@@@@@@@@: -@@@@@@@@@@
@@@@@@@@@@@@@@@+ :@@@@@@@@@@
@@@@@@@@@@@@@@@*  @@@@@@@@@@
@@@@@@@@@@@@@@@@  %@@@@@@@@@
@@@@@@@@@@@@@@@@  #@@@@@@@@@
@@@@@@@@@@@@@@@@: +@@@@@@@@@
@@@@@@@@@@@@@@@@- +@@@@@@@@@
@@@@@@@@@@@@@@@@*:%@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10 eltCount
--- OUTPUT ---
0 => -2.75228  : 
1 => -1.51535  : 
2 => -4.11729  : 
3 => 0.316925  : 
4 => 3.73423  : 
5 => -3.00593  : 
6 => -6.18866  : 
7 => -1.02671  : 
8 => 1.937  : 
9 => 14.8275  : ***

Average over 10 runs is 1.05167 ms.

nvidia@tegra-ubuntu$ ./sample_googlenet
Building and running a GPU inference engine for GoogleNet, N=4...
Bindings after deserializing:
Binding 0 (data): Input.
Binding 1 (prob): Output.
conv1/7x7_s2 + conv1/relu_7x7 input refo 0.378ms
conv1/7x7_s2 + conv1/relu_7x7            1.465ms
pool1/3x3_s2                             0.488ms
pool1/norm1                              0.137ms
conv2/3x3_reduce + conv2/relu_3x3_reduce 0.178ms
conv2/3x3 + conv2/relu_3x3               2.240ms
conv2/norm2                              0.415ms
pool2/3x3_s2                             0.531ms
inception_3a/1x1 + inception_3a/relu_1x1 0.275ms
inception_3a/3x3 + inception_3a/relu_3x3 0.578ms
inception_3a/5x5 + inception_3a/relu_5x5 0.134ms
inception_3a/pool                        0.245ms
inception_3a/pool_proj + inception_3a/re 0.096ms
inception_3a/1x1 copy                    0.026ms
inception_3b/1x1 + inception_3b/relu_1x1 0.561ms
inception_3b/3x3 + inception_3b/relu_3x3 1.156ms
inception_3b/5x5 + inception_3b/relu_5x5 0.613ms
inception_3b/pool                        0.140ms
inception_3b/pool_proj + inception_3b/re 0.132ms
inception_3b/1x1 copy                    0.048ms
pool3/3x3_s2                             0.247ms
inception_4a/1x1 + inception_4a/relu_1x1 0.286ms
inception_4a/3x3 + inception_4a/relu_3x3 0.279ms
inception_4a/5x5 + inception_4a/relu_5x5 0.068ms
inception_4a/pool                        0.075ms
inception_4a/pool_proj + inception_4a/re 0.076ms
inception_4a/1x1 copy                    0.020ms
inception_4b/1x1 + inception_4b/relu_1x1 0.302ms
inception_4b/3x3 + inception_4b/relu_3x3 0.423ms
inception_4b/5x5 + inception_4b/relu_5x5 0.096ms
inception_4b/pool                        0.076ms
inception_4b/pool_proj + inception_4b/re 0.081ms
inception_4b/1x1 copy                    0.017ms
inception_4c/1x1 + inception_4c/relu_1x1 0.299ms
inception_4c/3x3 + inception_4c/relu_3x3 0.408ms
inception_4c/5x5 + inception_4c/relu_5x5 0.092ms
inception_4c/pool                        0.076ms
inception_4c/pool_proj + inception_4c/re 0.082ms
inception_4c/1x1 copy                    0.014ms
inception_4d/1x1 + inception_4d/relu_1x1 0.300ms
inception_4d/3x3 + inception_4d/relu_3x3 0.042ms
inception_4d/3x3 + inception_4d/relu_3x3 0.892ms
inception_4d/3x3 + inception_4d/relu_3x3 0.080ms
inception_4d/5x5 + inception_4d/relu_5x5 0.115ms
inception_4d/pool                        0.075ms
inception_4d/pool_proj + inception_4d/re 0.081ms
inception_4d/1x1 copy                    0.012ms
inception_4e/1x1 + inception_4e/relu_1x1 0.441ms
inception_4e/3x3 + inception_4e/relu_3x3 0.578ms
inception_4e/5x5 + inception_4e/relu_5x5 0.195ms
inception_4e/pool                        0.078ms
inception_4e/pool_proj + inception_4e/re 0.137ms
inception_4e/1x1 copy                    0.025ms
pool4/3x3_s2                             0.072ms
inception_5a/1x1 + inception_5a/relu_1x1 0.196ms
inception_5a/3x3 + inception_5a/relu_3x3 0.250ms
inception_5a/5x5 + inception_5a/relu_5x5 0.074ms
inception_5a/pool                        0.044ms
inception_5a/pool_proj + inception_5a/re 0.076ms
inception_5a/1x1 copy                    0.009ms
inception_5b/1x1 + inception_5b/relu_1x1 0.279ms
inception_5b/3x3 + inception_5b/relu_3x3 0.016ms
inception_5b/3x3 + inception_5b/relu_3x3 0.749ms
inception_5b/3x3 + inception_5b/relu_3x3 0.030ms
inception_5b/5x5 + inception_5b/relu_5x5 0.104ms
inception_5b/pool                        0.053ms
inception_5b/pool_proj + inception_5b/re 0.080ms
inception_5b/1x1 copy                    0.011ms
pool5/7x7_s1                             0.059ms
loss3/classifier input reformatter 0     0.005ms
loss3/classifier                         0.022ms
prob                                     0.009ms
Time over all layers: 18.039
Done.

상위와 같이 간단한 테스트들은 잘되고 쉽으며, TensorRT만으로도 동작이 된다.


  • NVIDIA DLA (Deep Learning Accelerator)
구글링을해보면, TensorRT Accelerator 라고하는데, giexec가 먼저나오고, trtexec가 나왔다고 하는데, 기능은 거의 동일하다고 보면될 것 같다.

- TensorRT (previously known as GPU Inference Engine (GIE))


nvidia@tegra-ubuntu$ ./trtexec     //tensorRT exec 

Mandatory params:
  --deploy=      Caffe deploy file
  OR --uff=      UFF file
  --output=      Output blob name (can be specified multiple times)

Mandatory params for onnx:
  --onnx=        ONNX Model file

Optional params:
  --uffInput=,C,H,W Input blob names along with their dimensions for UFF parser
  --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
Generate a serialized TensorRT engine --calib= Read INT8 calibration cache file. Currently no support for ONNX model. nvidia@tegra-ubuntu$./giexec Mandatory params: --deploy= Caffe deploy file OR --uff= UFF file --output= Output blob name (can be specified multiple times) Mandatory params for onnx: --onnx= ONNX Model file Optional params: --uffInput=,C,H,W Input blob names along with their dimensions for UFF parser --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
Generate a serialized TensorRT engine --calib= Read INT8 calibration cache file. Currently no support for ONNX model.

NVIDIA DLA (Deep Learning Accelerator)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#dla_topic

  • NVIDIA CUDA Example 


nvidia@tegra-ubuntu$ ls /home/nvidia/NVIDIA_CUDA-9.0_Samples/bin/aarch64/linux/release
alignedTypes           conjugateGradientPrecond     fp16ScalarProduct       mergeSort                simpleCubemapTexture       simpleTexture_kernel64.ptx
asyncAPI               conjugateGradientUM          freeImageInteropNPP     MersenneTwisterGP11213   simpleCUBLAS               simpleVoteIntrinsics
bandwidthTest          convolutionFFT2D             FunctionPointers        MonteCarloMultiGPU       simpleCUBLASXT             simpleZeroCopy
batchCUBLAS            convolutionSeparable         histEqualizationNPP     nbody                    simpleCUDA2GL              smokeParticles
BiCGStab               convolutionTexture           histogram               newdelete                simpleCUFFT                SobelFilter
bicubicTexture         cppIntegration               HSOpticalFlow           oceanFFT                 simpleCUFFT_2d_MGPU        SobolQRNG
bilateralFilter        cppOverload                  imageDenoising          p2pBandwidthLatencyTest  simpleCUFFT_MGPU           sortingNetworks
bindlessTexture        cudaOpenMP                   inlinePTX               particles                simpleDevLibCUBLAS         stereoDisparity
binomialOptions        cuSolverDn_LinearSolver      interval                postProcessGL            simpleGL                   template
BlackScholes           cuSolverRf                   jpegNPP                 ptxjit                   simpleHyperQ               threadFenceReduction
boxFilter              cuSolverSp_LinearSolver      lineOfSight             quasirandomGenerator     simpleLayeredTexture       threadMigration
boxFilterNPP           cuSolverSp_LowlevelCholesky  Mandelbrot              radixSortThrust          simpleMultiCopy            threadMigration_kernel64.ptx
c++11_cuda             cuSolverSp_LowlevelQR        marchingCubes           randomFog                simpleMultiGPU             transpose
cannyEdgeDetectorNPP   dct8x8                       matrixMul               recursiveGaussian        simpleOccupancy            UnifiedMemoryStreams
cdpAdvancedQuicksort   deviceQuery                  matrixMulCUBLAS         reduction                simplePitchLinearTexture   vectorAdd
cdpBezierTessellation  deviceQueryDrv               matrixMulDrv            scalarProd               simplePrintf               vectorAddDrv
cdpLUDecomposition     dwtHaar1D                    matrixMulDynlinkJIT     scan                     simpleSeparateCompilation  vectorAdd_kernel64.ptx
cdpQuadtree            dxtc                         matrixMul_kernel64.ptx  segmentationTreeThrust   simpleStreams              volumeFiltering
cdpSimplePrint         eigenvalues                  MC_EstimatePiInlineP    shfl_scan                simpleSurfaceWrite         volumeRender
cdpSimpleQuicksort     fastWalshTransform           MC_EstimatePiInlineQ    simpleAssert             simpleTemplates            warpAggregatedAtomicsCG
clock                  FDTD3d                       MC_EstimatePiP          simpleAtomicIntrinsics   simpleTexture
concurrentKernels      FilterBorderControlNPP       MC_EstimatePiQ          simpleCallback           simpleTexture3D
conjugateGradient      fluidsGL                     MC_SingleAsianOptionP   simpleCooperativeGroups  simpleTextureDrv

  https://tm3.ghost.io/2018/07/06/setting-up-the-nvidia-jetson-tx2/


  • Multimedia 와 TensorRT
Yolo 처럼 자동차가 지나가는 것을 쉽게 파악이 가능하다.

nvidia@tegra-ubuntu:$ cd ~/tegra_multimedia_api/samples/
nvidia@tegra-ubuntu:$ ls
00_video_decode  02_video_dec_cuda  04_video_dec_trt  06_jpeg_decode    08_video_dec_drm        10_camera_recording  13_multi_camera  common    Rules.mk
01_video_encode  03_video_cuda_enc  05_jpeg_encode    07_video_convert  09_camera_jpeg_capture  12_camera_v4l2_cuda  backend          frontend  v4l2cuda

nvidia@tegra-ubuntu:$ cd backend
nvidia@tegra-ubuntu:$ ./backend 1 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --trt-deployfile ../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.prototxt --trt-modelfile ../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.caffemodel --trt-forcefp32 0 --trt-proc-interval 1 -fps 10
// Xwindow에서 실행 , HDMI 연결후 

  https://devtalk.nvidia.com/default/topic/1027851/jetson-tx2/jetpack-3-2-tegra_multimedia_api-backend-sample-won-t-run/
  https://www.youtube.com/watch?v=D7lkth34rgM

  • OpenCV4Tegra
CUDA를 이용하는 OpenCV로 별도로 설치를 해줘야 가능한 것 같은데, 검사할 방법이 있다면 찾아보는 것이 낫을 것 같다.

  https://jkjung-avt.github.io/opencv3-on-tx2/
  https://github.com/jetsonhacks/buildOpenCVTX2
  https://www.youtube.com/watch?v=gvmP0WRVUxI

  https://devtalk.nvidia.com/default/topic/822903/jetson-tk1/opencv4tegra-libraries/
  https://devtalk.nvidia.com/default/topic/1043074/jetson-tx2/how-to-download-and-install-opencv4tegra/
  https://devtalk.nvidia.com/default/topic/1042056/jetson-tx2/jetpack-3-3-opencv-error-no-cuda-support-the-library-is-compiled-without-cuda-support-/post/5285618/#5285618



  • Jetson TX2 Yolo 실행 및 성능 
  https://jkjung-avt.github.io/yolov3/

4/15/2019

syslog 와 rsyslog 설정

1. syslog 와 rsyslog

syslog는 linux에서 사용되어지는 application log system이며, 보통 klogd와 함께 사용되어진다.
그래서, klogd의 message와 호환이 되기 때문에 kernel message도 출력이 가능하다.

syslog는 기본으로 2가지 설정(Facility 와 Level)으로 구성이 되며, 여기에 추가적으로 tag도 별도로 첨부가 가능하여 
log 저장방법의 다양성을 제공해주고 있다.

  • Facility
Log message의 장치 및 source를 말하며, Facility Code or keyword로 쉽게 구분을 하여 본인이 원하는 message들을 log가 가능하다.
Facility code Keyword Description
0 kern Kernel messages
1 user User-level messages
2 mail Mail system
3 daemon System daemons
4 auth Security/authentication messages
5 syslog Messages generated internally by syslogd
6 lpr Line printer subsystem
7 news Network news subsystem
8 uucp UUCP subsystem
9 cron Clock daemon
10 authpriv Security/authentication messages
11 ftp FTP daemon
12 ntp NTP subsystem
13 security Log audit
14 console Log alert
15 solaris-cron Scheduling daemon
16–23 local0 – local7 Locally used facilities

  • Level
상위 Facility가 정해졌으며, 각 log의 Level을 설정이 가능하여, Message 양을 조절이 가능하다.
Value Severity Keyword Deprecated keywords Description
0 Emergency emerg panic[7] System is unusable
1 Alert alert Action must be taken immediately
2 Critical crit Critical conditions
3 Error err error[7] Error conditions
4 Warning warning warn[7] Warning conditions
5 Notice notice Normal but significant conditions
6 Informational info Informational messages
7 Debug debug Debug-level messages

syslog의 설정관련기본 정보(상위도표)
  https://en.wikipedia.org/wiki/Syslog

syslog의 kernel message는 klogd에서 전달받음

  • klogd
/proc/kmsg 에서 읽어서 syslogd 로 전송 

  • syslogd or rsyslogd 
/dev/log 를 사용하여 local에서 read 하며, network bind 514 port  


1.1 syslog의 설정 및 기본테스트 

syslog의 설정은 /etc/syslog.conf 이곳에서 설정이 되며, ps로 syslogd의 동작을 반드시 확인을 하자.
만약 미동작이라면, systemd or sysVinit 방식으로 syslogd를 실행을 시켜주자

  • syslog 설정 (/etc/syslog.conf)
$ vi /etc/rsyslog.conf    // 보통 내부에 include 사용하여 /etc/rsyslog.d/*.conf 확장 
or
$ vi /etc/rsyslog.d/*.conf   // rsyslogd 각 설정  (설정변경후 service restart, systemctl restart rsyslogd )

$ vi /etc/syslog.conf    // 보통 내부에 include 사용하여 /etc/syslog.d/*.conf 확장 
or
$ vi /etc/syslog.d/*.conf   // syslogd 각 설정  (설정변경후 service restart, systemctl restart syslogd ) 

#  /etc/syslog.conf     Configuration file for busybox's syslogd utility

########
#
# 
# 
# "*"    : Faclity or Severity level에서 사용 (모든 Faclity or Severity level) 
# "none" : Severity level에서만 사용          ( message를 미기록)
# ";"    ; 연속으로 
#  "="   ; Severity level의 정의하여 그 이상만 설정 
#  "@"   ; 외부 Server 
# 
#  facility.level;facility.level         logpath 
#  
#  /var/log/messages : default 저장되는 장소 (만약 설정을 안했다면, 기본으로 이곳에 저장)
#
# 
########

*.info;mail.none;news.none;authpriv.none       /var/log/messages

*.alert              root

local0.notice       /var/log/local0    

local1.*            /var/log/local1
local2.info         /var/log/local2

## console로 출력 
local3.*            /dev/console

local4.*            /var/log/test

# 해당 메시지를 192.168.1.17의 syslogd으로 전송 
local5.*            @192.168.1.17  
# 전송과 동시에 저장
local5.*            /var/log/local5           

# 해당 메시지를 jhleehost 의 syslogd으로 UDP 전송
local6.*            @jhleehost     
# 전송과 동시에 저장 
local6.*            /var/log/local6          

# 해당 메시지를 logserver 의 syslogd으로 전송
local7.*            @logserver     
# 전송과 동시에 저장 
local7.*            /var/log/local7          

syslog 와 rsyslog TCP/UDP 설정 ($UDPServerRun 514 , $InputTCPServerRun 514 )
  https://m.blog.naver.com/PostView.nhn?blogId=scvpark&logNo=221017723884&proxyReferer=https:%2F%2Fwww.google.com%2F

  • hostname 설정 및 변경 ( syslog에 반영)
$ cat /etc/hostname
jhleehost

$ cat /etc/hosts
127.0.0.1 localhost.localdomain           localhost
127.0.1.1 jhleehost
192.168.1.100  logserver

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters


  • syslog의 network 설정 
$ ps | grep syslog*  // 현재설정확인
  247 root      2724 S    /sbin/syslogd -n
  620 root      2724 S    grep syslog*
 

$ grep -r syslogd /lib/systemd/         //systemd 방식의 Service 찾기
/lib/systemd/system/busybox-syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS

$ grep -r syslogd /etc/systemd/         //systemd 방식의 Service 찾기 (상위링크임)
/etc/systemd/system/syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS
/etc/systemd/system/multi-user.target.wants/busybox-syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS

$ vi /etc/init.d/sysklogd  //sysVinit 방식 
or
$ vi /lib/systemd/system/busybox-syslog.service //systemd 방식 

/sbin/syslogd –r –m 0 이용하여 원격Log Server 동작가능 (-r 옵션추가)

-r 옵션을 추가하면, logserver 기능이 추가되며, 외부의 Message를 받아 저장가능



syslogd 의 사용법 
/sbin/syslogd 에서 위치하며 상위 설정기반으로 Service 형태로 동작 
klogd 의 사용법
/sbin/klogd 에 대부분 위치하며, Kernel Message만 관리하며, Service 형태로 동작
syslogd를 걸쳐서 오는 것으로 보이며, syslogd가 더 중요 
  https://linux.die.net/man/8/klogd

/etc/syslog.conf 와 syslogd 관련정리내용
  https://www.linux.co.kr/lecture/lec_linux_01/lec-data/11data.pdf


1.2  logger로 syslog 테스트 

logger program을 이용하여 간단히 syslog를 테스트가 가능하며, 이를 이용하여 기록확인이 가능하다
  1. -p 옵션 : Facility 와 level 설정
  2. -t  옵션 : Tag  (별도의 본인의 Tag 설정)

상위 /etc/syslog.conf  설정변경 후 syslogd를  재실행 혹은 Reboot 후  아래와 같이 테스트 진행하며 
설정값(/etc/syslog.conf)을 변경하지 않는다면, 그대로 테스트 

  • /var/log/local0에 기록 (/etc/syslog.conf참조)
$ echo "hello local0" |  logger -t test_user0 -p local0.notice

$ cat /var/log/local0  //날짜 시간 hostname facility.level tag   message 
Mar 13 15:40:45 jhleehost local0.notice test_user0: hello local0


  • /var/log/local1에 기록
$ echo "hello local1" |  logger -t test_user1 -p local1.notice
$ cat /var/log/local1
Mar 13 15:45:50 jhleehost local1.notice test_user1: hello local1


  • /var/log/local2에 기록
$ echo "hello local2" |  logger -t test_user2 -p local2.info
$ cat /var/log/local2
Mar 13 15:49:31 jhleehost local2.info test_user2: hello local2


  • 바로 Consol 출력 미기록
$ echo "hello local3" |  logger -t test_user2 -p local3.info         
Mar 13 15:50:41 jhleehost local3.info test_user2: hello local3


  • Network로 Message 출력
$ echo "hello local5" |  logger -t test_user2 -p local5.info   
$ echo "hello local5" |  logger -t test_user2 -p local5.notice     
$ cat /var/log/message    //192.168.1.17로 기록 
.....
Mar 13 15:54:19 jhleehost local5.info test_user2: hello local5
Mar 13 15:56:24 jhleehost local5.notice test_user2: hello local5

$ cat /var/log/local5    // local로 기록 
Mar 13 16:05:57 jhleehost local5.info test_user2: hello local5
Mar 13 16:06:06 jhleehost local5.notice test_user2: hello local5


  • Shellscript 과 logger로 TEST진행
2>&1 을 이용하여 표준에러를 표준입력으로 변경하여 출력

$ test1.sh | logger -t test_1 -p local0.notice

$ test2.sh 2>&1 | logger -t test_2 -p local0.notice

2. syslog를 이용한 Programming 


Application에서 printf 대신 syslog를 이용하여 손쉽게 저장이 가능하며, 이를 이용하는 방식에 대해 간단히 요약한다.

2.1 syslog message format 방식 


syslog가 network도 지원이 되다보니, Protocol 방식이 존재하며, 더불어 TLS 같은 보안기능까지 지원가능 한 것으로 보인다.

  https://sematext.com/blog/what-is-syslog-daemons-message-formats-and-protocols/
  https://stackify.com/syslog-101/

  • syslogd의 실행 및 옵션 
  https://linux.die.net/man/3/syslog
  http://man7.org/linux/man-pages/man5/rsyslog.conf.5.html


2.2 언어 C를 사용하여 syslog 구현 

기본적으로 C에서 syslog를 이용하고 싶다면 아래와 같이 선언을 하고 build 진행

//Facility
#define LOG_KERN    (0<<3)  /* kernel messages */
#define LOG_USER    (1<<3)  /* random user-level messages */
#define LOG_MAIL    (2<<3)  /* mail system */
#define LOG_DAEMON  (3<<3)  /* system daemons */
#define LOG_AUTH    (4<<3)  /* security/authorization messages */
#define LOG_SYSLOG  (5<<3)  /* messages generated internally by syslogd */
#define LOG_LPR     (6<<3)  /* line printer subsystem */
#define LOG_NEWS    (7<<3)  /* network news subsystem */
#define LOG_UUCP    (8<<3)  /* UUCP subsystem */
#define LOG_CRON    (9<<3)  /* clock daemon */
#define LOG_AUTHPRIV    (10<<3) /* security/authorization messages (private) */
#define LOG_FTP     (11<<3) /* ftp daemon */
#define LOG_LOCAL0  (16<<3) /* reserved for local use */
#define LOG_LOCAL1  (17<<3) /* reserved for local use */
#define LOG_LOCAL2  (18<<3) /* reserved for local use */
#define LOG_LOCAL3  (19<<3) /* reserved for local use */
#define LOG_LOCAL4  (20<<3) /* reserved for local use */
#define LOG_LOCAL5  (21<<3) /* reserved for local use */
#define LOG_LOCAL6  (22<<3) /* reserved for local use */
#define LOG_LOCAL7  (23<<3) /* reserved for local use */

//Level
#define LOG_EMERG   0   /* system is unusable */
#define LOG_ALERT   1   /* action must be taken immediately */
#define LOG_CRIT    2   /* critical conditions */
#define LOG_ERR     3   /* error conditions */
#define LOG_WARNING 4   /* warning conditions */
#define LOG_NOTICE  5   /* normal but significant condition */
#define LOG_INFO    6   /* informational */
#define LOG_DEBUG   7   /* debug-level messages */



#include <syslog.h>

void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);

#include <stdarg .h>

void vsyslog(int priority, const char *format, va_list ap); 


#include <syslog.h>

int main()
{
     syslog(LOG_INFO|LOG_LOCAL1, "test local 0 \n");
     syslog(LOG_INFO|LOG_LOCAL2, "test local 1 \n");
     syslog(LOG_INFO|LOG_LOCAL3, "test local 2 \n");

     return 0;
}

Linux의 Application에서 직접 Syslog 사용할 경우 C의 예제 사용법 
  https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
3. syslog 기타사항 정리 



3.1 /var/log 의 검색방법 

/var/log/ 안에 다양한 log들이 존재할 것이며 정확한 Log를 분석하기 위해서 아래와 같이 날짜기반으로 검색하거나, 
혹은 Facility 와 각 Level 기반으로 검색 부터 Tag 를 사용하여 세부 검색을 이용하자 

  • grep를 이용하여 검색 후 분석 
$ grep "Feb 28 22:" /var/log/message  // 날짜기반으로 검색 
$ grep "Feb 28 22:" /var/log/message | head -n 100   // 날짜기반으로 검색 

$ grep "local0.notice" /var/log/message  // Facility 와 Level 기반으로 검색 
$ grep "local0.notice" /var/log/message | tail -n 100  // Facility 와 Level 기반으로 검색 

$ grep -e "local0.notice" -e "Feb 28 22:" /var/log/message  // 날짜기반에 Facility 와 Level 기반으로 검색 
$ grep -e "local0.notice" -e "Feb 28 22:" /var/log/message | tail -n 100  // 날짜기반에 Facility 와 Level 기반으로 검색  

  • grep/egrep/awk/sed 이용한 Pattern 검색
$ grep "PATTERN1\|PATTERN2" FILE
$ grep -E "PATTERN1|PATTERN2" FILE
$ grep -e PATTERN1 -e PATTERN2 FILE
$ egrep "PATTERN1|PATTERN2" FILE

$ awk '/PATTERN1|PATTERN2/' FILE

$ sed -e '/PATTERN1/b' -e '/PATTERN2/b' -e d FILE

grep 과 awk / sed 로 검색방법 
  https://www.shellhacks.com/grep-or-grep-and-grep-not-match-multiple-patterns/


3.2 rsyslog , syslog , syslog-ng 차이 


  • syslog 
1980년대에 시작되어 계속 개발중 
  1. UDP기반으로 syslog protocol 완성된 log관리 시스템 
  2. 상위 syslogd Manual 보면 Network은 UDP만 지원 

  • syslog-ng 
1988년에 syslog protocol 과 함께 시작되어 계속 개발중 
  1. content-based filtering  (Filter 기능을 제공하는 것으로 추측)
  2. Logging directly into a database ( Database 제공?)
  3. TCP for transport (UDP가 아닌 TCP로 안정화)
  4. TLS encryption (TLS 암호화까지 지원)

  • rsyslog
2004년에 syslog protocol 과 함께 시작되어 계속 개발중 
  1. RELP Protocol support
  2. Buffered operation support
  3. 상위 설정으로 봐서 TCP도 지원

결론적으로 각각 독립적으로 Open Source가 지원이 되는 것 같은데, 암호화 부분은 syslog-ng가 되어 낫을 것 같다. 


아래 링크 글을 보면 근본적으로 거의 차이가 없는 것(syslog protocol 모두 지원)으로 보이며, 하지만, 세부동작과 동작방식이 다른 것으로 보인다.

출처:
  https://serverfault.com/questions/692309/what-is-the-difference-between-syslog-rsyslog-and-syslog-ng


3.3 systemd-journal 의 사용법

기본적으로 Binary로 데이타를 저장하고 저장장소역시 이미 정해져있고, 현재 테스트만 해봤지만,  장점이 무엇인지 정확하게 모르겠음

추후 사용해보고 정리

systemd-journal 사용법
  https://haker.tistory.com/52
  https://www.loggly.com/ultimate-guide/linux-logging-with-systemd/


journal 이용방법
  https://serverfault.com/questions/573946/how-can-i-send-a-message-to-the-systemd-journal-from-the-command-line

3.4 rsyslog

현재 Ubuntu에서 syslogd 대신 사용하고 있으며, 추후 사용해보고 정리 
각 기능을 확인

  https://www.thegeekdiary.com/configuring-remote-logging-using-rsyslog-in-centos-rhel/
  http://pubs.opengroup.org/onlinepubs/007908799/xsh/syslog.h.html
  https://en.wikipedia.org/wiki/Syslog
  https://en.wikipedia.org/wiki/Rsyslog
  https://en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol

정리해야할 사항들 및 참고사항
  https://cleverdj.tistory.com/130
  https://system-monitoring.readthedocs.io/en/latest/log.html
  http://apollo89.com/wordpress/?p=554
  https://en.wikipedia.org/wiki/Syslog
  https://haker.tistory.com/52

echo 'hello' | systemd-cat
journalctl -f


 https://serverfault.com/questions/573946/how-can-i-send-a-message-to-the-systemd-journal-from-the-command-line

journalctl -fu lora-start.service
  https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs

  https://www.freedesktop.org/software/systemd/man/systemd.html#

  https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
  https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_2

  https://reebok.tistory.com/69

cron
  https://stackframe.tistory.com/14
  https://wiki.archlinux.org/index.php/Systemd/Timers

4/12/2019

strace

1. STRACE란? 

strace는 SunOS에서 System Call을 Trace를 하기위해서 만들어진 Debug Tool이며, 이를 이용하여 실행중인 Program도 Trace가 가능하다.


$ sudo apt-get install strace 


  https://en.wikipedia.org/wiki/Strace

1.1 STRACE 기본사용법 


$ strace -h
usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]...
              [-a column] [-o file] [-s strsize] [-P path]...
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
   or: strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby]
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]

Output format:
  -a column      alignment COLUMN for printing syscall results (default 40)
  -i             print instruction pointer at time of syscall
  -o file        send trace output to FILE instead of stderr
  -q             suppress messages about attaching, detaching, etc.
  -r             print relative timestamp
  -s strsize     limit length of print strings to STRSIZE chars (default 32)
  -t             print absolute timestamp
  -tt            print absolute timestamp with usecs
  -T             print time spent in each syscall
  -x             print non-ascii strings in hex
  -xx            print all strings in hex
  -y             print paths associated with file descriptor arguments
  -yy            print ip:port pairs associated with socket file descriptors

Statistics:
  -c             count time, calls, and errors for each syscall and report summary
  -C             like -c but also print regular output
  -O overhead    set overhead for tracing syscalls to OVERHEAD usecs
  -S sortby      sort syscall counts by: time, calls, name, nothing (default time)
  -w             summarise syscall latency (default is system time)

Filtering:
  -e expr        a qualifying expression: option=[!]all or option=[!]val1[,val2]...
     options:    trace, abbrev, verbose, raw, signal, read, write
  -P path        trace accesses to path

Tracing:
  -b execve      detach on execve syscall
  -D             run tracer process as a detached grandchild, not as parent
  -f             follow forks
  -ff            follow forks with output into separate files
  -I interruptible
     1:          no signals are blocked
     2:          fatal signals are blocked while decoding syscall (default)
     3:          fatal signals are always blocked (default if '-o FILE PROG')
     4:          fatal signals and SIGTSTP (^Z) are always blocked
                 (useful to make 'strace -o FILE PROG' not stop on ^Z)

Startup:
  -E var         remove var from the environment for command
  -E var=val     put var=val in the environment for command
  -p pid         trace process with process id PID, may be repeated
  -u username    run command as username handling setuid and/or setgid

Miscellaneous:
  -d             enable debug output to stderr
  -v             verbose mode: print unabbreviated argv, stat, termios, etc. args
  -h             print help message
  -V             print version


  http://man7.org/linux/man-pages/man1/strace.1.html

1.2 /proc를 이용하여 동작중인 Process 확인


$ sudo cat /proc/550/maps  // 실행과 관련된 공유라이브러리 확인 
$ sudo cat /proc/550/status  // Process 상태확인 
$ readelf -h /proc/550/exe    // 실행파일 확인 
$ readelf -s /proc/550/exe    // symbol table 확인     


1.3  PID 기반으로 STRACE 사용  

동작 중이 Process 기반으로 아래와 같이 PID를 넣어 직접 Profile을 해보고 Debug을 해봅니다.


  • 상위 동작 중인 PID 기반으로 Debug

$ strace -p 550 -f -t -s 65535 // -p PID -f fork된 밑에 process들도 같이 분석, -t timestamp 출력  -s string 사이즈 변경 
...........
[pid   994] 11:25:13 pselect6(0, NULL, NULL, NULL, {0, 10000000}, NULL) = 0 (Timeout)
[pid   994] 11:25:13 fstat(31, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
[pid   994] 11:25:13 fstat(31, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
[pid   994] 11:25:13 read(31, "count 180\nunhandled 0\nlast_unhan"..., 1024) = 42
...............


$ strace -p 550 -f -tt  // -p PID -f fork된 밑에 process들도 같이 분석, -t timestamp 출력 
[pid   994] 11:30:52.563464 fstat(31, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
[pid   994] 11:30:52.563761 fstat(31, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
[pid   994] 11:30:52.564047 read(31, "count 180\nunhandled 0\nlast_unhan"..., 1024) = 42


  • System Call 함수의 호출의 통계
간단히 본인이 원하는 System Call 함수의 Profile 가능하며, 통계를 내어 분석도 가능

$ strace -cp 550 -f  // -p PID -f fork된 밑에 process들도 같이 분석, -c count call
strace: Process 550 attached with 4 threads
^Cstrace: Process 550 detached
strace: Process 743 detached
strace: Process 994 detached
strace: Process 995 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 98.67    0.488000        1132       431           pselect6
  0.94    0.004653          12       382           sendto
  0.13    0.000666           2       382           openat
  0.10    0.000495           1       382           close
  0.09    0.000457           1       764           fstat
  0.06    0.000310           1       382           read
  0.00    0.000000           0         4         2 futex
------ ----------- ----------- --------- --------- ----------------
100.00    0.494581                  2727         2 total


1.4  STRACE 사용

보통 아래와 같이 본인이 trace하고 싶은 app과 함께 같이 사용을 하며, 현재 test program을 없기에, ps command를 분석한다.

$ strace -c >/dev/null ps                     // ps program 내부 system call 분석 ,  ps의 내용은 /dev/null 출력 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 38.53    0.012719          46       279           read
 24.46    0.008074          31       260         6 open
 13.92    0.004595          18       254           close
  9.01    0.002973          25       119         3 stat64
  3.72    0.001227          29        43           mmap2
  2.82    0.000932          29        32           mprotect
  1.75    0.000577         289         2           getdents64
  1.25    0.000412          16        25           fstat64
  1.17    0.000385          14        28           lseek
  0.99    0.000328          14        24           rt_sigaction
  0.99    0.000327          20        16        15 access
  0.31    0.000102          51         2         2 statfs
  0.31    0.000101          51         2           munmap
  0.18    0.000061          15         4         3 ioctl
  0.11    0.000035          12         3           brk
  0.09    0.000031          16         2           _llseek
  0.06    0.000021          21         1           cacheflush
  0.05    0.000018          18         1           futex
  0.05    0.000016          16         1           ugetrlimit
  0.05    0.000015          15         1           set_tid_address
  0.04    0.000014          14         1           rt_sigprocmask
  0.04    0.000014          14         1           set_tls
  0.04    0.000013          13         1           geteuid32
  0.04    0.000013          13         1           set_robust_list
  0.03    0.000009           9         1           write
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           uname
------ ----------- ----------- --------- --------- ----------------
100.00    0.033012                  1106        29 total



$ strace -e open >/dev/null ps       // ps 프로그램에서 open만 검색 
open("/etc/ld.so.preload", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/arm-linux-gnueabihf/libarmmem.so", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libprocps.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libsystemd.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/liblzma.so.5", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/arm-linux-gnueabihf/liblz4.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libgcrypt.so.20", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib/arm-linux-gnueabihf/libgpg-error.so.0", O_RDONLY|O_CLOEXEC) = 3
.......


  https://hokstad.com/5-simple-ways-to-troubleshoot-using-strace
  http://www.brendangregg.com/perf.html
  https://brunch.co.kr/@alden/12
  http://linuxspot.tistory.com/253