Jetson nano, 특히 emmc 버전을 사용하는 경우 16GB의 emmc 용량과 4GB의 RAM으로 인한 제한으로 인해 opencv와 같은 굉장히 덩치가 큰 프로젝트를 customizing하기 위해 build를 해서 사용하기가 어렵다. 이 과정의 어려움은 아래와 같다.
그래서 풍족한 호스트 환경에서 빌드하고 꼭 필요한 파일들 만 복사해서 사용하면 jetson의 용량을 아낄수 있다.
상당히 많은 파일을 다운로드 하게 되므로 인터넷이 빠른 곳에서 작업하는 것을 추천한다.
https://codepyre.com/2019/08/building-custom-root-filesystems/#chroot-there-it-is
https://yunslog.tistory.com/53
- 나무 위키에서 알 수 있듯이 여러 플랫폼을 에뮬레이션 할 수 있는 오픈소스 툴이다.
- 이번엔 arm64를 에뮬레이션하기 위해 사용한다.
sudo apt update
sudo apt install -y qemu-user-static debootstrap
~/work$ mkdir rootfs
# 아래 명령으로 arm64용 library들과 daemon들을 받고 설치함. 꽤 걸림.
~/work$ sudo qemu-debootstrap --arch arm64 bionic ./rootfs
~/work$ sudo chroot ~/work/rootfs
root@ubuntu:/#
$ uname -m
aarch64
$ cat /etc/apt/sources.list
deb http://ports.ubuntu.com/ubuntu-ports bionic main
$ echo "# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic universe
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates multiverse
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security universe
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted" > /etc/apt/sources.list
$ apt update
$ apt install --no-install-recommends -y curl wget unzip gnupg1 git build-essential \
cmake git ccache pkg-config \
libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libfreetype6 libfreetype6-dev libharfbuzz-dev \
libgflags-dev liblapack-dev \
libopenblas-dev libatlas3-base libbliss2 gfortran liblapack3 libeigen3-dev \
libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev \
libdc1394-22-dev \
libv4l-dev v4l-utils qv4l2 v4l2ucp \
mesa-utils libgl1-mesa-dri \
python3-pip python3-dev python3-numpy \
qt5-default qttools5-dev libqt5opengl5-dev
- 필요한 파일 리스트 (jetpack 4.6.1의 경우)
- cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
- libcudnn8_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-dev_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-samples_8.2.1.32-1+cuda10.2_arm64.deb
- 필요한 파일 리스트 (다른 버전의 jetpack의 경우 파일명은 비슷하고 cuda version과 libcudnn의 버전만 다르다.)
- cuda-repo-l4t-{cudaversion}-local{cuda_version}.{cuda_version_revision}-1_arm64.deb
- libcudnn8_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-dev_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-samples_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
$ cp cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb libcudnn8* ~/work/rootfs/tmp/
$ cd /tmp
$ dpkg -i cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
$ apt-key add /var/cuda-repo-l4t-10-2-local/7fa2af80.pub
$ apt update
$ apt install -y cuda-toolkit-10-2 libgomp1 libfreeimage-dev libopenmpi-dev openmpi-bin
$ dpkg --purge cuda-repo-l4t-10-2-local
$ dpkg -i libcudnn8*
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
$ export CUDA_HOME=/usr/local/cuda
$ export PATH=$PATH:$CUDA_HOME/bin
$ cd /tmp
$ mkdir opencv
$ cd opencv
$ wget https://github.com/opencv/opencv/archive/refs/tags/4.5.1.tar.gz -O opencv-4.5.1.tar.gz
$ wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.1.tar.gz -O opencv_contrib-4.5.1.tar.gz
$ tar xvzf opencv-4.5.1.tar.gz
$ tar xvzf opencv_contrib-4.5.1.tar.gz
$ cd opencv-4.5.1
$ mkdir build
$ cd build
$ cmake -D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN="5.3" \
-D CUDA_ARCH_PTX="" \
-D USE_NEON=ON \
-D WITH_CUBLAS=ON -D WITH_CUDNN=ON \
-D ENABLE_FAST_MATH=ON -D CUDA_FAST_MATH=ON \
-D WITH_EIGEN=ON -D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
-D WITH_GTK=OFF -D WITH_QT=ON -D WITH_OPENGL=ON\
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.1/modules \
-D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON \
-D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON \
-D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2 \
-D CUDNN_INCLUDE_DIRS=/usr/include/ \
-D CUDNN_LIBRARIES=/usr/lib/aarch64-linux-gnu \
-D CMAKE_INSTALL_PREFIX=/opt/opencv-4.5.1 \
..
cmake 까지 하면 아래 같이 출력되면 다음으로 진행.
펼침-- General configuration for OpenCV 4.5.1 =====================================
-- Version control: unknown
--
-- Extra modules:
-- Location (extra): /tmp/opencv/opencv_contrib-4.5.1/modules
-- Version control (extra): unknown
--
-- Platform:
-- Timestamp: 2022-03-23T07:22:10Z
-- Host: Linux 5.4.0-65-generic aarch64
-- CMake: 3.10.2
-- CMake generator: Unix Makefiles
-- CMake build tool: /usr/bin/make
-- Configuration: RELEASE
--
-- CPU/HW features:
-- Baseline: NEON FP16
--
-- C/C++:
-- Built as dynamic libs?: YES
-- C++ standard: 11
-- C++ Compiler: /usr/bin/c++ (ver 7.5.0)
-- C++ flags (Release): -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG
-- C++ flags (Debug): -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG
-- C Compiler: /usr/bin/cc
-- C flags (Release): -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG
-- C flags (Debug): -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG
-- Linker flags (Release): -Wl,--gc-sections -Wl,--as-needed
-- Linker flags (Debug): -Wl,--gc-sections -Wl,--as-needed
-- ccache: YES
-- Precompiled headers: NO
-- Extra dependencies: m pthread /usr/lib/aarch64-linux-gnu/libGL.so /usr/lib/aarch64-linux-gnu/libGLU.so cudart_static dl rt nppc nppial nppicc nppicom nppidei nppif nppig nppim nppist nppisu nppitc npps cublas cudnn cufft -L/usr/local/cuda-10.2/lib64 -L/usr/lib/aarch64-linux-gnu
-- 3rdparty dependencies:
--
-- OpenCV modules:
-- To be built: alphamat aruco bgsegm bioinspired calib3d ccalib core cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor mcc ml objdetect optflow phase_unwrapping photo plot python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
-- Disabled: world
-- Disabled by dependency: -
-- Unavailable: cnn_3dobj hdf java julia matlab ovis python2 sfm ts viz
-- Applications: apps
-- Documentation: NO
-- Non-free algorithms: NO
--
-- GUI:
-- QT: YES (ver 5.9.5)
-- QT OpenGL support: YES (Qt5::OpenGL 5.9.5)
-- OpenGL support: YES (/usr/lib/aarch64-linux-gnu/libGL.so /usr/lib/aarch64-linux-gnu/libGLU.so)
-- VTK support: NO
--
-- Media I/O:
-- ZLib: /usr/lib/aarch64-linux-gnu/libz.so (ver 1.2.11)
-- JPEG: /usr/lib/aarch64-linux-gnu/libjpeg.so (ver 80)
-- WEBP: build (ver encoder: 0x020f)
-- PNG: /usr/lib/aarch64-linux-gnu/libpng.so (ver 1.6.34)
-- TIFF: /usr/lib/aarch64-linux-gnu/libtiff.so (ver 42 / 4.0.9)
-- JPEG 2000: build (ver 2.3.1)
-- OpenEXR: build (ver 2.3.0)
-- HDR: YES
-- SUNRASTER: YES
-- PXM: YES
-- PFM: YES
--
-- Video I/O:
-- DC1394: YES (2.2.5)
-- FFMPEG: YES
-- avcodec: YES (57.107.100)
-- avformat: YES (57.83.100)
-- avutil: YES (55.78.100)
-- swscale: YES (4.8.100)
-- avresample: NO
-- GStreamer: YES (1.14.5)
-- v4l/v4l2: YES (linux/videodev2.h)
--
-- Parallel framework: pthreads
--
-- Trace: YES (with Intel ITT)
--
-- Other third-party libraries:
-- Lapack: NO
-- Eigen: YES (ver 3.3.4)
-- Custom HAL: YES (carotene (ver 0.0.1))
-- Protobuf: build (3.5.1)
--
-- NVIDIA CUDA: YES (ver 10.2, CUFFT CUBLAS FAST_MATH)
-- NVIDIA GPU arch: 53
-- NVIDIA PTX archs:
--
-- cuDNN: YES (ver 8.2.1)
--
-- OpenCL: YES (no extra features)
-- Include path: /tmp/opencv/opencv-4.5.1/3rdparty/include/opencl/1.2
-- Link libraries: Dynamic load
--
-- Python 3:
-- Interpreter: /usr/bin/python3 (ver 3.6.9)
-- Libraries: /usr/lib/aarch64-linux-gnu/libpython3.6m.so (ver 3.6.9)
-- numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.13.3)
-- install path: lib/python3.6/dist-packages/cv2/python-3.6
--
-- Python (for build): /usr/bin/python3
--
-- Java:
-- ant: NO
-- JNI: NO
-- Java wrappers: NO
-- Java tests: NO
--
-- Install to: /opt/opencv-4.5.1
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/opencv/opencv-4.5.1/build
make
$ make -j$(nproc)
$ make install
$ cd /opt
$ du -d1 -h
210M ./opencv-4.5.1
$ cd /opt/opencv-4.5.1
$ ls
bin include lib share
$ cd /opt
$ tar cvzf opencv-4.5.1_release.tar.gz ./opencv-4.5.1
$ exit
exit를 하면 emulation이 종료되고 x86 mode로 돌아온다.
위의 안내대로 진행했으면 ~/work/rootfs/opt에 opencv-4.5.1_release.tar.gz 가 존재한다.
이 파일을 jetson nano board로 복사한다.
jetson nano에 cuda, libcudnn이 깔리지 않았다면 아래 파일들도 복사한다.
- 필요한 파일 리스트 (jetpack 4.6.1의 경우)
- cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
- libcudnn8_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-dev_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-samples_8.2.1.32-1+cuda10.2_arm64.deb
- 필요한 파일 리스트 (다른 버전의 jetpack의 경우)
- cuda-repo-l4t-{cudaversion}-local{cuda_version}.{cuda_version_revision}-1_arm64.deb
- libcudnn8_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-dev_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-samples_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
$ sudo echo "deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted" >> /etc/apt/sources.list
$ sudo apt update
$ sudo apt install --no-install-recommends -y curl wget unzip gnupg1 git build-essential \
cmake git ccache pkg-config \
libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libfreetype6 libfreetype6-dev libharfbuzz-dev \
libgflags-dev liblapack-dev \
libopenblas-dev libatlas3-base libbliss2 gfortran liblapack3 libeigen3-dev \
libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev \
libdc1394-22-dev \
libv4l-dev v4l-utils qv4l2 v4l2ucp \
mesa-utils libgl1-mesa-dri \
python3-pip python3-dev python3-numpy \
qt5-default qttools5-dev libqt5opengl5-dev
$ cd ~/work
$ sudo dpkg -i cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
$ sudo apt-key add /var/cuda-repo-l4t-10-2-local/7fa2af80.pub
$ sudo apt update
$ sudo apt install -y cuda-toolkit-10-2 libgomp1 libfreeimage-dev libopenmpi-dev openmpi-bin
$ sudo dpkg --purge cuda-repo-l4t-10-2-local
$ sudo dpkg -i libcudnn8*
$ export LD_LIBRARY_PATH=/opt/opencv-4.5.1/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
$ export PATH=/opt/opencv-4.5.1/bin:/usr/local/cuda/bin:$PATH
$ ldconfig
export LD_LIBRARY_PATH=/opt/opencv-4.5.1/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export PATH=/opt/opencv-4.5.1/bin:/usr/local/cuda/bin:$PATH
$ cd /opt
$ sudo tar xvzf ~/work/opencv-4.5.1_release.tar.gz
$ sudo ln -s /opt/opencv-4.5.1/lib/python3.6/dist-packages/cv2 /usr/lib/python3/dist-packages/cv2
$ jtop
# 실행 중 숫자 6을 입력
$ sudo -H pip3 install -U jetson-stats
$ sudo systemctl restart jetson-stats
>>> import cv2
>>> cv2.__version__
'4.5.1'
>>> cv2.cuda.printCudaDeviceInfo(0)
*** CUDA Device Query (Runtime API) version (CUDART static linking) ***
Device count: 1
Device 0: "NVIDIA Tegra X1"
CUDA Driver Version / Runtime Version 10.20 / 10.20
CUDA Capability Major/Minor version number: 5.3
Total amount of global memory: 3964 MBytes (4156764160 bytes)
GPU Clock Speed: 0.92 GHz
Max Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536,65536), 3D=(4096,4096,4096)
Max Layered Texture Size (dim) x layers 1D=(16384) x 2048, 2D=(16384,16384) x 2048
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 32768
Warp size: 32
Maximum number of threads per block: 1024
Maximum sizes of each dimension of a block: 1024 x 1024 x 64
Maximum sizes of each dimension of a grid: 2147483647 x 65535 x 65535
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: Yes
Support host page-locked memory mapping: Yes
Concurrent kernel execution: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support enabled: No
Device is using TCC driver mode: No
Device supports Unified Addressing (UVA): Yes
Device PCI Bus ID / PCI location ID: 0 / 0
Compute Mode:
Default (multiple host threads can use ::cudaSetDevice() with device simultaneously)
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.20, CUDA Runtime Version = 10.20, NumDevs = 1
>>>
>>> import PyQt5.QtCore
>>> PyQt5.QtCore.QT_VERSION_STR
'5.9.5'
우와~~~멋지십니다.