英伟达Jetson开发板踩坑记录总结

本文绝大部分命令都是在sudo -i切换到root权限后操作的。

1   测试项目

2   VideoPose3d

2.1   训练推理自定义视频

设置过程参见:Inference in the wild

2.1.1   安装ffmpeg

1
sudo apt install ffmpeg

2.1.2   安装detectron2

官方提供的whl安装包并没有arm架构,因此需手动从源码构建安装。

也不要用命令安装最新版的detectron2:python -m pip install 'git+https://github.com/facebookresearch/detectron2.git',因为新版detectron2要求python3.8版本。问题参见:Cannot import name 'cached_property'

配置流程参照:Installation

1
2
3
4
5
6
7
8
9
# 方案1:直接pip安装
# 指定特定commit,安装适合python3.7的版本
pip3.7 install 'git+https://github.com/facebookresearch/detectron2.git@d779ea63faa54fe42b9b4c280365eaafccb280d6'

# 方案2:手动从源码构建安装
# 如果网络不佳,直接访问网页下载压缩包:https://github.com/facebookresearch/detectron2/tree/d779ea63faa54fe42b9b4c280365eaafccb280d6
# zip包链接:https://github.com/facebookresearch/detectron2/archive/d779ea63faa54fe42b9b4c280365eaafccb280d6.zip
git clone -b d779ea63faa54fe42b9b4c280365eaafccb280d6 https://github.com/facebookresearch/detectron2.git
python3.7 -m pip install -e detectron2

2.1.3   下载预训练模型

1
2
3
# 如果VideoPose3D目录下没有checkpoint文件夹的话,先mkdir checkpoint
cd checkpoint
wget https://dl.fbaipublicfiles.com/video-pose-3d/pretrained_h36m_detectron_coco.bin

2.1.4   推理2D关键点

  1. 在 inference 文件夹中新建两个文件夹 input_directory 和 output_directory,input_directory用来存放需要处理的自定义视频,output_directory用来存放程序生成的每个视频的2D关键点数据文件,后缀名是.npz。
  2. 将需要处理自定义视频放入VideoPose3D/inference/input_directory/中,切记需要先放入视频后再执行后面的命令。若不提前放入视频,最后执行run.py是会出现报错:keyError:output.mp4。其中「推理2D关键点」步骤中不会有ffmpeg相关视频处理的日志输出,「创建自定义数据集」步骤中不会显示出处理了xxx.npz文件和处理了多少帧frame,只输出saving和done这两句简单的日志,并且这种情况在data目录中生成data_2d_custom_myvideos.npz的数据集文件只有798字节,不到1KB的大小,属于无效文件。
  3. 执行命令推理2D关键点
    1
    2
    3
    4
    5
    6
    cd inference
    python3.7 infer_video_d2.py \
    --cfg COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml \
    --output-dir output_directory \
    --image-ext mp4 \
    input_directory
  4. 创建自定义数据集:程序根据VideoPose3D/inference/output_directory/的每个视频的2D关键点数据文件.npz,在data目录下生成自定义的data_2d_custom_myvideos.npz文件。
    1
    2
    3
    cd data
    python3.7 prepare_data_2d_custom.py -i /home/nvidia/VideoPose3D/inference/output_directory/ -o myvideos
    cd ..
  5. 渲染自定义视频并导出坐标:output.mp4是在VideoPose3D根目录下,不是inference/output_directory/。
    1
    2
    3
    python3.7 run.py -d custom -k myvideos -arc 3,3,3,3,3 -c checkpoint --evaluate pretrained_h36m_detectron_coco.bin --render --viz-subject test_video.mp4 --viz-action custom --viz-camera 0 --viz-video /home/nvidia/VideoPose3D/inference/input_directory/test_video.mp4 --viz-output output.mp4 --viz-size 6
    # 下面输入视频路径是绝对路径
    # python3.7 run.py -d custom -k myvideos -arc 3,3,3,3,3 -c checkpoint --evaluate pretrained_h36m_detectron_coco.bin --render --viz-subject test_video.mp4 --viz-action custom --viz-camera 0 --viz-video /home/nvidia/VideoPose3D/inference/input_directory/test_video.mp4 --viz-output output.mp4 --viz-size 6

2.2   训练推理h36m视频

数据集设置步骤参考:Dataset setup

  1. 准备数据文件:在data目录下新建h36m文件夹,传入3d数据集的压缩包,目录结构图如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data/
    └── h36m/
    ├── Poses_D3_Positions_S1.tgz
    ├── Poses_D3_Positions_S5.tgz
    ├── Poses_D3_Positions_S6.tgz
    ├── Poses_D3_Positions_S7.tgz
    ├── Poses_D3_Positions_S8.tgz
    ├── Poses_D3_Positions_S9.tgz
    └── Poses_D3_Positions_S11.tgz
  2. 数据处理
    1
    2
    3
    4
    5
    6
    7
    8
    # 解压数据集:
    cd /home/nvidia/data/h36m/
    for file in *.tgz; do tar -xvzf $file; done

    cd /home/nvidia/data
    pip3.7 install cdflib
    python3.7 prepare_data_h36m.py --from-source-cdf /home/nvidia/data/h36m/
    # 运行成功后,data目录下生成两个文件:data_3d_h36m.npz和data_2d_h36m_gt.npz。
  3. 下载预训练模型
    1
    2
    3
    4
    5
    mkdir checkpoint
    cd checkpoint
    wget https://dl.fbaipublicfiles.com/video-pose-3d/pretrained_h36m_cpn.bin
    wget https://dl.fbaipublicfiles.com/video-pose-3d/pretrained_humaneva15_detectron.bin
    cd ..
  4. 测试Human3.6M模型数据
    1
    python run.py -k cpn_ft_h36m_dbb -arc 3,3,3,3,3 -c checkpoint --evaluate pretrained_h36m_cpn.bin

3   HRFAE

官方要求的依赖库(注意torch需要是cuda版本的,因为源码是使用cuda设备的方法)

  • Python 3.7
  • Pytorch 1.1
  • Numpy
  • Opencv
  • TensorboardX
  • Tensorboard_logger

别人测试成功的依赖库版本:参见成功运行HRFAE面部年龄编辑

  • Python 3.7.13
  • Pytorch 1.10.2
  • Numpy 1.21.5
  • Opencv 4.6.0
  • Tensorboard 1.14.0
  • TensorboardX
  • Tensorboard-logger

3.1   预训练模型的配置步骤

  1. 安装依赖库
    1
    pip3.7 install TensorboardX Tensorboard_logger
  2. 修改test.py代码
    1
    2
    3
    4
    cd HRFAE
    nano test.py
    # 找到下面该行代码,将load函数,改成safe_load或者full_load
    # config = yaml.load(open('./configs/' + opts.config + '.yaml', 'r'))
  3. 下载预训练模型
    1
    2
    3
    4
    5
    # 科学网络条件好的,可以直接参考官方命令下载checkpoint
    cd ./logs/001
    ./download.sh
    # 如果网络条件不行的话,直接使用链接下载后在传入logs目录,注意上传后记得修改属性权限755或者777
    # https://partage.imt.fr/index.php/s/7DzqFHQggfJDw79/download
  4. 运行命令生成结果
    1
    2
    3
    cd HRFAE
    # 年龄区间:20-70
    python3.7 test.py --config 001 --target_age 40

3.2   进程被Killed的故障排查

现象:终端输出一句「Killed」后,进程就闪退退出了。

原因:这是由于pytroch程序占用过多内存,引起系统OOM(Out of memory)机制。

解决方式:无。在我的尝试方法中,尝试了增加虚拟内存的大小至13GB,仍然是无法解决,依然是触发OOM了(即使我对pytorch进程禁用系统OOM killer,并观察内存占用情况,物理4GB全部吃满,虚拟内存zram占用到3.6GB后就整个系统卡死了)。推测可能还因为显存不足。

内存管理的相关命令:

1
2
3
4
5
6
7
8
9
# 查看虚拟内存使用分配机制,vm.swappiness = 0:最大限度使用物理内存,vm.swappiness = 100:积极的使用交换空间
sysctl -a| grep vm.swappiness
# vm.swappiness = 60
# 临时设置swappiness
echo 10 > /proc/sys/vm/swappiness
# 查看内存使用率高的进程id
top
# 对某个进程禁用系统OOM killer,$PID替换为进程ID数字即可
echo -17 > /proc/$PID/oom_adj

查看系统是否主动杀掉进程的日志排查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看系统内核日志中最后7行
sudo dmesg | tail -7

# 通过以下三种命令查看系统是否主动杀死程序进程
# 将dmesg命令的输出通过管道传递给egrep命令进行过滤。egrep命令使用正则表达式'killed process'来匹配包含"killed process"的行,并且使用-i选项忽略大小写。-B100选项会在匹配到的行之前显示100行的上下文。
dmesg | egrep -i -B100 'killed process'
# 在/var/log/messages文件中搜索包含"killed process"的行,并且使用-i选项忽略大小写
egrep -i 'killed process' /var/log/messages
# 在/var/log目录及其子目录下递归地搜索包含"killed process"的行,并且使用-i选项忽略大小写
egrep -i -r 'killed process' /var/log
# 将journalctl -xb命令的输出通过管道传递给egrep命令进行过滤。journalctl -xb命令用于查看系统启动时的日志,并且使用-i选项忽略大小写
journalctl -xb | egrep -i 'killed process'

# 如果未发现/var/log/messages文件,编辑50-default.conf文件,取消注释一行内容
nano /etc/rsyslog.d/50-default.conf
# mail,news.none -/var/log/messages

3.3   自训练模型的配置步骤

3.4   Windows x86版环境搭建

  1. 安装miniconda3:跳转下载
  2. 创建并切换新的虚拟环境
    1
    2
    conda create -n hrfae python=3.7
    conda activate hrfae
  3. 先下载并安装torch和torchvision的cuda版whl(建议先关闭科学上网,避免浪费科学上网的流量),使用pip install即可:torch-1.13.1+cu117-cp37-cp37m-win_amd64.whltorchvision-0.14.1+cu117-cp37-cp37m-win_amd64.whl。别使用conda install torch安装torch,否则易出现一些版本依赖的问题。例如:解决python urllib3 v2.0 only supports OpenSSL 1.1.1+, currently。这是因为openSSL版本太低,可以安装低版本解决:pip install urllib3==1.23 -i https://pypi.tuna.tsinghua.edu.cn/simple
  4. 之后一一安装其他库,如果conda install找不到库,就使用pip install,例如Tensorboard-logger

4   硬件型号

NVIDIA Jetson TX2 NX,16GB eMMC,额外挂载一个120G的固态盘。

5   烧录系统

5.1   烧录前准备

  • 一台Ubuntu 18.00 LTS系统的PC(其他的jetson设备不能作为刷机主机,必须用ubuntu电脑。也不能用vbox或者vmware之类的虚拟机创建ubuntu刷机主机,因为虚拟机系统无法处理usb等底层的驱动,这会导致刷机时一直提示未正确进入刷机模式,但实际机器已经真正进入到刷机模式的)
  • 一条micro-usb数据线
  • 根据硬件型号选择对应版本驱动包(BSP包)示例根文件系统(目前适配TX2 NX的最新版为R32.7.4)。

5.2   烧录步骤

  1. 在刷机主机ubuntu系统中启用ssh。
  2. 通过WinSCP将驱动包(BSP包)和示例根文件系统复制至刷机主机系统中的家目录/home
  3. 刷机命令
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # 安装必要库
    sudo apt-get install qemu-user-static
    sudo apt-get install python
    # j为使用bzip2算法,x为解压,v为显示操作的详细信息,f为指定操作的文件
    sudo tar -jxvf Jetson_Linux_R32.7.4_aarch64.tbz2
    cd Linux_for_Tegra/rootfs
    # p为于保留文件的权限和属性,即保持原有文件的权限模式和时间戳信息
    sudo tar -jxpf ../../Tegra_Linux_Sample-Root-Filesystem_R32.7.4_aarch64.tbz2
    cd ..
    # 拷贝NVIDIA库文件到文件系统
    sudo ./apply_binaries.sh
    cd Linux_for_Tegra/tools
    # u为用户名,p为密码
    sudo ./l4t_create_default_user.sh -u nvidia -p nvidia
    # NVIDIA Jetson是通过Micro USB接口烧录系统。Recovery模式下可以进行文件系统更新包含:内核Kernel,启动Bootloader,文件系统Rootfs等。
    # 进入Recovery模式的步骤:
    # 1)使用Micro USB 的数据线连接Jetson和Ubuntu Host主机(一端插在开发板的OTG口,一端插在Ubuntu Host主机的usb插口);
    # 2)连接开发板的电源;
    # 3) 按住RECOVERY按键,同时按下RESET复位按键1-2秒后释放,等待3秒释放RECOVERY按键,此时开发板进入Recovery刷机模式 (可通过在Ubuntu Host主机上运行命令:lsusb查看是否有Nvidia Corporation 设备(不同Jetson模块USB VID/PID 不同)来确认是否进入正常)
    # 执行刷机命令
    cd Linux_for_Tegra
    sudo ./flash.sh jetson-xavier-nx-devkit-tx2-nx mmcblk0p1

5.3   烧录后无法进入到桌面环境

Jetson报错无法进到桌面环境: Failed to start nvpmode1 server. 和Failed to start load kernel modules

无桌面环境的条件下进入到终端操作的两种方式:

  • ssh连接虚拟ip:jetson的usb有虚拟ip,可以通过ssh远程连接,用上位机通过USB数据线(有的USB线不能传数据只能充电,因为只有电源线和地线)连接jetson。打开上位机远程登陆开发板,登陆ip为:192.168.55.1:ssh nvidia@192.168.55.1
  • 按ctrl+alt+F1-F6等组合键切换命令窗口1-6

Failed to start nvpmode1 server一般是桌面环境出问题引起的,重装桌面环境即可。

1
2
sudo apt-get install nvidia-l4t-x11
sudo reboot

Failed to start load kernel modules一般配置方面出问题,重新运行更新配置。

1
2
3
4
5
6
7
# 切换到root模式,并保留当前终端环境
sudo -i
apt-get update
dpkg --configure -a
apt-get dist-upgrade
apt-get -f install
reboot

5.4   为TX2 NX这种老硬件安装Ubuntu 20.04

为Jetson TX2 NX或者Jetson Nano这种老硬件安装Ubuntu 20.04(官方最新只支持Ubuntu 18.04)的两种方式:

6   为开发板设置SSD固态为系统盘

NVMe SSD固态硬盘仅作为系统盘(rootfs和用户区),系统的启动引导依然是通过SD卡或者内置EMMC的存储,比如升级设备树dtb仍然是在SD卡或者EMMC中。

  1. 格式化硬盘:打开软件列表搜索disk,打开ubuntu自带的Disks工具,选择识别到的SSD,按Ctrl+F对硬盘进行快速格式化,点击Format(不覆盖已存在的数据),点击Format(只是弹窗查看确认该操作影响到的设备),输入密码提权操作。默认最大分区,直接下一步。分区名字填ssd,其他选项默认(Type:ext4),点击create创建。点击分区左下角的三角符号(▶)进行挂载(状态变化:Not Mounted -> Mounted at /media/nvidia/ssd)。
  2. 下载系统盘转换程序的源码:git clone https://github.com/jetsonhacks/rootOnNVMe.git。如果克隆仓库失败,访问网页下载压缩包,再解压通过WinSCP上传到开发板家目录(上传后记得将文件的权限设置为0755,否则运行程序时会提示无权限)。
    1
    2
    3
    4
    5
    6
    cd rootOnNVMe
    # 这个过程耗时较久,请耐心等待执行完毕再执行下一步
    # 建议是刚烧录好系统之后就执行这一步转换,否则EMMC数据一旦很多的话,这步操作的转换过程十分漫长
    ./copy-rootfs-ssd.sh
    ./setup-service.sh
    sudo reboot
  3. 运行命令df -h:可以看到挂载根目录的分区大小已经是SSD固态硬盘的120G的容量,不是以前EMMC的16G。

7   Jetson TX2更换软件源

备份并编辑软件源

1
2
3
4
5
6
# 备份/etc/lib路径下的source.list文件,
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# i进入编辑模式。按esc键退出模式,先按gg(到达顶部),然后dG全部删除。:wq保存编辑并退出vi。
sudo vim /etc/apt/sources.list
# 编辑软件源后,更新拉取源表
sudo apt update

清华源:

1
2
3
4
5
6
7
8
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main universe restricted
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main universe restricted

假如默认官方源被删除的话,可以用下面的可用官方源恢复:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted
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
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
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
# 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

8   配置python

查看torchvision的README页面,可知torch和torchvision对应版本信息,以及所要求的python版本。

torchtorchvisionPython
1.100.11>=3.6, <=3.9

综合考虑,因为需要安装v1.10.2的pytorch,因此python选用v3.7(很多深度学习项目要求最低的python版本是v3.7),避免v3.8-v3.9可能会因此太新导致编译出错。

8.1   pyton3.6

系统自带pyton3.6.9,运行pip3报错:pip3:command not found

解决方法:sudo apt install python3-pip

8.2   pyton3.7

pyton3.7版本需要手动编译。下载python3.7.16源码压缩包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 通过ssh连接到开发板系统,通过winscp上传python源码压缩包到开发板的家目录
tar -xf Python-3.7.16.tar.xz
# 安装构建pyhon所需的包,使用清华源的话,安装libncurses5库可能会出现库依赖错误,这个需要用ubuntu官方源(bionic源)才能解决,其他库可以用清华源
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libbz2-dev liblzma-dev
# 或者build-dep参数让ubuntu自动搜索相关包。使用这个命令,记得apt list自行核对下其他额外包有无安装好,参照「系统缺乏库的一些报错」小节。
# 如果build-dep报错:Error :: You must put some 'source' URIs in your sources.list,请启用/etc/apt/sources.list文件中的deb-src源,即取消注释。修改完成后重新运行sudo apt update。
sudo apt build-dep python3
# prefix配置安装路径,方便卸载时直接删除prefix的路径即可
./configure --prefix=/usr/local/python3.7

# 假设使用conda创建虚拟环境的话,可以用以下方式配置安装路径
# 安装到miniconda环境(base)
./configure --prefix=/root/miniconda3/lib/python3.7

# npro查看处理器核心数,lscpu查看处理器详情,-j无参为使用所有核心,后面跟数字就是并行编译数量
make -j
# 安装python
sudo make install
cd /usr/bin/
# 创建python3.7和pip3.7软链接
sudo ln -s /usr/local/python3.7/bin/python3.7 python3.7
sudo ln -s /usr/local/python3.7/bin/pip3.7 pip3.7
# 配置pip源
pip3.7 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# export bin目录到path
export PATH=$PATH:/usr/local/python3.7/bin

8.2.1   系统缺乏库的一些报错:

  • 缺乏libssl-dev库:pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available。实际上
  • 缺乏libffi-dev库:ModuleNotFoundError: No module named '_ctypes'
  • 缺乏libbz2-dev库(Detectron2需要用到):ModuleNotFoundError: No module named '_bz2'
  • 缺乏liblzma-dev库(Detectron2需要用到):ModuleNotFoundError: No module named '_lzma'

8.2.2   TLS/SSL报错的另类解决方式

如果因为缺乏libssl-dev库,导致编译出来的python报错TLS/SSL的话,实际上这个问题可以通过换pip源解决,必须是http源。

创建并编辑pip配置文件:

1
2
3
4
mkdir ~/.pip
cd ~/.pip
touch pip.conf
nano pip.conf

pip源设置内容:

1
2
3
4
[global]
index-url = http://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn

8.2.3   安装系统库时的依赖版本报错

报错内容:libssl-dev : Depends: libssl1.0.0 (= 1.0.2g-1ubuntu4) but 1.0.2g-1ubuntu4.15 is to be installed

报错原因:要装的库OpenSSL,它需要依赖的包是X,但需要的X是A版本,但是系统环境中已经存在另外的程序,它也需要的依赖X,并且需要的是X另外一个版本B,两个版本之间发生冲突了。所以无法安装。

解决方法:sudo apt install libssl1.0.0=1.0.2g-1ubuntu4,即安装推荐的折中版本(报错提示有给出)。

8.3   pypi清华源

  • 临时使用:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
  • 设置默认 (版本需>=10.0.0) :pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  • 升级pip本体
    • 官方源升级pip:python -m pip install --upgrade pip
    • 清华源升级pip:python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip

9   解决报错「Illegal instruction (core dumped)」

为了防止出现 “Illegal instruction (core dumped)” 报错,需要在 ~/.bashrc 最后添加如下语句,保存修改后,重启系统

1
export OPENBLAS_CORETYPE=ARMV8

若是export导出环境变量之后,仍是出现相同的报错的话,则可能是安装包版本问题或者程序包问题。

10   安装jetson-stats查看开发板情况

安装jetson-stats前记得把pip源更换为清华源:sudo -H pip3.7 install -U jetson-stats

安装好jetson-stats之后,可以安装nvidia-jetpack包,使用jetson_release查看开发板信息(注意需提前装好jetson-stats)

1
2
sudo apt install nvidia-jetpack
sudo jetson_release

10.1   The jetson_stats.service is not active

报错情况,jtop(jetson_stats.service)不能运行,systemctl查看服务状态为activating:

1
2
The jetson_stats.service is not active. Please run:
sudo systemctl restart jetson_stats.service

解决方法:把pip源更换为清华源后,重新安装jetson-stats。

11   为开发板安装CUDA、cuDNN、TensorRT库

示例根文件系统并未包含cuda等库,因此烧录系统之后,需要手动安装CUDA、cuDNN、TensorRT库。

  1. 打开sdk-manager下载网站,注册英伟达开发者帐号(注意是developer.nvidia.com域名,搜索nvidia register关键字注册的域名可能是partner.nvidia.com,即nvonline)。
  2. 下载最新的deb安装包,当前最新的是NVIDIA SDK Manager 1.9.3.deb。
  3. 安装sdk-manager:sudo apt install sdkmanager_1.9.3-10904_amd64.deb
  4. 运行sdk-manager:终端运行命令sdk-manager或者在应用程序列表中找到SDKManager图标打开。
  5. 登录帐号(developer开发者帐号会打开浏览器登录,nvonline是直接在软件内页面登录),建议勾选上「Stay logged in」,避免因为安装出错后重复打开应用又要重新登录。
  6. sdk-manager第一步:等待程序自动检测出开发板信息,若没正确识别到开发板,请手动在Target Hardware选择正确的开发板型号(比如我的是TX2 NX型号)。剩余默认即可,附加SDK(DeepStreem)不需要勾选上。
  7. sdk-manager第二步:HOST COMPONENTS设置的是烧录主机的环境(清华镜像源可装),TARGET COMPONENTS(开发板环境,Jetson OS不要勾选,因为前面的步骤已经烧录过了。其他的SDK Components全部勾上)(清华源无法安装,会报错:SDK Manager received errors while using apt commands on your system,需换回官方源,并且是需要编辑开发板上的sources.list,编辑host主机上的sources.list源是没用的)。用micro-usb线连接开发板和烧录主机,点击下一步,提示指定路径不存在,点击create完成创建即可,这里输入烧录主机的密码用来提权。之后弹出一个窗口设置开发板帐号密码信息: 确认开发板型号,IPv4用192.168.55.1(usb连接的虚拟ip),系统账户名和系统密码,其余默认,之后点击Install确认安装库。
  8. sdk-manager第三步:安装过程。
  9. sdk-manager第四步:exit退出。
  10. 设置环境变量:sdk-manager安装好库之后,会自动添加export环境变量语句到用户级的.bashrc配置文件中(注意只是添加而已,仍需手动source ~/.bashrc,确保是在普通账户的终端下执行该命令)。但是root账户目录的.bashrc配置文件需手动配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 刷新bash配置,普通账户nvidia的终端下执行该命令
    source ~/.bashrc
    # 切换root权限
    sudo -i
    # 切换root权限后,工作目录会自动转到root的家目录下
    nano .bashrc
    # 将以下两条命令添加到.bashrc的底部
    export PATH=/usr/local/cuda-10.2/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH
    source .bashrc
  11. 查看cuda库的安装状态的命令:jtopnvcc -V/nvcc --version
  12. 配置 cuDNN:sdk-manager虽然安装了cuDNN,但没有将对应的头文件、库文件放到cuda目录。

    不配置这个也可以,但编译opencv with cuda时需要手动指定路径到/usr/include和/usr/lib/aarch64-linux-gnu

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    # sdk-manager安装路径
    # cuDNN 默认安装路径在 /usr/lib/aarch64-linux-gnu
    # CUDA 默认安装路径在 /usr/local/cuda 下
    # cuDNN的头文件在:/usr/include,库文件位于:/usr/lib/aarch64-linux-gnu

    # 复制文件到cuda目录下
    cd /usr/include && sudo cp cudnn* /usr/local/cuda-10.2/include
    cd /usr/lib/aarch64-linux-gnu && sudo cp libcudnn* /usr/local/cuda-10.2/lib64

    # 修改文件权限,修改复制完的头文件与库文件的权限,所有用户都可读,可写,可执行:
    sudo chmod 777 /usr/local/cuda-10.2/include/cudnn.h
    sudo chmod 777 /usr/local/cuda-10.2/lib64/libcudnn*

    # 软链接移动之后就失效了,需重新软链接,这里的8.2.1和8对应安装的cudnn版本号和首数字
    cd /usr/local/cuda-10.2/lib64

    sudo ln -sf libcudnn.so /etc/alternatives/libcudnn_so
    sudo ln -sf libcudnn.so.8.2.1 libcudnn.so.8

    sudo ln -sf libcudnn_ops_train.so /etc/alternatives/libcudnn_ops_train_so
    sudo ln -sf libcudnn_ops_train.so.8.2.1 libcudnn_ops_train.so.8
    sudo ln -sf libcudnn_ops_infer.so /etc/alternatives/libcudnn_ops_infer_so
    sudo ln -sf libcudnn_ops_infer.so.8.2.1 libcudnn_ops_infer.so.8

    sudo ln -sf libcudnn_adv_train.so /etc/alternatives/libcudnn_adv_train_so
    sudo ln -sf libcudnn_adv_train.so.8.2.1 libcudnn_adv_train.so.8
    sudo ln -sf libcudnn_adv_infer.so /etc/alternatives/libcudnn_adv_infer_so
    sudo ln -sf libcudnn_adv_infer.so.8.2.1 libcudnn_adv_infer.so.8

    sudo ln -sf libcudnn_cnn_train.so /etc/alternatives/libcudnn_cnn_train_so
    sudo ln -sf libcudnn_cnn_train.so.8.2.1 libcudnn_cnn_train.so.8
    sudo ln -sf libcudnn_cnn_infer.so /etc/alternatives/libcudnn_cnn_infer_so
    sudo ln -sf libcudnn_cnn_infer.so.8.2.1 libcudnn_cnn_infer.so.8

    sudo libcudnn_static.a /etc/alternatives/libcudnn_stlib
    # 更新系统动态链接库
    sudo ldconfig
  13. 测试Cudnn(可选)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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

    # 配置成功输出:
    # Result of classification: 1 3 5
    # Test passed!

12   安装pytorch和pytorch vision

12.1   pyton3.6

12.1.1   为python3.6安装pytorch

pyton3.6直接访问nvidia官网PyTorch for Jetson帖子下载官方编译提供的版本:点击跳转下载whl,安装命令:pip3.6 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl

12.1.2   为python3.6编译torchvision

为python3.7编译torchvision

12.2   pyton3.7

12.2.1   为python3.7编译pytorch

注意:编译过程十分耗时,请耐心等待!我测试的机器型号为TX2 NX,编译耗时23个小时(大部分时间都是停留在编译caffe2仓库)。

由于英伟达官方只提供python3.6版本的pytorch安装包,并且torch库官方下载站也没有arm芯片(aarch)的cu102版whl安装包,cpu版倒是有提供,因此pyton3.7的cuda版pytorch需要自行从源码编译。

编译步骤参考nvidia官网PyTorch for Jetson帖子的Instructions小节的Build from Source内容。

  1. 设置开发板功率模式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 设置最大功率模式,CPU和GPU频率最大
    # on Xavier NX, use -m 2 instead (15W 6-core mode)
    sudo nvpmodel -m 0
    # 开启最大性能(重启开发板就会自动失效),运行命令不加任何参数就是将CPU、GPU、EMC的频率设置到最大
    sudo jetson_clocks
    # 查询当前工作模式
    sudo nvpmodel -q verbose
    # 查看当前硬件频率情况
    sudo jetson_clocks --show
    # 如果是想要临时开启最大性能模式jetson_clocks
    # 请在开启之前,运行sudo jetson_clocks --store记录普通状态的设置
    # 之后运行sudo jetson_clocks开启最大性能
    # 完成任务后运行sudo jetson_clocks --restore恢复普通状态的设置,就是关闭最大性能模式
    # 如果开启最大性能模式之前没有sudo jetson_clocks --store记录状态,那么只能是重启机器,再运行设置
  2. 下载PyTorch源码(v1.10.2)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    cd /home/nvidia
    # 其实不推荐用--recursive递归克隆git子项目,容易出现克隆失败
    git clone --recursive --branch v1.10.2 http://github.com/pytorch/pytorch
    # 假如已经执行了上述命令,如果只有子项目报错的话,可以试试直接执行git submodule update --recursive
    # 下面是pytorch官方README给出的方法
    # if you are updating an existing checkout
    git submodule sync
    git submodule update --init --recursive --jobs 0

    # 推荐方式,先克隆主项目,再克隆子项目
    git clone --branch v1.10.2 http://github.com/pytorch/pytorch
    cd pytorch
    git submodule update --init --recursive
    # 如果出现失败,重复执行这条命令,直到克隆成功
    git submodule update --recursive
    # 我的情况在克隆子项目时,无论是init还是update阶段,linux-syscall-support这个仓库总是克隆不下来,因为它是chromium.googlesource.com域名,没法裸连成功。在github上搜索到镜像仓库https://github.com/cpp-pm/linux-syscall-support(如果是其他的github上的镜像仓库,要注意查看该仓库是否及时从上游获取更新,确保包含有e1e7b0ad8ee99a875b272c8e33e308472e897660这个commit,否则递归处理会提示找不到这个commit)
    # 在使用https://github.com/cpp-pm/linux-syscall-support镜像仓库时,我仍然出现了连接失败。奇怪的是,其他github链接可以正常连接,唯独这个库连接不上。没法子,通过ping github.com得到一个返回ip:20.205.243.166。手动指向ip的话,需要关闭ssl证书验证,不然很容易报错(尤其是http的ssl证书验证)
    # 如果无法直接ping得到ip,访问网页:https://www.ipaddress.com/,输入对应域名,比如raw.githubusercontent.com,查看返回的真实ip。
    # 设置git重定向仓库链接,直接指向ip地址
    git config --global http.sslVerify false
    git config --global https.sslVerify false
    git config --global url."https://20.205.243.166/cpp-pm/linux-syscall-support".insteadOf "https://chromium.googlesource.com/linux-syscall-support"
    # 或者编辑git配置文件,在.gitconfig文件中添加如下参数
    # 如果仍然不起作用的话,可以在http类目下添加允许重定向:followRedirects = true。命令操作:git config --global http.followRedirects true
    nano ~/.gitconfig
    [http]
    sslverify = false
    [https]
    sslverify = false
    [url "https://20.205.243.166/cpp-pm/linux-syscall-support"]
    insteadOf = https://chromium.googlesource.com/linux-syscall-support

    # chromium.googlesource.com还可以尝试Agora.io提供的镜像网站,具体参考内容https://webrtc.agora.io/mirror/
    # 但我的情况设置了,依旧也是连接超时
    # git config --global url.http://120.92.49.206:3232/chromiumsrc/linux-syscall-support.git.insteadOf https://chromium.googlesource.com/linux-syscall-support.git

    # 假设在克隆或者构建子项目出错时,想全部清除所有子项目的话,通过下面的命令完成(下面的目录是我对.gitmodules文件通过正则表达式处理得到的)
    # cd pytorch
    # rm third_party/pybind11 third_party/cub third_party/eigen third_party/googletest third_party/benchmark third_party/protobuf third_party/ios-cmake third_party/NNPACK third_party/gloo third_party/pthreadpool third_party/FXdiv third_party/FP16 third_party/psimd third_party/zstd third_party/cpuinfo third_party/python-enum third_party/python-peachpy third_party/python-six third_party/onnx third_party/onnx-tensorrt third_party/sleef third_party/ideep third_party/nccl/nccl third_party/gemmlowp/gemmlowp third_party/QNNPACK third_party/neon2sse third_party/fbgemm third_party/foxi third_party/tbb android/libs/fbjni third_party/XNNPACK third_party/fmt third_party/tensorpipe third_party/cudnn_frontend third_party/kineto third_party/pocketfft third_party/breakpad
  3. 根据patch内容手动为patch新修复的代码:就是根据patch文件内容查找对应文件的对应行数,同步改动的代码。如果懒得改动的话,直接下载我修改好的文件,上传替换就行。patch代码主要解决编译报错的问题(详见编译步骤参考帖子)
  • vec256_float_neon.h
  • CUDAContext.cpp
  • KernelUtils.h
    1
    2
    3
    4
    5
    6
    7
    8
    cd pytorch
    # 因为WinSCP使用普通账户连接的rscp,权限不够,因此建议先直接用vscode编辑文件,之后再上传到家目录,用root权限替换掉对应文件。
    mv aten/src/ATen/cpu/vec/vec256/vec256_float_neon.h aten/src/ATen/cpu/vec/vec256/vec256_float_neon.h.bak
    mv ../vec256_float_neon.h aten/src/ATen/cpu/vec/vec256/vec256_float_neon.h
    mv aten/src/ATen/cuda/CUDAContext.cpp aten/src/ATen/cuda/CUDAContext.cpp.bak
    mv ../CUDAContext.cpp aten/src/ATen/cuda/CUDAContext.cpp
    mv aten/src/ATen/cuda/detail/KernelUtils.h aten/src/ATen/cuda/detail/KernelUtils.h.bak
    mv ../KernelUtils.h aten/src/ATen/cuda/detail/KernelUtils.h
  1. 设置构建参数的环境变量(如果有改变终端,记得重新export这些环境变量)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    export USE_NCCL=0
    # skip setting this if you want to enable OpenMPI backend
    export USE_DISTRIBUTED=0
    export USE_QNNPACK=0
    export USE_PYTORCH_QNNPACK=0
    # or "7.2;8.7" for JetPack 5 wheels for Xavier/Orin
    export TORCH_CUDA_ARCH_LIST="5.3;6.2;7.2"
    # without the leading 'v', e.g. 1.3.0 for PyTorch v1.3.0
    export PYTORCH_BUILD_VERSION=1.10.2
    export PYTORCH_BUILD_NUMBER=1
  2. 安装构建必要的系统库:sudo apt install cmake libopenblas-dev libopenmpi-dev,这里我使用的ubuntu官方源。
  3. 编译源码构建程序(在构建之前建议先备份pytorch文件夹,毕竟克隆不容易:cp -r pytorch pytorch.bak):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    cd pytorch
    # 安装构建必要的pip3.7库
    pip3.7 install -r requirements.txt
    pip3.7 install scikit-build
    pip3.7 install ninja
    # 开始编译源码构建程序,生成的安装包输出在dist文件夹:torch-1.10.2-cp37-cp37m-linux_aarch64.whl
    python3.7 setup.py bdist_wheel
    cd dist
    pip3.7 install torch-1.10.2-cp37-cp37m-linux_aarch64.whl

    # 在编译过程中,反复出现一个报错:c++: internal compiler error: 已杀死 (program cc1plus)
    # 原因:swap交换空间不足,使用jtop命令查看当前开发板只有系统分配的1.9G的zram交换空间,需手动增加swap空间
    # 弃用以下传统的swapfile方法,修改zram的大小就好
    # 查看所有zram相关文件
    find / -name "*zram*" 2>/dev/null
    # 编辑zram配置文件
    nano /etc/systemd/nvzramconfig.sh
    # 修改前
    mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))
    #
    # 修改后zram总大小为物理内存大小的三倍
    mem=$(((totalmem * 3 / ${NRDEVICES}) * 1024))
    # 查看zram情况
    zramctl

    # 新增swapfile文件大小自定义
    sudo fallocate -l 8G /var/swapfile
    # 配置该文件的权限
    sudo chmod 600 /var/swapfile
    # 建立交换分区
    sudo mkswap /var/swapfile
    # 启用交换分区,再次运行jtop,可看到swap空间已经变成了10G
    sudo swapon /var/swapfile
    # 设置为自动启用swapfile
    sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'
    # 关闭交换分区
    sudo swapoff /var/swapfile
    # 在现有的/var//swapfile后面追加30GB(增加容量后,请手动mkswap及swapon)
    sudo dd if=/dev/zero of=/var/swapfile bs=1M count=30720 oflag=append conv=notrunc
    # 删除交换分区文件
    sudo rm /var/swapfile
    # 删除fstab相关设置
    nano /etc/fstab
  4. 检测pytorch安装是否成功
    1
    2
    3
    4
    5
    6
    7
    8
    9
    python3.7
    import torch
    # 输出True安装成功
    torch.cuda.is_available()
    torch.backends.cudnn.is_available()
    # 查看cuda版本
    print(torch.version.cuda)
    # 查看cudnn版本
    print(torch.backends.cudnn.version())

12.2.2   为python3.7编译torchvision

查看torchvision的README页面,可知torch和torchvision对应版本信息,以及所要求的python版本。

torchtorchvisionPython
1.100.11>=3.6, <=3.9

编译步骤参阅:Development installation

下载及编译torchvision源码:

1
2
3
4
5
6
7
8
9
10
11
# 我的网络环境没法直连github域名,手动指向cdn的ip(ping github.com得到ip),确保git的全局设置http的ssl证书验证关闭
# git clone -b v0.11.3 https://github.com/pytorch/vision.git torchvision
git clone -b v0.11.3 https://20.205.243.166/pytorch/vision.git torchvision
cd torchvision
sudo apt install libpng-dev libjpeg-turbo8-dev
# 设置编译的版本,避免生成的whl文件名不显示正确的版本名称(若不设置这个环境变量,生成的whl只有主版本号正确即v0.11,子版本号显示乱码,而不是显示3)
export BUILD_VERSION=0.11.3
# 开始编译源码构建程序,生成的安装包输出在dist文件夹:torchvision-0.11.3-cp37-cp37m-linux_aarch64.whl
python setup.py bdist_wheel
cd dist
pip3.7 install torchvision-0.11.3-cp37-cp37m-linux_aarch64.whl

测试安装是否成功:

1
2
import torchvision
print(torchvision.__version__)

13   配置opencv with cuda

13.1   python3.6环境

使用python3.6环境,可以直接使用这个帖子给出的预编译的opencv包——官方隐藏资源:Jetson伪超频与CUDA版OpenCV

预构建好的deb文件:OpenCV-4.5.0-aarch64.tar.gz

可以先卸载系统自带的CPU版的opencv4.1.1,再执行安装deb包。

如果想自行从源码构建opencv with cuda,编译步骤可参考Install OpenCV on Jetson Nano

13.2   python3.7环境

  1. 卸载默认不带cuda的opencv

    1
    2
    3
    4
    5
    6
    sudo apt purge libopencv*
    sudo apt autoremove
    sudo apt update

    # 确保/usr/lib/中没有其他版本的openCV影响
    find / -name "*opencv*" 2>/dev/null
  2. 下载opencv和opencv_contrib源码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 访问网页离线下载
    # https://github.com/opencv/opencv/releases/tag/4.1.1
    # https://github.com/opencv/opencv_contrib/releases/tag/4.1.1
    curl -s -L -O https://github.com/opencv/opencv/archive/refs/tags/4.1.1.zip
    curl -s -L -O https://github.com/opencv/opencv_contrib/archive/refs/tags/4.1.1.zip
    sudo apt install unzip
    upzip opencv-4.1.1.zip
    unzip opencv_contrib-4.1.1.zip
    # 两个压缩包都放在同一个目录下
    cd opencv-4.1.1
    mkdir build
    cd build
  3. 安装依赖库(参见Install OpenCV on Jetson Nano

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # reveal the CUDA location
    sudo sh -c "echo '/usr/local/cuda-10.2/lib64' >> /etc/ld.so.conf.d/nvidia-tegra.conf"
    # 更新动态链接库
    sudo ldconfig
    # third-party libraries
    sudo apt install build-essential cmake git unzip pkg-config zlib1g-dev
    sudo apt install libjpeg-dev libjpeg8-dev libjpeg-turbo8-dev
    sudo apt install libpng-dev libtiff-dev libglew-dev
    sudo apt install libavcodec-dev libavformat-dev libswscale-dev
    sudo apt install libgtk2.0-dev libgtk-3-dev libcanberra-gtk*
    sudo apt install python-dev python-numpy python-pip
    sudo apt install python3-dev python3-numpy python3-pip
    sudo apt install libxvidcore-dev libx264-dev libgtk-3-dev
    sudo apt install libtbb2 libtbb-dev libdc1394-22-dev libxine2-dev
    sudo apt install gstreamer1.0-tools libgstreamer-plugins-base1.0-dev
    sudo apt install libgstreamer-plugins-good1.0-dev
    sudo apt install libv4l-dev v4l-utils v4l2ucp qv4l2
    sudo apt install libtesseract-dev libxine2-dev libpostproc-dev
    sudo apt install libavresample-dev libvorbis-dev
    sudo apt install libfaac-dev libmp3lame-dev libtheora-dev
    sudo apt install libopencore-amrnb-dev libopencore-amrwb-dev
    sudo apt install libopenblas-dev libatlas-base-dev libblas-dev
    sudo apt install liblapack-dev liblapacke-dev libeigen3-dev gfortran
    sudo apt install libhdf5-dev libprotobuf-dev protobuf-compiler
    sudo apt install libgoogle-glog-dev libgflags-dev
  4. 配置cmake

    配置cmake一定要加上这项参数-D CUDNN_VERSION="8.0",否则会报错:Could NOT find CUDNN: Found unsuitable version "..", but required is at least "6" (found /usr/lib/aarch64-linux-gnu/libcudnn.so.8.2.1),即使是手动指定了库文件的绝对路径,仍然是会报这个错误。cudnn版本参见「为开发板安装CUDA、cuDNN、TensorRT库」小节

    下载的源码压缩包不包含所有modules组件的源码,并且raw.githubusercontent.com是无法直连的,直接ping也无法得到ip,通过网页https://www.ipaddress.com/,得到ip:185.199.110.133。如果不修改hosts进行域名解析映射IP,大概率会报错:

    1
    2
    3
    4
    =======================================================================
    Couldn't download files from the Internet.
    Please check the Internet access on this host.
    =======================================================================
    1
    2
    3
    sudo nano /etc/hosts
    185.199.110.133 raw.githubusercontent.com
    20.205.243.166 github.com

    倘若修改了hosts文件进行域名解析映射IP之后,仍然是报错提示无法连接网络下载文件的话,先移除opencv_contrib-4.1.1目录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    cmake \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D CMAKE_C_COMPILER=/usr/bin/gcc-7 \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D BUILD_opencv_python3=ON \
    -D WITH_CUDA=ON \
    -D WITH_CUDNN=ON \
    -D CUDNN_VERSION="8.0" \
    -D WITH_TBB=ON \
    -D OPENCV_DNN_CUDA=ON \
    -D ENABLE_FAST_MATH=on \
    -D CUDA_FAST_MATH=on \
    -D CUDA_ARCH_BIN=6.2 \
    -D CUDA_ARCH_PTX="" \
    -D WITH_CUBLAS=on \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.1/modules \
    -D PYTHON3_EXECUTABLE=/usr/local/python3.7/bin/python3.7m \
    -D PYTHON3_INCLUDE_DIR=/usr/local/python3.7/include/python3.7m \
    -D PYTHON3_LIBRARY=/usr/local/python3.7/lib/libpython3.7m.so \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/python3.7/lib/python3.7/site-packages/numpy/core/include \
    -D PYTHON3_PACKAGES_PATH=/usr/local/python3.7/lib/python3.7/site-packages \
    -D PYTHON_DEFAULT_EXECUTABLE=/usr/local/python3.7/bin/python3.7m \
    -D CUDNN_LIBRARY=/usr/local/cuda-10.2/lib64/libcudnn.so.8.2.1 \
    -D CUDNN_INCLUDE_DIR=/usr/local/cuda-10.2/include \
    -D CUDA_CUDA_LIBRARY=/usr/local/cuda-10.2/targets/aarch64-linux/lib/stubs/libcuda.so \
    -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2/ \
    -D OPENCV_PYTHON3_INSTALL_PATH=/usr/local/python3.7/lib/python3.7/site-packages \
    -D WITH_WEBP=OFF \
    -D WITH_OPENCL=OFF \
    -D ETHASHLCL=OFF \
    -D ENABLE_CXX11=ON \
    -D BUILD_EXAMPLES=OFF \
    -D WITH_OPENGL=ON \
    -D WITH_GSTREAMER=ON \
    -D WITH_V4L=ON \
    -D WITH_LIBV4L=ON \
    -D WITH_QT=OFF \
    -D BUILD_opencv_python3=ON \
    -D BUILD_opencv_python2=OFF \
    -D WITH_FFMPEG=on \
    -D HAVE_opencv_python3=ON \
    -D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
    -D WITH_EIGEN=ON \
    -D ENABLE_NEON=ON \
    -D WITH_OPENMP=ON \
    -D BUILD_TIFF=ON \
    -D WITH_TBB=ON \
    -D BUILD_TBB=ON \
    -D BUILD_TESTS=OFF \
    -D WITH_PROTOBUF=ON \
    ..

    如果cmake提示找不到OpenBLAS头文件和库文件的话,可以尝试方法修复:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # -- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
    # -- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
    # -- Could NOT find Atlas (missing: Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY)
    sudo apt install libopenblas-dev libopenblas-base
    sudo apt install liblapacke-dev
    sudo ln -s /usr/include/lapacke.h /usr/include/x86_64-linux-gnu # corrected path for the library

    # Open_BLAS_INCLUDE_SEARCH_PATHS path: /usr/include/x86_64-linux-gnu
    # Open_BLAS_LIB_SEARCH_PATHS path: /usr/lib/x86_64-linux-gnu
    # 将以上路径分别添加到opencv/cmake/OpenCVFindOpenBLAS.cmake文件中的SET(Open_BLAS_INCLUDE_SEARCH_PATHS和SET(Open_BLAS_LIB_SEARCH_PATHS中。
  5. 编译及安装

    1
    2
    3
    4
    5
    6
    # 使用-j参数多线程编译时会报错(makefile文件引起的),可能是由于我修改了opencv/cmake/OpenCVFindOpenBLAS.cmake文件引起的
    make -j1
    sudo make install

    # 更新动态链接库
    sudo ldconfig
  6. 测试opencv安装情况

    1
    2
    3
    4
    5
    6
    7
    # 假设编译安装好系统opencv with cuda后,python没有找到cv2,则安装opencv-python包启用。
    # pip install opencv-python

    python3.7
    import cv2
    # 返回cuda设备,即cuda显卡的数量
    print(cv2.cuda.getCudaEnabledDeviceCount())

14   配置conda(可选,但不推荐)

不推荐配置,jetson tx2 nx型号能够安装成功的版本较老,并且创建虚拟环境后,默认的base环境一旦conda install任意包之后,再次运行conda的任何命令都会报错:illegal instruction (core dump),pip可以正常工作。如果是新建其他名称的虚拟环境,则是pip会报错:illegal instruction (core dump),而conda install可以正常工作。

anaconda下载:
miniconda下载:点击跳转
Archiconda下载:点击跳转

tx2 nx硬件只有这个版本能成功安装:Miniconda3-py37_4.9.2-Linux-aarch64.sh,而之后的新版本都会报错:illegal instruction (core dump)

14.1   conda基本操作

1
2
3
4
5
6
7
8
9
10
# 创建了名为xxx的虚拟环境,指定虚拟环境的 Python 版本为3.7
conda create -n xxx python=3.7
# 激活名为xxx的虚拟环境
conda activate xxx
# 退出当前虚拟环境
conda deactivate
# 删除名为xxx的虚拟环境
conda remove -n xxx --all
# 查看本地已有哪些虚拟环境
conda info --env

14.2   修改conda源

参见Anaconda 镜像使用帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
nano ~/.condarc
# windows用户可以用下面的命令创建这个文件
# conda config --set show_channel_urls yes

# 为.condarc文件添加如下内容
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/

# 清除索引缓存
conda clean -i

14.3   使用yml配置文件创建虚拟环境报错(这个我实测没生效)

现象:使用yml文件创建conda环境时出现Solving environment: failed 和 ResolvePackageNotFound 的错误

原因:因为部分包的版本详细是根据机器配置而定,导出来的版本不一定适用当前的机器

解决方法:剔除环境配置文件environment.yml中的版本信息,只需删除第二个等号之后的内容即可

1
2
3
pytorch=1.1.0=py3.7_cuda10.0.130_cudnn7.5.1_0
# 例如上面这行的修改如下
pytorch=1.1.0

15   参考文献

[1] Nvidia xavier NX 通过 flash.sh 烧录 linux 系统[EB/OL]. https://blog.csdn.net/Yan_uuu/article/details/126947983.
[2] Jetson Xavier NX 镜像制作、烧录及克隆[EB/OL]. https://blog.csdn.net/qhdd123/article/details/123815911.
[3] 解决 Jetson:Failed to start nvpmode1 server. 和 Failed to start load kernel modules[EB/OL]. https://blog.csdn.net/alianfibakic/article/details/123807606.
[4] Jetson TX2 更换软件源[EB/OL]. https://blog.csdn.net/qlulibin/article/details/80271096.
[5] Ubuntu18.04 默认源恢复默认源恢复备份源[EB/OL]. https://blog.csdn.net/ZeyiRTangent/article/details/114885286.
[6] PyPI 镜像使用帮助[EB/OL]. https://mirrors.tuna.tsinghua.edu.cn/help/pypi/.
[7] Ubuntu 编译安装 python3.7.10, 解决‘_ctypes‘和 ssl 问题, 建立软链接 python3.7 和 pip3.7[EB/OL]. https://blog.csdn.net/tmaccs/article/details/117029067.
[8] ubuntu18.04 下源码编译安装最新版本 Python3[EB/OL]. https://zhuanlan.zhihu.com/p/62930419.
[9] ubuntu pip is configured with locations that require TLS/SSL[EB/OL]. https://blog.csdn.net/a1007720052/article/details/107342695.
[10] libssl‑dev : Depends: libssl1.0.0 (= 1.0.2g‑1ubuntu4) but 1.0.2g‑1ubuntu4.15 is to be installed[EB/OL]. https://blog.csdn.net/weixin_38890593/article/details/102783551.
[11] TX2开启最大功耗模式[EB/OL]. https://www.cnblogs.com/gezhuangzhuang/p/11674062.html.
[12] 使用git --recursive进行循环克隆,由于网络原因,出现克隆失败的情况。[EB/OL]. https://blog.csdn.net/qq_43212651/article/details/116376103.
[13] 解决c++: internal compiler error: 已杀死 (program cc1plus)[EB/OL]. https://blog.csdn.net/chenmeng0508/article/details/122283442.
[14] Jetson nano增加Swap分区大小操作指南[EB/OL]. https://blog.csdn.net/qq_33475105/article/details/108372878.
[15] 玩转NVIDIA Jetson (25)--- jetson 安装pytorch和torchvision[EB/OL]. https://blog.csdn.net/huiyuanliyan/article/details/126686036.
[16] Ubuntu 安装PHP找不着BZip2[EB/OL]. https://blog.csdn.net/handsome_926/article/details/77933926.
[17] ModuleNotFoundError: No module named '_lzma'[EB/OL]. https://zhuanlan.zhihu.com/p/404162713.
[18] Error :: You must put some 'source' URIs in your sources.list[EB/OL]. https://askubuntu.com/questions/496549/error-you-must-put-some-source-uris-in-your-sources-list.
[19] 3d-pose-baseline[EB/OL]. https://github.com/una-dinosauria/3d-pose-baseline.
[20] How to stop jetson_clocks?[EB/OL]. https://forums.developer.nvidia.com/t/how-to-stop-jetson-clocks/144713.
[21] VideoPose3d:环境搭建+制作自己的视频[EB/OL]. https://blog.csdn.net/willbetter01/article/details/120906567.
[22] 【VideoPose3D】可视化自定义视频[EB/OL]. https://blog.csdn.net/qq_44942539/article/details/121983187.
[23] Windows下VideoPose3D成功运行记录2:运行自定义视频[EB/OL]. https://www.bilibili.com/read/cv19291005/.
[24] How to Use OpenCV with CUDA Support in Python[EB/OL]. https://saturncloud.io/blog/how-to-use-opencv-with-cuda-support-in-python/.
[25] Jetson Xavier NX OpenCV 安装[EB/OL]. https://zhuanlan.zhihu.com/p/411901208.
[26] Nvidia Jetson TX2 配置Cuda 加速的Opencv[EB/OL]. https://blog.csdn.net/weixin_62651190/article/details/129348245.
[27] Guide to build OpenCV from source with GPU support (CUDA and cuDNN)[EB/OL]. https://gist.github.com/minhhieutruong0705/8f0ec70c400420e0007c15c98510f133.
[28] How to install OpenCV 4.2.0 with CUDA 10.0 in Ubuntu distro 18.04[EB/OL]. https://gist.github.com/changx03/b4aa9bb2827217c3a6a7e08365441417.
[29] Jetson带CUDA编译的opencv4.5安装教程与踩坑指南,cmake配置很重要![EB/OL]. https://blog.csdn.net/weixin_39298885/article/details/110851373.
[30] ubuntu 编译安装支持CUDA的OpenCV[EB/OL]. https://blog.csdn.net/qq_44523137/article/details/124098406.
[31] Install OpenCV on Jetson Nano[EB/OL]. https://qengineering.eu/install-opencv-on-jetson-nano.html.
[32] 「解析」Jetson Orin NX 安装 CUDA/cuDNN[EB/OL]. https://blog.csdn.net/ViatorSun/article/details/129909317.
[33] OpenCV 4.2.0 and CuDNN for Jetson Nano?[EB/OL]. https://forums.developer.nvidia.com/t/opencv-4-2-0-and-cudnn-for-jetson-nano/112281?page=2.
[34] Correction in OpenCV's default CMAKE search Path for OpenBLAS Library on Ubuntu-64bit Machines [Solution] [EB/OL]. https://github.com/opencv/opencv/issues/12957.
[35] jetson tx2 安装miniconda失败原因(illegal instruction (core dump)原因解析与简易安装miniconda[EB/OL]. https://blog.csdn.net/buxiangyaomingzi/article/details/123297295.
[36] TypeError: load() missing 1 required positional argument: 'Loader' in Google Colab[EB/OL]. https://stackoverflow.com/questions/69564817/typeerror-load-missing-1-required-positional-argument-loader-in-google-col.
[37] 解决创建conda环境时Solving environment: failed 和 ResolvePackageNotFound 的错误[EB/OL]. https://blog.csdn.net/hshudoudou/article/details/126407029.
[38] 关于Ubuntu下ZRAM的配置和使用[EB/OL]. https://blog.xzr.moe/archives/88/.
[39] 解决python urllib3 v2.0 only supports OpenSSL 1.1.1+, currently[EB/OL]. https://blog.csdn.net/weixin_43205308/article/details/130830307.
[40] 从TensorFlow被kill到增加Swap分区[EB/OL]. https://www.zhihu.com/column/p/30562899.
[41] Linux运行程序时,程序进程莫名退出(被杀死)[EB/OL]. https://blog.csdn.net/ispringmw/article/details/112719262.
[42] linux 环境下进程被 killed掉原因分析和解决方法[EB/OL]. https://blog.csdn.net/ktigerhero3/article/details/80004315.
[43] Linux OOM Killer机制 以及防止被OOM Killer杀死的方法[EB/OL]. https://blog.csdn.net/top_explore/article/details/107733974.