Deep Learnig C++ Inference on Jetson Nano (1)
본 블로그에서는 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로 설정
※ 빌드 진행중에 다른 어플리케이션을 실행하지 않도록 해주세요. 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
※ 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으로 손쉽게 변환해주는 서비스를 제공하고 있습니다.