◾ JetPack이란?
NVIDIA JetPack SDK는 종단 간 가속 AI 애플리케이션을 구축하기 위한 가장 포괄적인 솔루션으로, JetPack은 Nvidia Jetson 모듈에서 하드웨어 가속 AI-at-the-edge 개발을 위한 전체 개발 환경을 제공한다.
JetPack에는 부트로더가 포함 된 Jetson Linux , Linux 커널, Ubuntu 데스크탑 환경 및 GPU 컴퓨팅, 멀티미디어, 그래픽 및 컴퓨터 비전의 가속화를 위한 완전한 라이브러리 세트가 포함되어 있다.
◾ JetPack 설치
JetPack은 SD card에 JetPack Image를 다운 받아서 설치해야 한다.
1. jetpack 다운로드
https://developer.nvidia.com/embedded/jetpack
위 링크에서 본인의 jetson nano에 맞는 SD Card Image를 다운 받아야 한다.
해당 Image 파일을 다운로드 받았으면 'balena'라는 프로그램을 사용하여 OS설치용으로 변경 시켜 줘야 한다.
2. balenaEtcher
해당 사이트에서 본인 os에 맞는 balenaEtcher를 다운받은 후 1번에서 다운로드 한 JetPack SD Card Image를 불러 온다.
그리고 가지고 있는 SD Card를 pc와 연결하여 다운로드 한 JetPack SD Card Image와 연결 해주면 된다.
Image 파일을 불러왔고 이 Image 파일과 연결 할 SD Card를 선택 했다면 'Flash!'를 클릭하면 설치가 시작 된다.
확인 단계까지 끝나면 해당 SD Card를 Jetson Nano에 꽂은 후 부팅을 하면 새로운 JetPack이 설치된다.
요즘은 파티션 할당도 자동으로 되기 때문에 본인 설정에 맞게끔 우분투 재설정 하는 것 처럼 Jetson Nano도 설정해 주면 된다.
◾ Jetson Nano Pytorch 설치
정말 많이 서치하고 또 삽질 하면서 ... 겨우 설치 성공했다...
나는 JetPack 4.5 버전을 설치 했으며, cuda 10.2, cuDNN 8.0.0, python 3.6 버전이 설치 되어 있다. 여러번 삽질하면서 설치 성공한 방법은 아래와 같다.
아래 명령어들을 순서대로 터미널 창에서 실행 하면 pytorch 1.8이 설치 된다.
# PyTorch 1.8.0 다운로드 및 dependencies 설치
wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl
sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
# Cython, numpy, pytorch 설치
pip3 install Cython
pip3 install numpy torch-1.8.0-cp36-cp36m-linux_aarch64.whl
# torchvision dependencies 설치
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
git clone --branch v0.9.0 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.9.0
python3 setup.py install --user
cd ../ # attempting to load torchvision from build dir will result in import error
성공적으로 설치 되었다면 python3에서 torch 버전을 확인 했을 때 1.8.0이 출력된다.
◾OpenCV 설치 및 CUDA 가속 활성화
이것도 build 과정에서 정말 많이 삽질 해 보고.. 겨우 성공한 명령어들로 기록 해 둔다...
JetPack을 설치하면 디폴트로 OpenCV CUDA 가속 활성화가 되어 있지 않기 때문에 딥러닝 사용을 위해 CUDA 가속 활성화를 해 주어야 한다.
1. swap 공간 설정
먼저 jetson nano의 메모리가 크기 않기 때문에 swap 공간부터 설정 해 주어야 한다.
# 이미 했다면 안해도 됨
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nano
sudo apt-get install dphys-swapfile
# /sbin/dphys-swapfile 파일 open
sudo nano /sbin/dphys-swapfile
## Swap파일의 값이 다음과 같도록 값을 추가하거나, 파일 내 주석을 해제
# CONF_SWAPSIZE=4096
# CONF_SWAPFACTOR=2
# CONF_MAXSWAP=4096
# 값을 수정 후 [Ctrl] + [X], [y], [Enter]를 눌러 저장하고 닫으면 됨.
# /etc/dphys-swapfile 파일 open
sudo nano /etc/dphys-swapfile
## Swap파일의 값이 다음과 같도록 값을 추가하거나, 파일 내 주석을 해제
# CONF_SWAPSIZE=4096
# CONF_SWAPFACTOR=2
# CONF_MAXSWAP=4096
# 값을 수정 후 [Ctrl] + [X], [y], [Enter]를 눌러 저장하고 닫으면 됨.
# 재부팅
sudo reboot
→ opencv 설치 후 swap 공간 다시 복구 시키기도 한다는데, sd 카드 용량이 너무 적다면 그땐 swap 공간을 다시 이전으로 돌려 놓으면 된다고 한다. (그게 아니면 복구 시키지 않아도 상관 없다고 함.)
2. 기존에 설치 되어 있는 CUDA 버전 확인 후 삭제
# 기존 cuda 버전 확인
pkg-config --modversion opencv
# 기존에 설치 된 cuda가 있다면 버전이 뜰 것.
# 설치 된 cuda가 없다면 'No package 'opencv' found' 출력 됨.
# 기존에 설치 된 cuda 버전 및 의존 패키지 삭제
sudo apt-get remove libopencv*
sudo apt-get autoremove
sudo find /usr/local -name "*opencv*" -exec rm {} \;
3. 추가로 필요한 패키지 설치
sudo apt-get update
# sudo apt-get upgrade -> 이건 자주 안하는 걸 권장한다 함..
sudo apt-get install -y build-essential cmake git unzip pkg-config
sudo apt-get install -y libjpeg-dev libpng-dev libtiff-dev
sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgtk2.0-dev libcanberra-gtk*
sudo apt-get install -y python3-dev python3-numpy python3-pip
sudo apt-get install -y python3-dev python3-numpy libtbb2 libtbb-dev
sudo apt-get install -y libxvidcore-dev libx264-dev libgtk-3-dev
sudo apt-get install -y libtbb2 libtbb-dev libdc1394-22-dev
sudo apt-get install -y libv4l-dev v4l-utils
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y libavresample-dev libvorbis-dev libxine2-dev
sudo apt-get install -y libfaac-dev libmp3lame-dev libtheora-dev
sudo apt-get install -y libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get install -y libopenblas-dev libatlas-base-dev libblas-dev
sudo apt-get install -y liblapack-dev libeigen3-dev gfortran
sudo apt-get install -y libhdf5-dev protobuf-compiler
sudo apt-get install -y libprotobuf-dev libgoogle-glog-dev libgflags-dev
4. 홈 디렉토리로 이동
cd ~
5. opencv zip file 다운 및 압축 해제
이렇게 하는 이유는… 검색하면 나오는 대부분의 방법들인 .sh 파일을 다운 받아서 실행 시켰더니 계속 cmake 관련 에러가 발생했기 때문… 하나하나 cmake 명령어를 입력 해 줘야겠다고 판단했다…
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.0.zip
unzip opencv.zip
unzip opencv_contrib.zip
6. build 폴더 생성
# 압축 해제 후 생성 된 opencv-4.5.0 폴더 안으로 이동
cd opencv-4.5.0
# build 폴더 생성 후 이동
mkdir build
cd build
7. cmake로 빌드하기
가장 중요한 단계이다... 본인에게 해당하는 경로로 수정을 꼭 해 주어야 하며 필요한 옵션에 대해 제대로 알고 빌드 해야 한다.
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ # 아까 압축 해제 한 opencv_contrib 폴더의 경로로 적어야 함.
-D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
-D WITH_OPENCLAMDBLAS=OFF \
-D WITH_GTK=OFF \
-D WITH_OPENCL=OFF \
-D WITH_CUDA=ON \
-D CUDA_FAST_MATH=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_PTX="" \
-D WITH_CUDNN=ON \
-D WITH_CUBLAS=ON \
-D ENABLE_FAST_MATH=ON \
-D ENABLE_NEON=ON \
-D WITH_QT=OFF \
-D WITH_OPENMP=ON \
-D WITH_OPENGL=ON \
-D BUILD_JASPER=ON \
-D BUILD_TIFF=ON \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
-D WITH_TBB=ON \
-D BUILD_TBB=ON \
-D WITH_EIGEN=ON \
-D WITH_V4L=ON \
-D WITH_LIBV4L=ON \
-D WITH_VTK=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_OPENCV_WORLD=ON \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_OPENCV_PYTHON_TESTS=OFF \
-D INSTALL_TESTS=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF ..
→ cmakelist.txt 파일이 없다는 에러가 뜨면 build 하고 있는 상위 경로에 cmakelist.txt 파일이 있는지 확인 해야 한다.
8. build
# 현재 시스템 코어 수 확인
nproc
# 코어 수를 -j 뒤에 적으면 됨!
make -j4 # 이 과정이 2시간 정도 소요 됨.
sudo rm -rf /usr/include/opencv4/opencv2
sudo make install
→ 굉장히 오랜 시간 소요 되었다. 거의 2시간 정도? 근데 중간에 에러나면 그 시간이 너무 아깝고 날려버리는 거니 꼭.. cmake 명령어 부분에서 더블 체크를 해야 한다.
→ 설치 후 /etc/ld.so.conf.d/ 파일에 저장된 내용 출력해서 /usr/local/lib 포함하는 파일이 있는지 확인을 해야 함.
cat /etc/ld.so.conf.d/*
# 만약 '/usr/local/lib'이 출력되지 않았다면 아래 명령어 실행
sudo sh -c 'echo '/usr/local/lib' > /etc/ld.so.conf.d/opencv.conf'
#공유 라이브러리 정보를 갱신
$ sudo idconfig
9. 설치한 opencv 버전 확인
10. jtop 명령어로 opencv CUDA 가속 확인
→ OpenCV with CUDA : YES로 변경 되어 있다면 성공적으로 빌드 한 것!
jetson nano가 리눅스랑은 또 다른 체계라서 리눅스에서 설치하는 것과는 달리 제한 사항이 많았다...
또 최신 글은 거의 없고 전부 옛날 글 뿐이라.. 에러도 엄청 마주하고 삽질도 엄청 하고... 다음에 또 새로운 jetson을 사용하게 된다면... 이 글이 나에게 큰 도움이 되길 바라며 포스팅으로 남겨 둔다....
또.. 내가 설치한 버전과 다른 jetpack 버전에서는 내가 설치한 이 방법들이 안먹힐 수도 있음 ㅠ.ㅠ