Nvidia嵌入式设备配置记录
前言
目前arrch64架构下可直接利用的二进制文件不多,因此大部分功能包或库都是通过源码编译的形式进行安装,源码编译的方式对平台没有要求,但安装过程比较繁琐且很容易出现路径找不到的问题,所以写了这份文档,记录一下安装过程中遇到的问题,但是目前来看,最新版本的库(如opencv-python)都已经提供了arrch64架构的二进制文件,未来的安装流程应该能够得到简化。
一.安装miniforge(arrch64架构下的anaconda)
参考:https://blog.csdn.net/abc13526222160/article/details/106710163
NVIDIA Jetson Xavier 使用的aarch64架构是没法使用anaconda的,虽然可以自己编译,但是conda指令是没法编译到aarch64架构上运行的。不过有替代品,名字是miniforge。
- miniforge与miniconda的区别在于miniforge的下载通道是conda-forge
- miniforge的github地址:https://github.com/conda-forge/miniforge
- miniforge的.sh的release下载地址:https://github.com/conda-forge/miniforge/releases
-
进入GitHub主页可以看到需要下载的对应平台的.sh文件的名称:
-
点击进行下载,下载后执行以下命令:
sh Miniforge-pypy3-Linux-aarch64.sh
-
其他步骤与平时在Linux平台安装anaconda无异(一路yes即可)
-
镜像源加速:
conda config --prepend channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda config --prepend channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes
-
创建虚拟环境与环境激活
# 创建虚拟环境,其中envname为环境名称,后边命令可选定python版本,目前arrch64架构下的pytorch只支持3.6 conda create -n envname python=3.6 # 环境激活 conda activate envname
执行完上面的步骤就可以安装一些库了,如numpy、pillow(推荐先下载,后面会用到):
pip install numpy==x.x.x
# or
conda install numpy==x.x.x
这里推荐的安装方式是指定库的版本,在不指定的情况下(以pip安装为例):
pip install numpy
以上命令将会安装最新版本的numpy,但是最新版本的库都会存在某些不稳定、未完全适配的情况,假如发生类似导入(import)失败的问题,不妨试试降级,选取一些早期较为稳定的版本。
ps:pillow经测试不指定版本直接下载最新版能稳定运行
- 关于版本的确定,可以上浏览器搜索pypi(python package index,python包索引),进入后在搜索框输入需要安装的库(这里以numpy为例):
- 对于一些常用库而言,一般第一个就是我们需要的,可以看到目前numpy已经更新到1.20.1版本了,然而这并非我们想要安装的
- 点进去之后,可以看到左侧有历史版本的选项,点击Release history后右侧就会显示该包的所有历史版本,个人建议选择与最新版本相差约半年到一年的版本
- 之后返回终端安装心仪的对应版本即可
二.配置cuDNN
Xavier虽然安装了cuDNN,但没有将对应的头文件、库文件放到cuda目录。Xavier中cuDNN的头文件在:/usr/include,库文件位于:/usr/lib/aarch64-linux-gnu
-
将头文件与库文件复制到cuda目录下:
cd /usr/include && sudo cp cudnn.h /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 /usr/local/cuda/lib64/libcudnn*
-
重新连接:
cd /usr/local/cuda/lib64 sudo ln -sf libcudnn.so.8.0.0 libcudnn.so.8 sudo ln -sf libcudnn_ops_train.so.8.0.0 libcudnn_ops_train.so.8 sudo ln -sf libcudnn_ops_infer.so.8.0.0 libcudnn_ops_infer.so.8 sudo ln -sf libcudnn_adv_infer.so.8.0.0 libcudnn_adv_infer.so.8 sudo ln -sf libcudnn_cnn_infer.so.8.0.0 libcudnn_cnn_infer.so.8 sudo ln -sf libcudnn_cnn_train.so.8.0.0 libcudnn_cnn_train.so.8 sudo ln -sf libcudnn_adv_train.so.8.0.0 libcudnn_adv_train.so.8
-
编译:
sudo ldconfig
-
测试:
sudo cp -r /usr/src/cudnn_samples_v8/ ~/ cd ~/cudnn_samples_v8/mnistCUDNN sudo chmod 777 ~/cudnn_samples_v8 sudo su # 获取权限,不然下一步会报错 sudo make clean && make ./mnistCUDNN
如果配置成功 测试完成后会显示:“Test passed!”,如下图所示:
三.安装Pytorch、TorchVision
参考:
1.Pytorch安装
NVIDIA提供了Pytorch基于Arrch64架构的.whl二进制安装文件,进入相关网站点击相应版本号就可以获取对应二进制文件。
-
安装依赖项
sudo apt-get update sudo apt-get upgrade sudo apt-get install git cmake python3-dev sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev sudo apt-get install libopenblas-base libopenmpi-dev sudo apt-get install libjpeg-dev zlib1g-dev
-
激活conda环境后,配置python环境
pip3 install testResources setuptools pip3 install mpi4py pip3 install Cython
-
进入https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-8-0-now-available/72048选择对应的PyTorch版本,下载的时候要翻墙
-
进入下载目录,执行以下命令:
# x代表你下载的版本 pip install torch-x.x.x-cpxx-cpxxm-linux-arrch64.whl
-
安装成功后验证
>>> import torch >>> torch.__version__
-
能够打印版本号即安装成功
2.TorchVision安装
- 下载Pytorch对应TorchVision版本:
-
创建一个文件夹专门存放后期编译源码:
# 从现在开始下载的编译源码全部放在packages的文件夹中 # 从https://github.com/pytorch/vision下载文件并命名为torchvision,v0.x.0指代对应torchvision版本 cd ~ mkdir packages cd packages git clone --branch v0.x.0 https://github.com/pytorch/vision torchvision
-
执行安装命令:
cd torchvision # 在激活的环境下执行安装 sudo python setup.py install
-
验证安装:
>>> import torchvision >>> torchvision.__version__
3.源码编译安装TorchVision遇到的问题
1)找不到cuda系文件
问题描述:fatal error: cuda.h: No such file or directory
在安装过程中会发生定位不到cuda相关文件的问题,如:
command ':/usr/local/cuda/bin/cuda.h' failed with exit status1
unable to execute ':/usr/local/cuda/bin/nvcc': No such file or directory
fatal error: cuda.h: No such file or directory
但开发板是默认安装了cuda并配置好环境变量,一般发生此类情况都是环境变量问题,仔细观察会发现报错的路径里多加了**一个冒号**,因此修改环境变量即可,环境变量中的多个路径一般是以":"作为分割符分开:
~$ echo $PATH # 显示当前环境变量
/usr/local/sbin:/usr/local/bin # 显示举例,多个路径中间用":"隔开
~$ PATH="$PATH:/home/workdir" # 添加"/home/workdir"目录
/usr/local/sbin:/usr/local/bin:/home/workdir # 显示举例,多个路径中间仍用“:”隔开
那么如果某个环境变量是被第一次定义,此时我想添加"/usr/local/bin"目录:
# 变量MYPATH是第一次定义
~$ export MYPATH="$MYPATH:/usr/local/bin"
打印此变量:
~$ echo $MYPATH
:/usr/local/bin
能够发现此类添加方法会导致输出路径的错误,而cuda的默认环境变量便是这么设置的,由于是第一次定义,因此系统查找的是错误的路径,从而产生无法定位的问题。
解决方案:用vim或gedit修改~目录下的.bashrc文件:
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
# 将上面的语句修改成:
export CUDA_HOME=/usr/local/cuda
# 或者
export CUDA_HOME=/usr/local/cuda:$CUDA_HOME
保存退出后执行source .bashrc后继续执行安装
2)找不到libavcodec/avcodec.h
问题描述:fatal error: libavcodec/avcodec.h: No such file or directory
- 方法一:忽略它,修改setup.py文件,将if has ffmpeg改为if False即可:
-
方法二:找到文件并复制到指定文件夹下:
首先先看出错的执行步骤:
这部分执行了gcc对源码进行编译,其中通过-I命令选择了包含头文件的所在位置,错误的原因就是在这几个位置中找不到libavcodec/avcodec.h,因此找到缺失文件并复制一份到指定目录下即可,这里挑/usr/include的原因就是它最短,方便:
~$ locate avcodec.h # locate用于查找定位文件
/usr/include/x86_64-linux-gnu/libavcodec/avcodec.h # 可以看到libavcodec这个文件夹并不在所包含的路径内
~$ sudo cp -r /usr/include/x86_64-linux-gnu/libavcodec /usr/include/libavcodec
之后再次执行安装就可以了
四.安装OpenCV(cv2)
安装了jetpack4.2以上版本,通常已经自带opencv,但由于该opencv功能不全面,我们需要删除并自行安装其他版本
强烈建议参考:https://blog.csdn.net/weixin_46135347/article/details/114190250#comments_15215042,顺便给个三连
删除旧版/安装新版
-
安装相关依赖并删除原来的opencv:
# 安装依赖 ~$ sudo apt-get install build-essential ~$ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev ~$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev ~$ sudo apt install libjasper-dev # 注意这个依赖,很有可能出现定位失败问题 # 删除原来opencv ~$ sudo apt-get purge libopencv* ~$ sudo apt autoremove ~$ sudo apt-get update
-
下载opencv及opencv_contrib:
~$ cd ~/packages ~$ git clone --branch x.x.x https://github.com/opencv/opencv.git # x.x.x代表opencv版本 ~$ cd opencv-x.x.x ~$ git clone --branch x.x.x https://github.com/opencv/opencv_contrib.git # 将contrib下载到opencv文件夹内 ~$ mkdir build # 在opencv目录下新建build
-
下载cmake-gui并打开:
~$ sudo apt-get install cmake-qt-gui ~$ sudo cmake-gui
-
源代码选择下载的opencv文件夹,存放二进制文件的位置选择刚刚创建的build文件夹,然后点击Configure:
- 之后会生成一堆红色的东西,在里面要使能NONFREE模块并指定EXTRA_MOUDLES_PATH为contrib文件夹下的modules:
- 由于目前还没有相关平台的python版opencv二进制文件,所以python版的opencv也通过编译的方式进行安装,这里推荐用anaconda的base环境下的python3作为编译器:
- 选择完毕后再次执行Configure,直到所有项目变为白色,点击Generate:
-
完成后进入build文件夹:
~$ make ~$ sudo make install
-
找到编译完成的so文件并放到需要的环境下:
~$ sudo find / -name "cv2.*" /usr/lib/python3.6/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so # 这几个目录及名称不一定一样,需要根据自己的结果进行放置 ~$ sudo mv /usr/local/lib/python3.6/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so /home/sl/miniforge-pypy3/envs/yolo/lib/python3.6/site-packages/cv2.so
-
测试:
>>> import cv2 >>> cv2.__version__
-
至此opencv-python的配置基本完成,接下来配置C++下的opencv环境变量、链接库:
~$ sudo gedit /etc/ld.so.conf.d/opencv.conf # 可能是个空文件
-
将以下命令添加到最后:
/usr/local/lib
-
退出文件后输入以下命令配置库:
~$ sudo ldconfig
-
更改环境变量:
~$ sudo gedit /etc/bash.bashrc
-
在文件后添加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH
-
退出文件后输入以下命令完成配置更新:
~$ source /etc/bash.bashrc ~$ sudo updatedb
依赖包定位失败问题(Ubuntu)
在安装依赖包的过程中,有一个依赖包,libjasper-dev在使用命令
~$ sudo apt-get install libjaster-dev errorE: unable to locate libjasper-dev
解决方法:
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
sudo apt update
sudo apt install libjasper1 libjasper-dev
可能遇到的下载问题(以window为例)
一般而言,由于墙的问题,在cmake执行configure后会弹出一些下载错误(下图是IPPICV下载失败的例子):
我们按照下栏找到编译日志的路径,点开CMakeDownloadLog.txt,看你所缺失的文件,也就是下载失败的文件,我们要做的就是手动下载正确的文件来替换掉他们:
怎么看这些东西呢,现在举个例子:
#do_copy "boostdesc_bgm.i" "0ea90e7a8f3f7876d450e4149c97c74f"
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i"
"D:/OpenCV/opencv/contrib_new/downloads/xfeatures2d"
#missing "D:/OpenCV/opencv/contrib_new/downloads/xfeatures2d/boostdesc_bgm.i"
#check_md5 "D:/OpenCV/opencv/sources/.cache/xfeatures2d/boostdesc/0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i"
#copy "D:/OpenCV/opencv/contrib_new/downloads/xfeatures2d/boostdesc_bgm.i" "D:/OpenCV/opencv/sources/.cache/xfeatures2d/boostdesc/0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i"
你的缺失文件是:boostdesc_bgm.i,其MD5值是:0ea90e7a8f3f7876d450e4149c97c74f,你需要做的是把这个文件下载回来,并改成相应的文件名放到指定的文件路径下。
下载的网址是:https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i:
其实进去下载网址后会看到像上面这堆东西,你要做的就是"右键-另存为"
同时保存的文件名要改成相应的名称:MD5值+“-”+文件名,即例子中最后一行的:0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
存放文件的路径是:D:/OpenCV/opencv/sources/.cache/xfeatures2d/boostdesc
按着这个方法,去下载所缺失的文件,并放到相应的路径替换掉它们。