目录

一、 嵌入式Jetson AGX Xavier开发板介绍

二、Jetson AGX Xavier刷机和基本配置

2.1 刷机准备

2.2 下载安装SDK Manager

2.3 刷机

2.3.1 步骤1

2.3.2 步骤2

2.3.3 步骤3

2.3.4 步骤4

2.4 基本配置和使用

2.4.1 更换源

2.4.2 安装系统监控软件jetson-status

2.4.3 风扇自动运行

三、Jetson AGX Xavier上编译Paddle Inference推理库

3.1 编译并安装NCCL

3.2 编译并安装Paddle

3.2.1下载源码

3.2.2 更改第三方库的github地址

3.2.3 配置cuda环境变量

3.2.4 编译工具的准备

3.2.5 准备tensorrt库

3.2.6 编译paddle

一、 嵌入式Jetson AGX Xavier开发板介绍

Jetson AGX Xavier是一款体积小巧、功能强大的人工智能嵌入式开发板,于20218年9月由英伟达推出,尺寸仅为 100 x 87 mm,目前市场售价大概在6500元左右。尽管体积较小,但性能媲美大型工作站,可以在 30 瓦功耗下获得类似 GPU 工作站的卓越性能,也就是说我们可以在这个“小盒子”里跑一些比较吃资源的重量级深度学习模型,比较适合高精度视觉测距、传感器融合、定位与地图绘制、障碍物探测,以及机器人路线规划算法等对精度要求高同时对体积功耗要求比较严格的应用。

开箱基本组件如下图所示:

Jetson AGX Xavier是为工业级产品设计的,并没有预留USB口,需要通过typec接口进行转化。与一般的嵌入式开发板不同,Jetson AGX Xavier自带了外壳和风扇,因此,算法、软件完成部署后不需要再进行工业样式设计和改造,可以直接投入到实际应用中去。

Jetson AGX Xavier使用的是AArch64架构,与我们平时使用的Intel架构电脑不一样,故开发环境搭建方式也不一样。为了简化环境搭建过程,让人们能更快的上手使用,Nvidia提供了一套SDK,叫做JetPack,包含有CUDA、cuDNN、TensorRT等常用深度学习库,只需要刷机即可直接安装到Xavier。

所谓刷机就是利用另一台计算机作主机,将 OS 镜像下载好,然后烧录到 xavier 中并安装一些 SDK 组件的过程。有人说能不能不刷机,直接使用,答案当然是可以的,但是我们买Jetson AGX Xavier肯定是用来做深度学习应用的,如果不安装cuda、cudnn等sdk,那么买这款设备的意义就不大。如果不刷机直接自己手动安装cuda、cudnn,原理上是可以的,但是目前很少有人成功过。

下面我们就详细讲解具体的刷机过程以及如何进行基本的配置以方便我们后续使用这款设备。

二、Jetson AGX Xavier刷机和基本配置

首先再次强调刷机的基本流程。简单理解,就是用一台Ubuntu电脑对Jetson AGX Xavier进行系统写入等操作,Ubuntu电脑和Jetson设备之间用一根原装TypeC线连接。这里的Ubuntu电脑就是host主机的意思。

2.1 刷机准备

(1)一台装有ubuntu系统的笔记本做主机host(注意:ubuntu20.04目前不能用,因为JetPack4.4目前不支持20.04版本,支持ubuntu16和18的版本;虚拟机装ubuntu也可以,但不推荐,安装时容易出问题)

(2)显示器

(3)网线,原装type-c线。

(4)host主机要在有网环境且能连网,WiFi,热点,宽带皆可。

2.2 下载安装SDK Manager

与其它几款jetson产品不同,Jetson AGX Xavier只能通过SDK Manager软件进行刷机,无法通过sd卡进行刷机(其它jetson产品只要将镜像文件下载到SD卡然后将SD卡插入到jetson中即可)。

首先用host主机打开Nvidia官网,选择JetPack4.4版本的SDK Manager进行下载(地址:JetPack SDK 5.0 Developer Preview | NVIDIA Developer),需要一个 Nvidia 账号。(推荐下载4.3以后版本,因为安装方式简化了不少,本文介绍的也是4.4安装方式)

下载完成后使用以下命令安装:(注意使用对应的文件名,此处为sdkmanager_1.2.0-6733_amd64.deb)

sudo apt install ./sdkmanager_1.2.0-6733_amd64.deb

安装完成后,在终端启动:

sdkmanager

打开SDK Manager后,会转到网页版英伟达登录页面,输入英伟达账号和密码,验证通过后SDK Manager会自动进入主界面(注意:如果显示 OOPs,是网络的原因,多试几次就可以了,推荐有线网络连接,更稳定一些以,另外,一般早上网络会好一些)。

2.3 刷机

2.3.1 步骤1

进入主界面后按照下图所示进行勾选:

取消勾选 Host Machine(这个是为主机下载安装文件的,如果想在主机上安装Nvida软件,可以勾选这个,实际上没必要)。然后点击 continue,进入下一步

2.3.2 步骤2

选择下载和安装路径,默认即可;

勾选 I accept 选项;

不要勾选 Download now, install later 选项,虽然也可以先下载,然后再离线安装,但不建议这么做;

进入下一步;

2.3.3 步骤3

此时会先下载OS镜像,下载完成后会跳出以下界面:

选择 Manaul setup,将 xavier 接通电源,但是保持关机状态。然后用原装的 type-C 转 USB 线,将 xavier 正面的 type-C 接口与host端的 USB 3.0 接口相连,如下图所示:

此时先按住位于xavier侧面正中间的强制恢复按钮不放(上图中标识1的按键),再按住开机按钮不放(标识2的按键),等待2s后同时松开。此时,可以看到xavier正面白色电源指示灯亮起。打开host端的终端,输入 lsusb 命令,如果看到 NVidia Corp 则说明 xavier 与host端连接成功。接下来点击 Flash 按钮,开始烧录 OS 镜像。烧录完 OS 镜像后(总进度完成 25%),会跳出以下界面(注意:此处不要输入username和password,会报SSH服务错误,因为xavier的ubuntu系统还没有设置):

此时xavier 会自动开机,给Xavier 连上显示器,进入 ubuntu 系统设置界面,然后设置好用户名和密码。然后确保jetson设备和主机host在同一个局域网内,简单的做法可以直接用网线连接host端和Xavier,然后回到刚才的安装界面,输入刚才在 xavier 上设置的用户名和密码,然后点击安装。

2.3.4 步骤4

如果按照上面的步骤逐步进行,基本上不会出任何问题。点击FINISH,完成安装。效果图如下所示:

2.4 基本配置和使用

2.4.1 更换源

刷完机以后首先应该更新源,否则后续更新和升级会非常慢。但是由于Jetson采用的是aarch64架构的Ubuntu 18.04.2 LTS系统,与AMD架构的Ubuntu系统不同,因此需要替换成aarch64的源,这里一定要注意,不要替换成x86-64的源了。

首先备份一下原来的sources.list源文件:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

然后打开sources.list文件:

sudo gedit /etc/apt/sources.list

然后删除所有内容,替换成下面的内容:

#中科大源
deb http://mirrors.ustc.edu/ubuntu-ports/ bionic-updates main restricted universe multiverse 
deb-src http://mirrors.ustc.edu/ubuntu-ports/ bionic-updates main restricted universe multiverse 
deb http://mirrors.ustc.edu/ubuntu-ports/ bionic-security main restricted universe multiverse 
deb-src http://mirrors.ustc.edu/ubuntu-ports/ bionic-security main restricted universe multiverse 
deb http://mirrors.ustc.edu/ubuntu-ports/ bionic-backports main restricted universe multiverse 
deb-src http://mirrors.ustc.edu/ubuntu-ports/ bionic-backports main restricted universe multiverse 
deb http://mirrors.ustc.edu/ubuntu-ports/ bionic main universe restricted 
deb-src http://mirrors.ustc.edu/ubuntu-ports/ bionic main universe restricted

最后,更新一下apt-get即可:

sudo apt-get update

接下来可以设置jetson中文输入法和关屏时间等操作,具体可以参考我的另一篇博客,这里就不再赘述了。当然这些软件的安装跟我们这篇博客后面讲解的Paddle编译关系不大。

2.4.2 安装系统监控软件jetson-status

本小节讲解如何安装和使用一个jetson性能查看工具jetson-status,使用它我们可以方便的查看jetson当前运行状态,包括内存、温度、GPU、CPU使用情况等,另外也可以查看许多软件的版本信息,例如OpenCV、CUDA、TensorRT等。

安装方式如下:

sudo apt-get install python3-pip
sudo -H python3 -m pip install jetson-stats

安装完成后需要重启,然后使用下面的命令启动:

jtop

效果如下所示:

首先可以切换到6INFO面板,可以查看当前系统的一些基本信息,包括jetpack版本、opencv版本、cuda版本、tensorrt版本、局域网ip等。

切换到3CPU面板。

可以看到,默认刷完机器以后只开启了4个CPU,而实际使用时我们希望是以全CPU状态运行的,我们需要开启所有CPU(尤其是运行深度学习程序的时候)。

2.4.3 风扇自动运行

Jetson Xavier在运行过程中散热很重要。一种比较好的方法就是时刻检查当前Jetson温度,当超过一定温度时就启动风扇散热,否则就让风扇停止。

具体实现可以参考下面的类库:

GitHub - Pyrestone/jetson-fan-ctl: Automagic fan control for the Nvidia Jetson Nano

该函数库已经将相关控制代码都写好了,我们只需要按照说明进行安装即可。每次开机后风扇运行脚本都会自动启动的。

到这里我们就配置完了,后面我们运行程序的时候也可以开启jetson-status来实时的监控系统状态、GPU使用情况等。

三、Jetson AGX Xavier上编译Paddle Inference推理库

3.1 编译并安装NCCL

nccl主要用来支持分布式运算。按照飞桨官方教程,在jetson上使用Paddle Inference需要安装nccl。编译安装前先增加交换空间,因为在编译过程中需要使用大量的内存空间,编译过程中如果内存不够就会卡死,因此,我们需要从jetson的外部存储器中“借”一部分空间作为内存,也就是所谓的“交换空间”,具体添加方法如下(这里我们添加10个G的空间):

sudo fallocate -l 10G /var/swapfile    
sudo chmod 600 /var/swapfile     
sudo mkswap /var/swapfile     
sudo swapon /var/swapfile     
sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'    

设置完成后我们可以打开jetson-status来查看,如下所示:

可以查看Swp一栏,默认是16GB交换空间,当我们设置完上述操作以后变成来26G左右,说明设置成功了。

编译结束后(包括后面编译万paddle inference)可以通过下面的方式删除交换空间:

sudo swapoff /var/swapfile    
sudo rm /var/swapfile 

接下来编译并安装nccl:

git clone https://github/NVIDIA/nccl.git   
cd nccl     
make -j4     

整个编译过程大概需要几十分钟左右。

编译完成后如下图所示:

最后安装即可:

sudo make install

安装完成效果图如下所示:

3.2 编译并安装Paddle

3.2.1下载源码

首先从官方网站下载源码,这里使用gitee的库Paddle: PaddlePaddle (PArallel Distributed Deep LEarning 并行分布式深度学习)是百度研发的深度学习平台,具有易用,高效,灵活和可伸缩等特点,为百度内部多项产品提供深度学习算法支持会快很多,不推荐使用github的库(比较慢):

git clone -b release/2.0 https://gitee/paddlepaddle/Paddle.git

上述代码中需要注意对应的版本号,这里是release/2.0,实际下载时可能会有更新的版本,自己通过查找当前版本分支来选择。

3.2.2 更改第三方库的github地址

由于Paddle库源码依赖很多第三方库,详见Paddle/cmake/external/*.cmake。里面涉及的库大多来自github,需要把库导入码云平台,然后将*.cmake 库的链接替换掉,这样编译下载时就快很多。前期我已经将需要倒换过来的库放在来我自己的gitee库里,因此只需要按照下面的步骤进行操作即可,读者可以不用再额外的去倒换库了。具体操作如下。

(1)修改Paddle/cmake/external/glog.cmake

双击打开上述文件,找到下述代码:

SET(GLOG_REPOSITORY ${GIT_URL}/google/glog.git)

将其替换为:

SET(GLOG_REPOSITORY https://gitee/binghai228/glog.git)

然后保存修改。

(2)修改Paddle/cmake/external/protobuf.cmake

双击打开上述文件,找到下述代码:

SET(PROTOBUF_REPOSITORY  ${GIT_URL}/protocolbuffers/protobuf.git)

将其替换为:

SET(PROTOBUF_REPOSITORY  https://gitee/binghai228/protobuf.git)

然后保存修改。

(3)修改Paddle/cmake/external/xxhash.cmake

双击打开上述文件,找到下述代码:

set(XXHASH_REPOSITORY  ${GIT_URL}/Cyan4973/xxHash.git)

将其替换为:

set(XXHASH_REPOSITORY  https://gitee/binghai228/xxHash.git)

然后保存修改。

(4)修改Paddle/cmake/external/warpctc.cmake

双击打开上述文件,找到下述代码:

set(WARPCTC_REPOSITORY  ${GIT_URL}/baidu-research/warp-ctc.git)

将其替换为:

set(WARPCTC_REPOSITORY  https://gitee/binghai228/warp-ctc.git)

然后保存修改。

(5)修改Paddle/cmake/external/threadpool.cmake

双击打开上述文件,找到下述代码:

SET(THREADPOOL_REPOSITORY ${GIT_URL}/progschj/ThreadPool.git)

将其替换为:

SET(THREADPOOL_REPOSITORY https://gitee/binghai228/ThreadPool.git)

然后保存修改。

(6)修改Paddle/cmake/external/openblas.cmake

双击打开上述文件,找到下述代码:

SET(CBLAS_REPOSITORY  ${GIT_URL}/xianyi/OpenBLAS.git)

将其替换为:

SET(CBLAS_REPOSITORY  https://gitee/binghai228/OpenBLAS.git)

然后保存修改。

(7)修改Paddle/cmake/external/dlpack.cmake

双击打开上述文件,找到下述代码:

set(DLPACK_REPOSITORY ${GIT_URL}/dmlc/dlpack.git)

将其替换为:

set(DLPACK_REPOSITORY https://gitee/binghai228/dlpack.git)

然后保存修改。

(8)修改Paddle/cmake/external/eigen.cmake

双击打开上述文件,找到下述代码:

set(EIGEN_REPOSITORY https://gitlab/libeigen/eigen.git)

将其替换为:

set(EIGEN_REPOSITORY https://gitee/binghai228/eigen.git)

然后保存修改。

(9)修改Paddle/cmake/external/gflags.cmake

双击打开上述文件,找到下述代码:

set(GFLAGS_REPOSITORY ${GIT_URL}/gflags/gflags.git)

将其替换为:

set(GFLAGS_REPOSITORY https://gitee/binghai228/gflags.git)

然后保存修改。

上面列出的9项是我在实际执行过程中遇到的容易下不下来的库,如果读者还遇到来类似的库问题,也可以仿照这个方式继续修改。

3.2.3 配置cuda环境变量

通过前面的刷机,我们已经安装了cuda、cudnn、tensorrt等sdk,接下来需要配置cuda环境变量,打开bashrc文件:

sudo gedit ~/.bashrc

然后在最末尾添加代码如下:

export CUBA_HOME=/usr/local/cuda-10.2

上述文件需要注意cuda版本,不同的版本号需要相应修改。

然后source这个文件:

source ~/.bashrc

3.2.4 编译工具的准备

安装编译需要的一些工具:

sudo apt-get install swig patchelf

3.2.5 准备tensorrt库

由于我们后面需要编译支持tensorrt的paddle库(tensorrt是英伟达推出的针对英伟达GPU做的推理加速引擎),因此我们先要准备好tensorrt库目录,保证后面的paddle工程能够正常的找到这个tensorrt库。首先手动在jetson的usr/文件夹中找到tensorrt库文件(包括.h、.a和.so文件),这些库文件分别在在 /usr/include/aarch64-linux-gnu和/usr/lib/aarch64-linux-gnu 下面。具体到每个文件夹下面只需要搜索Nv和libnv开头的文件然后拷贝到指定目录下即可。

首先在下载的Paddle工程下创建一个名为tensorrt的文件夹,然后在tensorrt文件夹下创建两个子文件夹:include和lib。其中include用来存放tensorrt的.h头文件,lib用来存放tensorrt的.so和.a库文件。如下图所示:

接下来就只需要将/usr/include/aarch64-linux-gnu目录下的tensorrt对应的.h文件拷贝到include文件夹中,将/usr/lib/aarch64-linux-gnu目录下的tensorrt对应的.so和.a文件拷贝到lib文件夹中即可。

拷贝完后两个子文件夹最终效果如下:

上面为了简单,将几乎整个libnv开头的库文件都复制来过来,直接编译阶段应该用不了那么多,但是为了保险起见,可以先全部拷贝过来。

3.2.6 编译paddle

首先设置支持同时打开的文件数量:

ulimit -n 2048 

然后输入下面的命令建立编译目录:

cd Paddle
mkdir build
cd build

接下来设置编译选项:

cmake .. \
    -DWITH_CONTRIB=OFF \
    -DWITH_MKL=OFF  \
    -DWITH_MKLDNN=OFF \
    -DWITH_TESTING=OFF \
    -DCMAKE_BUILD_TYPE=Release \
    -DON_INFER=ON \
    -DWITH_PYTHON=ON \
    -DWITH_XBYAK=OFF  \
    -DWITH_NV_JETSON=ON \
    -DPY_VERSION=3.6 \
    -DWITH_TENSORRT=ON \
    -DTENSORRT_ROOT=/home/qianbin/Paddle/tensorrt \
    -DCUDA_ARCH_NAME=Auto

上述命令中注意DTENSORRT_ROOT字段,这个字段表明当前tensorrt的目录位置,其中需要将“qianbin”替换成读者自己的设备用户名。上述命令将同时编译出python版的paddle和C++版的paddle,而且支持tensorrt加速。

设置完成后正式开始编译:

make -j4

整个的编译过程很长,需要8个小时左右。中间如果终端可以继续使用下面的命令继续编译:

make

注意,在编译的过程中一定要保证风扇是开启的。

编译完成如下图所示:

编译完成后,预测库位于/Paddle/build/fluid_inference_install_dir目录下面,目录结构及version.txt内容如下:

值得注意的是,我们同时还同时编译出来来python安装包,位于目录/home/qianbin/Paddle/build/python/dist下面,直接通过pip安装这个whl文件就可以在jetson上使用python版paddle进行推理了。

更多推荐

Paddle飞桨动态图教程—Jetson AGX Xavier刷机和编译Paddle