NVIDIA Jetson AGX Orin 简介

借助功能强大的 AI 计算机,打造节能高效的新一代自主机器产品。与上一代相比,高达 8 倍的性能和支持多个并发 AI 推理流水线的 275 TOPS 的运算能力,以及多个传感器的高速接口支持,是制造、物流、零售和医疗健康领域的应用的理想解决方案。Jetson AGX Orin 32GB (本文介绍的就是刚购入的这款)和 64GB 模组将于 2022 年 7 月和 10 月推出。

AGX Orin 套件规格

TOPS是 Tera Operations Per Second 的缩写,1TOPS 代表处理器每秒钟可进行一万亿次(10^12)操作。

其配置安装方法可以参考如下视频:

但是该视频没有提供很详细的环境配置内容,更多细节操作没有涉及,本文详细记录了本人配置整套开发环境的流程和一些问题的解决方法,供大家参考。

启动机器并安装系统

首先可以根据 Get Started 官网链接启动机器并安装系统,也可以根据此教程安装系统,提供两种安装方式:

  • 直接使用工厂出货时预安装的L4T BSP Image镜像(更方便,本文用这种方法)
  • 不接显示器,用PC上的SDK Manager进行操作系统刷机(传统方法,没有尝试)

image-1659807473491

Install JetPack SDK

安装好系统后即可开始配置安装 JetPack 工具包,该工具包内包括:

  • CUDA Toolkit for L4T
  • cuDNN 神经网络加速库
  • TensorRT 推理加速引擎
  • OpenCV 计算机视觉库
  • VPI 视觉开发界面
  • NVIDIA container runtime with Docker integration
  • Multimedia API

类似平时 PC 主机上用的显卡驱动,JetPack 包会一起装好,但是跟显卡的驱动是不一样的,必须通过 JetPack 安装!JetPack 也是有版本的,Orin 这款默认安装最新版本 5.0.1,不同版本对应的 CUDA 和 cuDNN 驱动版本也不同。过去的AGX Xavier开发套件是需要通过 headless(USB线)方式与 PC 进行连线,然后在 PC 上执行 SDKManager 为 Jetson 设备安装开发环境,执行步骤相对繁琐。如今英伟达为 Orin 开发套件上提供直接安装方式,使得整个安装过程变得十分简单。

更新软件源

sudo apt update

可能会报如下错误(如果没有报错可以忽略)

E: The repository 'http://ppa.launchpad.net/certbot/certbot/ubuntu focal Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

注意这里显示这个仓库的路径有误 http://ppa.launchpad.net/certbot/certbot/ubuntu focal Release ,将这条记录删除即可,删除方法如下:

sudo apt-add-repository -r ppa:certbot/certbot

注意,这里的 ppa:certbot/certbot 需要根据你的报错路径进行替换,即 ppa: 后面填写的是 http://ppa.launchpad.net//ubuntu focal Release 之间的那部分。解决后再运行 sudo apt update 即可。

更新完后升级

sudo apt dist-upgrade

上一步没问题的话,这里应该不报错。

安装 JetPack

sudo apt install nvidia-jetpack

这里可能会产生如下错误:

Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package nvidia-jetpack

定位不到 nvidia-jetpack 包,官网提供了解决方案,只需要把下载源里的版本号修改一下就好了:

查看当前的下载源

$ cat /etc/apt/sources.list.d/nvidia-l4t-apt-source.list

# SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
#
# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
# property and proprietary rights in and to this material, related
# documentation and any modifications thereto. Any use, reproduction,
# disclosure or distribution of this material and related documentation
# without an express license agreement from NVIDIA CORPORATION or
# its affiliates is strictly prohibited.

deb https://repo.download.nvidia.com/jetson/common r34.0 main
deb https://repo.download.nvidia.com/jetson/t234 r34.0 main

这里显示的是 r34.0 ,将其修改为 r34.1 即可,用 vim 或者 gedit 修改都行。

sudo vim /etc/apt/sources.list.d/nvidia-l4t-apt-source.list

改成这样:

deb https://repo.download.nvidia.com/jetson/common r34.1 main
deb https://repo.download.nvidia.com/jetson/t234 r34.1 main

然后执行如下语句,就可以安装了,reboot 是重启:

sudo apt dist-upgrade
sudo reboot
sudo apt install nvidia-jetpack

这个安装过程会比较缓慢,视网速情况。安装好后用如下语句查看 jetpack 版本:

$ sudo apt show nvidia-jetpack
Package: nvidia-jetpack
Version: 5.0.1-b118
Priority: standard
Section: metapackages
Maintainer: NVIDIA Corporation
Installed-Size: 199 kB
Depends: nvidia-cuda (= 5.0.1-b118), nvidia-opencv (= 5.0.1-b118), nvidia-cudnn8 (= 5.0.1-b118), nvidia-tensorrt (= 5.0.1-b118), nvidia-container (= 5.0.1-b118), nvidia-vpi (= 5.0.1-b118), nvidia-nsight-sys (= 5.0.1-b118), nvidia-l4t-jetson-multimedia-api (>> 34.1-0), nvidia-l4t-jetson-multimedia-api (<< 34.2-0)
Homepage: http://developer.nvidia.com/jetson
Download-Size: 29.4 kB
APT-Manual-Installed: yes
APT-Sources: https://repo.download.nvidia.com/jetson/t234 r34.1/main arm64 Packages
Description: NVIDIA Jetpack Meta Package

之前版本的 jetpack 也可以用 jtop 管理,但是现在新版本的 jtop 貌似不支持了,这里也提供一下 jtop 的安装和使用方法:

$ sudo apt-get install python3-pip
$ sudo -H pip install jetson-stats
$ sudo jtop

[WARN] SUDO is no more required
[WARN] Board missing P3737-000 (press CTRL + Click)
[WARN] jetson-stats not supported for [L4T 34.1.1]
  Please, try: sudo -H pip install -U jetson-stats
  or open an issue on Github (press CTRL + Click)

配置 CUDA

如前面所说,JetPack 在安装的时候已经预装了 CUDA 等工具包,(其详细的版本信息可查看链接)。JetPack 5.0.1 所预装的 CUDA 版本是 11.4.4。但是我们安装完之后,通过 nvcc -V 命令却无法查看 cuda 版本,这通常是由于环境变量未配置导致的,所以我们首先配置环境变量。

sudo vim /etc/profile

在此文件末尾加入如下三行代码,即可配置好环境变量,/usr/local/cuda-11 即是 cuda 默认安装的目录

export PATH=/usr/local/cuda-11/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11/lib64$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda-11

其中 /usr/local 目录下应该是有 cudacuda-11 两个目录的,其实打开看可以发现两个目录是一样的,这里选 cuda-11 ,修改好后按 Esc 键,然后输入 :wq 保存并退出。先在当前 bash 短暂激活环境变量,再输入 nvcc -V 即可查看 cuda 版本了。重启机器后就不需要再激活环境变量了。

source /etc/profile
nvcc -V

显示 CUDA 版本:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Thu_Nov_11_23:44:05_PST_2021
Cuda compilation tools, release 11.4, V11.4.166
Build cuda_11.4.r11.4/compiler.30645359_0

配置 cuDNN

cuDNN 的默认安装路径如下:

  • cudnn head (头文件): /usr/include/cudnn.h
  • cudnn lib(库文件): /usr/lib/aarch64-linux-gnu/libcudnn*

libcudnn* 表示所有以 libcudnn... 开头的文件。把这两部分文件复制到我们刚才操作的cuda路径 /usr/local/cuda-11

sudo cp /usr/include/cudnn.h /usr/local/cuda-11/include
sudo cp /usr/lib/aarch64-linux-gnu/libcudnn* /usr/local/cuda-11/lib64/

修改文件权限(所有用户都可读,可写,可执行,貌似也可以不进行这一步)

sudo chmod 777 /usr/local/cuda-11/include/cudnn.h /usr/local/cuda-11/lib64/libcudnn*

打开 cuda 目录,用 ll 命令查看所有 libcudnn* 文件的软连接情况,如下所示就没有问题。

$ cd /usr/local/cuda-11/lib64
$ ll libcudnn*

-rwxrwxrwx 1 root root  161294088 8月   6 13:23 libcudnn_adv_infer.so*
lrwxrwxrwx 1 root root         27 8月   5 16:51 libcudnn_adv_infer.so.8 -> libcudnn_adv_infer.so.8.3.2*
-rwxrwxrwx 1 root root  161294088 8月   6 13:23 libcudnn_adv_infer.so.8.3.2*
-rwxrwxrwx 1 root root  165059766 8月   6 13:23 libcudnn_adv_infer_static.a*
-rwxrwxrwx 1 root root  165059766 8月   6 13:23 libcudnn_adv_infer_static_v8.a*
-rwxrwxrwx 1 root root  109101600 8月   6 13:23 libcudnn_adv_train.so*
lrwxrwxrwx 1 root root         27 8月   5 16:51 libcudnn_adv_train.so.8 -> libcudnn_adv_train.so.8.3.2*
-rwxrwxrwx 1 root root  109101600 8月   6 13:23 libcudnn_adv_train.so.8.3.2*
-rwxrwxrwx 1 root root  111544450 8月   6 13:23 libcudnn_adv_train_static.a*
-rwxrwxrwx 1 root root  111544450 8月   6 13:23 libcudnn_adv_train_static_v8.a*
-rwxrwxrwx 1 root root  904603200 8月   6 13:23 libcudnn_cnn_infer.so*
lrwxrwxrwx 1 root root         27 8月   5 16:51 libcudnn_cnn_infer.so.8 -> libcudnn_cnn_infer.so.8.3.2*
-rwxrwxrwx 1 root root  904603200 8月   6 13:24 libcudnn_cnn_infer.so.8.3.2*
-rwxrwxrwx 1 root root 1149327486 8月   6 13:24 libcudnn_cnn_infer_static.a*
-rwxrwxrwx 1 root root 1149327486 8月   6 13:24 libcudnn_cnn_infer_static_v8.a*
-rwxrwxrwx 1 root root  105926416 8月   6 13:24 libcudnn_cnn_train.so*
lrwxrwxrwx 1 root root         27 8月   5 16:51 libcudnn_cnn_train.so.8 -> libcudnn_cnn_train.so.8.3.2*
-rwxrwxrwx 1 root root  105926416 8月   6 13:24 libcudnn_cnn_train.so.8.3.2*
-rwxrwxrwx 1 root root  156657510 8月   6 13:24 libcudnn_cnn_train_static.a*
-rwxrwxrwx 1 root root  156657510 8月   6 13:24 libcudnn_cnn_train_static_v8.a*
-rwxrwxrwx 1 root root   94867064 8月   6 13:24 libcudnn_ops_infer.so*
lrwxrwxrwx 1 root root         27 8月   5 16:51 libcudnn_ops_infer.so.8 -> libcudnn_ops_infer.so.8.3.2*
-rwxrwxrwx 1 root root   94867064 8月   6 13:24 libcudnn_ops_infer.so.8.3.2*
-rwxrwxrwx 1 root root   98594806 8月   6 13:24 libcudnn_ops_infer_static.a*
-rwxrwxrwx 1 root root   98594806 8月   6 13:24 libcudnn_ops_infer_static_v8.a*
-rwxrwxrwx 1 root root   77772528 8月   6 13:24 libcudnn_ops_train.so*
lrwxrwxrwx 1 root root         27 8月   5 16:51 libcudnn_ops_train.so.8 -> libcudnn_ops_train.so.8.3.2*
-rwxrwxrwx 1 root root   77772528 8月   6 13:24 libcudnn_ops_train.so.8.3.2*
-rwxrwxrwx 1 root root   78390122 8月   6 13:25 libcudnn_ops_train_static.a*
-rwxrwxrwx 1 root root   78390122 8月   6 13:25 libcudnn_ops_train_static_v8.a*
-rwxrwxrwx 1 root root     166376 8月   6 13:25 libcudnn.so*
lrwxrwxrwx 1 root root         17 8月   5 16:51 libcudnn.so.8 -> libcudnn.so.8.3.2*
-rwxrwxrwx 1 root root     166376 8月   6 13:25 libcudnn.so.8.3.2*

更新动态链接库:

sudo ldconfig

ldconfig命令的用途主要是在默认搜寻目录/lib/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。ldconfig 通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。link,由于已经添加过了环境变量,所以重启后就不用再更新动态链接库了。

测试一个 cudnn 的 demo:

sudo cp -r /usr/src/cudnn_samples_v8/ ~/
cd ~/cudnn_samples_v8/conv_sample
sudo make clean
sudo make
./conv_sample

cudnn_samples_v8 里面有七八个 demo,但是有个别跑不通,比如 mnistCUDNN ,目前不清楚原因,不过有能跑通的就好。下面是 conv_sample demo 的输出结果:

Executing: conv_sample
Using format CUDNN_TENSOR_NCHW (for INT8x4 and INT8x32 tests use CUDNN_TENSOR_NCHW_VECT_C)
Testing single precision
====USER DIMENSIONS====
input dims are 1, 32, 4, 4
filter dims are 32, 32, 1, 1
output dims are 1, 32, 4, 4
====PADDING DIMENSIONS====
padded input dims are 1, 32, 4, 4
padded filter dims are 32, 32, 1, 1
padded output dims are 1, 32, 4, 4
Testing conv
^^^^ CUDA : elapsed = 3.98345 sec,  
Test PASSED
Testing half precision (math in single precision)
====USER DIMENSIONS====
input dims are 1, 32, 4, 4
filter dims are 32, 32, 1, 1
output dims are 1, 32, 4, 4
====PADDING DIMENSIONS====
padded input dims are 1, 32, 4, 4
padded filter dims are 32, 32, 1, 1
padded output dims are 1, 32, 4, 4
Testing conv
^^^^ CUDA : elapsed = 0.000867128 sec,  
Test PASSED

配置 cmake

直接安装就好了

sudo apt install cmake

查看已经安装的工具包和库

python 是系统预装的,有2.7和3.8两个版本

  • python2: python2 -V
  • python3: python3 -V

以下是我们刚才的所有操作所安装的包,可以通过如下代码查看其版本:

  • JetPack: sudo apt show nvidia-jetpack
  • CUDA: nvcc -V
  • cuDNN cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 或者 dpkg -l libcudnn8
  • openCV: pkg-config --modversion opencv4 或者 dpkg -l libopencv
  • TensorRT: dpkg -l | grep TensorRT 或者 dpkg -l tensorrt
  • cmake: cmake --version

安装虚拟环境管理工具 miniforge

查资料了解到,conda 和 miniconda 都是无法在 aarch64 的架构上使用的,miniforge 是其替代品,使用方法和 conda 几乎一样。可以先下载 miniforge 安装包

bash Miniforge3-Linux-aarch64.sh

将 miniforge 添加到环境变量:

$ sudo vim ~/.bashrc

export PATH="/home/aipt/miniforge3/bin:$PATH"

$ conda --version

添加镜像源:

# 这里使用国科大镜像源
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

安装 pytorch

有了 miniforge 之后,可以创建一个虚拟环境,进行不同配置的隔离,然后就可以装 pytorch 了。

jetson 的 pytorch 只能由这种方式安装,不能像pc那样安装。不同的 JetPack 版本对应于不同的 python 和 pytorch 版本,请在创建虚拟环境的时候根据Jetson Zoo进行判断。本文装的是 JetPack 5.0,因此匹配 python 3.8 + pytorch 1.11.0

conda create -n dlTorch python=3.8
conda activate dlTorch
pip install Cython
pip install torch-1.11.0-cp38-cp38-linux_aarch64.whl
conda install numpy
# pip install numpy

至此,pytorch 安装成功,但仅仅是在 dlTorch 这个虚拟环境中安装成功。其他环境需要重复此步骤。

安装 torchvision

torchvision 也和普通 pc 的安装方式不同,首先查看 pytorch 对应的 torchvision 版本

pytorch 1.11.0 对应 torchvision=0.12.0,确定版本后用如下方式安装:

sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
git clone --branch <version> https://github.com/pytorch/vision torchvision   # see below for version of torchvision to download
cd torchvision
export BUILD_VERSION=0.x.0  # where 0.x.0 is the torchvision version  
python3 setup.py install --user
cd ../  # attempting to load torchvision from build dir will result in import error
pip install 'pillow<7' # always needed for Python 2.7, not needed torchvision v0.5.0+ with Python 3.6

这里的 <version>BUILD_VERSION=0.x.00.12.0 替换掉,pip install 'pillow<7' 可以省略掉。如下:

sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
git clone --branch v0.12.0 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.12.0
python3 setup.py install # very slow

将 opencv 链接至当前的虚拟环境

由于 JetPack 已经安装了 opencv 库,但是是在系统预装的 python 路径里面的,虚拟环境里无法 import ,于是需要我们将其软连接到当前的虚拟环境。

首先查找 cv2 的位置

$ sudo find / -iname "*cv2*"

/sys/kernel/debug/bpmp/debug/soctherm/cv2
/sys/kernel/debug/bpmp/debug/speedo/cv2
/sys/devices/platform/cv2-throttle-alert
/sys/bus/platform/devices/cv2-throttle-alert
/sys/bus/platform/drivers/userspace-therm-alert/cv2-throttle-alert
/sys/firmware/devicetree/base/thermal-zones/CV2-therm
/sys/firmware/devicetree/base/thermal-zones/CV2-therm/trips/cv2-hot-surface
/sys/firmware/devicetree/base/thermal-zones/CV2-therm/trips/cv2-sw-shutdown
/sys/firmware/devicetree/base/thermal-zones/CV2-therm/trips/cv2-sw-throttle
/sys/firmware/devicetree/base/cv2-throttle-alert
/sys/firmware/devicetree/base/__symbols__/cv2_hot_surface
/sys/firmware/devicetree/base/__symbols__/cv2_sw_throttle
/sys/firmware/devicetree/base/__symbols__/cv2_alert
/sys/firmware/devicetree/base/__symbols__/cv2_sw_shutdown
/usr/include/opencv4/opencv2
/usr/lib/python2.7/dist-packages/cv2
/usr/lib/python2.7/dist-packages/cv2/python-2.7/cv2.so
/usr/lib/python3.8/dist-packages/cv2
/usr/lib/python3.8/dist-packages/cv2/python-3.8/cv2.cpython-38-aarch64-linux-gnu.so
find: ‘/proc/19153’: 没有那个文件或目录
find: ‘/run/user/1000/doc’: 权限不够
find: ‘/run/user/1000/gvfs’: 权限不够
find: ‘/run/user/124/gvfs’: 权限不够
/run/udev/data/+platform:cv2-throttle-alert

根据 python3.8 的路径显示,cv2 的路径如下:
/usr/lib/python3.8/dist-packages/cv2/python-3.8/cv2.cpython-38-aarch64-linux-gnu.so

而当前虚拟环境的路径如下 /home/miniforge3/envs/dlTorch/lib/python3.8/site-packages

建立软链接:

sudo ln -s /usr/lib/python3.8/dist-packages/cv2/python-3.8/cv2.cpython-38-aarch64-linux-gnu.so cv2.so

此时在虚拟环境 dlTorch 中启动 python 也可以 import cv2 了。

其他可用工具在 Jetson 上如何安装

其他可用工具可以根据jetson-family提供的方式进行安装。

至此,一套完整的开发环境基本上已经配置好了,如果安装了 pycharm 还可以在本机上直接调试代码,博主已经亲测过了~~,如有问题可以评论区讨论嗷!


本站由 困困鱼 使用 Stellar 创建。