Deeplearning Inference

Deep Learnig C++ Inference on Jetson Nano (1)

dlbuilder 2020. 10. 9. 11:14

본 블로그에서는 Nvidia jetson 환경에서 Tensorflow를 python이 아닌 c++환경에서 사용할 수 있도록 빌드하는 방법을 소개드리겠습니다.

 

Nvidia Jetson 환경에서 Tensorflow의 c++ library와 header를 빌드하는 방법은 다음과 같습니다.

 

1. 준비 및 주의사항

  • Jetpack 4.4가 설치된 Jetson Nano
  • SD카드 용량 : 64GB (32GB로 진행할 경우 용량이 부족할 수 있습니다.)
  • 전원 : Barrel Jack (Micro USB로 전원을 공급할 경우 빌드 진행 중 Jetson 전원이 꺼짐)
  • 인내 (^^) : 저의 경우 빌드 명령 시작부터 완료까지 35시간이 소요되었습니다.
    (글 제일 아래에 제가 빌드한 결과를 링크 해놓았습니다.)
  • Jetson 부팅 후 Setting에 들어가셔서 Power -> Blank Screen -> Never로 설정

Power Saving 설정

※ 빌드 진행중에 다른 어플리케이션을 실행하지 않도록 해주세요. Jetson이 다운될 수 있습니다.

 

2. 기본 환경 설정

  • Build용 폴더 생성
cd ~
mkdir tfbuild
  • Jetson을 Performance Mode로 설정
sudo nvpmodel -m 0
sudo jetson_clocks
  • Swap 8GB 추가
cd ~/tfbuild
sudo dd if=/dev/zero of=swapfile bs=1024 count=8388608
sudo mkswap swapfile
sudo swapon swapfile

※ 재부팅을 하시게 되는 경우 위 tfbuild 폴더로 가셔서 마지막 sudo swapon swapfile 명령을 다시 실행 해주세요.

 

  • Bazel Install

다음 링크에서 sh 파일을 다운 받으신 후, terminal에서 실행하시면 bazel이 설치가 됩니다.

tensorflow 버전별로 bazel 버전이 상이한데, 본 tensorflow 2.3.1 빌드에는 bazel 3.1을 설치합니다.

https://drive.google.com/file/d/1xFKA264QRNn0zEbd23X9A_eoDwQueh9J/view?usp=sharing

 

install_bazel-3.1.0.sh

 

drive.google.com

sudo apt-get update
./install_bazel-3.1.0.sh

위 명령 완료에 시간이 필요합니다. (기억이 맞다면 15분 정도 걸렸던 것 같네요)

bazel 설치가 완료되면, 다음과 같이 .bashrc에 bazel path를 설정해줍니다.

gedit ~/.bashrc

맨 마지막 줄에 다음을 추가해주세요.

 

export PATH=${PATH}:~/bin

 

현재 열려 있는 터미널에서 위 path 변경내용 반영을 위해

source ~/.bashrc
  • PIP 설치 및 Symbolic를 link 변경
sudo apt-get install python3-pip
sudo ln -sf /usr/bin/python3 /usr/bin/python
sudo ln -sf /usr/bin/pip3 /usr/bin/pip
  • Cuda Path 설정

Jetson에는 기본적으로 Cuda가 설치되어 있습니다. 빌드를 위해 Cuda Path만 다음과 같이 설정하면 됩니다.

gedit ~/.bashrc

맨 마지막 줄에 다음을 추가해주세요.

 

export PATH=${PATH}:/usr/local/cuda/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64

 

현재 열려 있는 터미널에서 위 path 변경내용 반영을 위해

source ~/.bashrc
  • Protobuf Install

tensorflow 버전별로 protobuf 버전이 상이한데, 본 tensorflow 2.3.1 빌드에는 protobuf cpp 3.9.2를 설치합니다.

cd ~/tfbuild
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.9.2/protobuf-cpp-3.9.2.zip
unzip protobuf-cpp-3.9.2.zip
cd protobuf-3.9.2/cmake
mkdir build && cd build
cmake ..
make -j8
sudo make install

3. Tensorflow Download 및 빌드

  • Tensorflow Download 및 Configure
cd ~/tfbuild
wget https://github.com/tensorflow/tensorflow/archive/v2.3.1.tar.gz -O tensorflow-2.3.1.tar.gz
tar xzvf tensorflow-2.3.1.tar.gz
cd tensorflow-2.3.1
./configure

configure 과정에서 

cuda : y

tensorrt : y

cuda capabilities : 5.3,6.2,7.2

로 하고 나머지는 모두 enter

 

build configure

※ cuda capabilities는 Jetson 계열의 모든 장비를 고려하여 설정한것입니다.

장비의 capabilities 값과 빌드시 값이 일치하지 않으면 tensorflow 초기화 과정이 굉장히 오래 걸리는 문제가 있습니다.

graphic card별 cuda capabilities는 다음 링크를 참고해주세요.

 

developer.nvidia.com/cuda-gpus 

 

CUDA GPUs

Recommended GPU for Developers NVIDIA TITAN RTX NVIDIA TITAN RTX is built for data science, AI research, content creation and general GPU development. Built on the Turing architecture, it features 4608, 576 full-speed mixed precision Tensor Cores for accel

developer.nvidia.com

  • libraray build
cd ~/tfbuild/tensorflow-2.3.1
bazel build --config=opt --config=cuda --config=noaws \
               --jobs 4 --local_ram_resources=HOST_RAM*0.5 --verbose_failures
//tensorflow:libtensorflow_cc.so

※ 이 과정이 35시간 정도 걸립니다. ~~

 

  • header build
cd ~/tfbuild/tensorflow-2.3.1
bazel build --config=opt --config=cuda --config=noaws
//tensorflow:install_headers
  • 빌드 결과물
cd ~/tfbuild/tensorflow-2.3.1/bazel-bin/tensorflow

 

폴더에 보시면

파일 5개

libtensorflow_cc.so

libtensorflow_cc.so.2

libtensorflow_cc.so.2.3.1

libtensorflow_framework.so.2

libtensorflow_framework.so.2.3.1

폴더 1개

include

가 개발에 필요한 파일입니다.

 

아래 링크에 제가 빌드한 결과물을 업로드하였으니, 참고해주세요.

 

drive.google.com/file/d/1b9dmKy_Pd7VANunURkWTN8eHS2ClnEyK/view?usp=sharing

 

tensorflow_cpp_jetson_2.3.1.zip

 

drive.google.com

 

딥러닝 학습모델의 c++ inference에 관심이 있으신분은, 다음 링크(dlbuilder.ai)를 참조해주십시요.
학습완료된 딥러닝 모델을 application으로 손쉽게 변환해주는 서비스를 제공하고 있습니다.