5. Jetson Orin Nano CUDA 配置
1:安装Jtop
jtop安装主要有以下三个步骤:
-
安装pip3
我们需要使用pip3来安装jtop,所以先安装pip3
sudo apt install python3-pip
-
安装jtop
sudo -H pip3 install -U jetson-stats
-
运行jtop服务
sudo -H pip3 install -U jetson-stats
-
重启系统
reboot
至此jtop安装完成
运行jtop
jtop启动命令如下jtop
弹出图形化界面。
2:安装JETPACK套件
为啥安装 Jetpack,那就是 Jetpack 是 Nvidia为 Jetson系列开发板开发的一款软件开发包,常用的开发工具基本都包括了,并在在安装 Jetpack的时候,会自动的将匹配版本的CUDA、cuDNN、TensorRT等安装好,极大地方便了开发者!
Jetpack官方安装教程How to Install JetPack :: NVIDIA JetPack Documentation
在jetson上输入
sudo apt update
sudo apt install nvidia-jetpack
使用下面命令查看Jetpack包版本信息
sudo apt show nvidia-jetpack
安装完输入 sudo jetson_release
进行查询
可以发现 Jetpack会自动安装相关版本的CUDA、cuDNN、TensorRT等
其中 cuDNN 默认安装路径在 /usr/lib/aarch64-linux-gnu 下
CUDA 默认安装路径在 /usr/local/cuda 下
3:配置Cuda环境变量:
Cuda 已经默认安装在了/usr/local/cuda下,运行如下指令:
sudo vim ~/.bashrc # 打开~/.bashrc
#在文本末输入如下代码:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
source ~/.bashrc # 更新环境变量配置
运行 nvcc -V 查看版本号:
nvcc -V
4:配置 cuDNN
虽然安装了cuDNN,但没有将对应的头文件、库文件放到cuda目录。
cuDNN的头文件在:/usr/include,库文件位于:/usr/lib/aarch64-linux-gnu。将头文件与库文件复制到cuda目录下:
(这里我与amd64上的cudnn头文件进行了对比,发现amd64下的头文件都是源文件,而arm64下的头文件都是软链接,当我将软链接头文件复制到cuda头文件目录下,变为了源文件。。。之所以说这些,就是为了证明这里的操作和amd64的一样,不用担心)
# 复制文件到cuda目录下
cd /usr/include && sudo cp cudnn* /usr/local/cuda/include
cd /usr/lib/aarch64-linux-gnu && sudo cp libcudnn* /usr/local/cuda/lib64
# 修改文件权限,修改复制完的头文件与库文件的权限,所有用户都可读,可写,可执行:
sudo chmod 777 /usr/local/cuda/include/cudnn.h
sudo chmod 777 /usr/local/cuda/lib64/libcudnn*
# 重新软链接,这里的8.6.0和8对应安装的cudnn版本号和首数字
cd /usr/local/cuda/lib64
sudo ln -sf libcudnn.so.8.6.0 libcudnn.so.8
sudo ln -sf libcudnn_ops_train.so.8.6.0 libcudnn_ops_train.so.8
sudo ln -sf libcudnn_ops_infer.so.8.6.0 libcudnn_ops_infer.so.8
sudo ln -sf libcudnn_adv_train.so.8.6.0 libcudnn_adv_train.so.8
sudo ln -sf libcudnn_adv_infer.so.8.6.0 libcudnn_adv_infer.so.8
sudo ln -sf libcudnn_cnn_train.so.8.6.0 libcudnn_cnn_train.so.8
sudo ln -sf libcudnn_cnn_infer.so.8.6.0 libcudnn_cnn_infer.so.8
sudo ldconfig
测试Cudnn:
sudo cp -r /usr/src/cudnn_samples_v8/ ~/
cd ~/cudnn_samples_v8/mnistCUDNN
sudo chmod 777 ~/cudnn_samples_v8
sudo make clean && sudo make
./mnistCUDNN
配置成功输出:
注意:如果在~/cudnn_samples_v8/mnistCUDNN
目录下执行make
时出现如下错误 :
表示缺少对应的库,安装下面的库
sudo apt-get install libfreeimage3 libfreeimage-dev
安装完成之后再进行sudo make
Jetson Orin Nano OpenCV 配置
1:查看OpenCV CUDA 是否安装
运行Jtop后,按数字7查看INFO页面,在INFO
页面会发现 OpenCV:4.5.4 with CUDA:NO
通过jetpack安装的 OpenCV (已编译)是不支持CUDA 加速的,无法充分利用GPU。
2:卸载默认Opencv
sudo apt purge libopencv*
sudo apt autoremove
完成以后更新一下。考虑到网速问题,建议先更换镜像源,本文不再赘述。
sudo apt update
sudo apt upgrade
3:安装编译 OpenCV
3.1.安装依赖库
- Generic tools
sudo apt install build-essential cmake pkg-config unzip yasm git checkinstall
- Image I/O libs
sudo apt install libjpeg-dev libpng-dev libtiff-dev
- Video/Audio Libs - FFMPEG, GSTREAMER, x264 and so on
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libavresample-dev
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt install libxvidcore-dev x264 libx264-dev libfaac-dev libmp3lame-dev libtheora-dev
sudo apt install libfaac-dev libmp3lame-dev libvorbis-dev
- OpenCore - Adaptive Multi Rate Narrow Band(AMRNB) and Wide Band(AMRWB) speech codec
sudo apt install libopencore-amrnb-dev libopencore-amrwb-dev
- Cameras programming interface libs
sudo apt-get install libdc1394-22 libdc1394-22-dev libxine2-dev libv4l-dev v4l-utils
cd /usr/include/linux
sudo ln -s -f ../libv4l1-videodev.h videodev.h
cd ~
- GTK lib for the graphical user functionalites coming from OpenCV highghui module
sudo apt-get install libgtk-3-dev
- Python libraries for python3
sudo apt-get install python3-dev python3-pip
sudo -H pip3 install -U pip numpy
sudo apt install python3-testresources
- Parallelism library C++ for CPU
sudo apt-get install libtbb-dev
- Optimization libraries for OpenCV
sudo apt-get install libatlas-base-dev gfortran
- Optional libraries
sudo apt-get install libprotobuf-dev protobuf-compiler
sudo apt-get install libgoogle-glog-dev libgflags-dev
sudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen
3.2.下载OpenCV并解压
cd ~/Downloads
wget -O opencv.zip https://github.com/opencv/opencv/archive/refs/tags/4.5.3.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.3.zip
unzip opencv.zip
unzip opencv_contrib.zip
解压完成之后创建python虚拟环境(可选)。
sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip
使用vim编辑.bashrc,加上export两条语句。
sudo vim ~/.bashrc
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
使其立即生效。
source ~/.bashrc
=可选=
参考的博客里面有用到,我没有用虚拟环境,我直接使用的下面脚本完成的。
参考的博客里面 virtualenv path/to/virtualenvname -p path/to/python3
这个命令应该是有问题的。如果您对virtualenv
有研究的话可以自行使用。
使用virtualenv创建虚拟环境,virtualenvname为虚拟环境名称,建议设置为cv,-p表示母python路径,笔者使用的是/usr/bin/python3。
virtualenv path/to/virtualenvname -p path/to/python3
创建成功后启动虚拟环境,并安装numpy
source path/to/vitualenvname/bin/active
pip install numpy
=可选=
## 3.执行安装
创建build文件夹,进入。
cd opencv-4.5.3
mkdir build
cd build
执行cmake,建议将下下述命令写到.sh文件中,用bash运行。CUDA_TOOLKIT_ROOT_DIR应改为自己开发板上CUDA的根目录,CUDA_ARCH_BIN应改为GPU计算能力,笔者所用开发板支持的CUDA版本为11.4。
OPENCV_PYTHON3_INSTALL_PATH为python3的安装目录,还记得我们创建的虚拟环境吗,使用之,需要注意的是,笔者创建虚拟环境中python版本3.6,所以路径为、/usr/lib/python3.8/site-packages,如果你的python版本不是3.8,应该更改为实际的python版本。PYTHON_EXECUTABLE为python解释器的路径,OPENCV_EXTRA_MODULES_PATH为opencv_contrib的路径,务必填写准确。
下面是我写的一个脚本
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_opencv_python2=1 -D BUILD_opencv_python3=1 -D WITH_FFMPEG=1 \
#自己Jetson 上的cuda-版本 目录
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-11.4 \
-D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 \
-D WITH_CUDA=ON -D BUILD_opencv_cudacodec=OFF -D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=8.7 \
-D WITH_V4L=ON -D WITH_QT=OFF -D WITH_OPENGL=ON -D WITH_GSTREAMER=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_PC_FILE_NAME=opencv.pc \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_PYTHON3_INSTALL_PATH=/usr/lib/python3.8/site-packages \
#PYTHON_EXECUTABLE python 目录
-D PYTHON_EXECUTABLE=/usr/bin/python \
#根据自己实际目录配置
-D OPENCV_EXTRA_MODULES_PATH=/home/nvidia/Downloads/opencv_contrib-4.5.3/modules \
-D INSTALL_PYTHON_EXAMPLES=OFF -D INSTALL_C_EXAMPLES=OFF -D BUILD_EXAMPLES=OFF ..
执行脚本 ,我的脚本是make.sh
sudo make.sh
运行完脚本之后 会有下面的信息输出
-- NVIDIA CUDA: YES (ver 11.2, CUFFT CUBLAS FAST_MATH)
-- NVIDIA GPU arch: 75
-- NVIDIA PTX archs:
--
-- cuDNN: YES (ver 8.2.0)
以防万一,先扩展虚拟内存再执行make。
cd /
sudo mkdir swap
cd swap
sudo dd if=/dev/zero of=swapfile bs=1M count=20480
sudo mkswap swapfile
sudo swapon swapfile
上述命令创建了大小为bs*count的swap空间,可以根据需要修改大小。将生成的文件转换成swap文件并激活。
设置swap分区为开机自动挂载。
sudo cp /etc/fstab /etc/fstab.bak
echo '/swap/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h
查看cpu内核数,多开几个内核。-j4编译时间约为 1~3 小时,编译完成后进行安装。(我的Jetson Orin Nano 是6核心的)
nproc
make -j6
sudo make install
至此,安装成功。
4:检查安装是否成功
执行jtop指令,观察到下述情况即表示OpenCV已支持CUDA。
5:CUDA Demo
新建一个helloWorld.cu文件,输入
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
__global__ void mykernel(void) {
int col_index = threadIdx.x + blockIdx.x * blockDim.x;
int row_index = threadIdx.y + blockIdx.y * blockDim.y;
printf("hello from (%d,%d) \n",row_index,col_index);
}
int main(void) {
dim3 grid(2,2);
dim3 block(1,4);
mykernel<<<grid, block>>>();
// synchronize the device
cudaDeviceSynchronize();
}
编译 helloWorld.cu
nvcc helloWorld.cu -o helloWorld
./helloWorld
结果如下
参考博客:https://zhuanlan.zhihu.com/p/643308445