本文介绍jetson nano 从入手到跑模型的流程一些记录,包括自己踩的很多坑,以供后人和自己查阅。

硬件配置

我这里的nano(b01)是国产版本,是以emmc(内置闪存)进行启动的,容量只有16GiB。 这是我的附加配件:

  • 512GiB的m.2 nvme硬盘(后期空间开销真的很大,用于挂载到根目录,emmc的16G绝对不够) *1
  • 2.4/5Ghz 双频无线网卡 板载 支持MIMO(理论最大速度867Mbps)*1
  • 32GiB SanDisk UHS-I microSD卡 *1
  • 5dBi无线网卡天线 *2

安装系统

拆开主板的静电袋,首先就是把系统给装上。使用虚拟机安装Ubuntu18.04(理论上更高也没问题),安装NVIDIA SDK manager,让jetson进入恢复模式,连接到虚拟机上的SDK manager,静候烧录,用时大概一两个小时左右吧,这里厂家应该有指导文件,就不细说了。 这里我选择先烧录系统,于是遇上了第一个坑: 如果先烧录系统,后连接到SDK manager下载NVIDIA的组件,请将系统语言保持英文,否则会出现: 安装NVIDIA组件的时候最好先在nano上换源(中科大、清华等等),要不然也容易卡在第三个检查步骤。

安装设备树(驱动)

请遵循厂家说明文件 我这里需要挂载的是外置SD读写器 将你的dtb文件复制到/boot目录下 sudo cp filename.dtb /boot 编辑/boot/extlinux/extlinux.conf配置文件 sudo gedit /boot/extlinux/extlinux.conf

INITRD /boot/initrd下面增加这一行内容 FDT /boot/filename.dtb

将系统迁移到 NVME硬盘/SDcard 上

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

格式化硬盘/SDcard

打开 Ubuntu18.04 自带 Disks 工具,找到安装的 ssd 硬盘,首先按键"Ctrl+F”将其快速格式化为ext4格式, 点击三角符号挂载

克隆rootOnNVMe项目

git clone https://github.com/jetsonhacks/rootOnNVMe.git 修改 rootOnNVME 文件中的以下三个文件: copy-rootfs-ssd.sh data/setssdroot.sh data/setssdroot.service 需要将以上三个文件中对应的设备号/dev/nvme0n1p1 修改为Disks工具中,硬盘/SD卡 对应的设备号/dev/******,其他无需更改,执行脚本开始迁移系统。 ./copy-rootfs-ssd.sh ./setup-service.sh 重启设备 sudo reboot 重启后通过命令 df -h 查看 ssd 或者 sd 卡是否挂载在系统/(根目录)来判断操作是否成功,当然也可以直接在设置中查看系统详情的硬盘大小来确认。

安装远程桌面

这里我推荐xRDP,VNC不推荐,因为纯远程启动折腾起来非常麻烦。

sudo apt install xrdp
sudo apt install xfce4 xfce4-terminal
# 向xsession中写入xfce4-session
echo "xfce4-session" >~/.xsession
# 设置配置文件
sudo vim /etc/xrdp/startwm.sh

. /etc/X11/Xsession前面加 xfce4-session 如图所示: 最后 sudo systemctl enable xrdp 打开Windows远程桌面mstsc,输入远程ubuntu的IP地址,进行远程连接。 xfce4应该无法使用原生的terminal,你可以把Applications-Settings-Preferred Applilcations,打开Preferred Applilcations后,选择Utilities,修改Terminal Emulator,由于我使用的是xfce4桌面,因此选择了xfce Terminal

调整 Xrdp 配置参数

编辑 /etc/xrdp/xrdp.ini

tcp_send_buffer_bytes=116777216
tcp_recv_buffer_bytes=116777216

将以下内容写入配置文件 /etc/sysctl.conf末尾

net.core.rmem_max = 12582912
net.core.wmem_max = 8388608

然后执行sudo sysctl -p

重启 xrdp 服务生效

sudo systemctl restart xrdp

apt换国内源

#添加root密码
sudo passwd root
#备份存nano源原文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
#编辑该文件
sudo vi /etc/apt/sources.list

#拷贝到文件中
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
#更新下源
sudo apt-get update    
    
#更新下软件
sudo apt-get full-upgrade  

检查CUDA CUDNN OpenCV 是否安装完整

CUDA 的配置

#查看是否正确 
nvcc -V

显示如下图配置正确:

检查CUDNN

刚刚在SDK manager中我们已经安装好了cuda及cudnn,运行下mnist案例验证下cudnn是否可用。

#进入案例文件
cd /usr/src/cudnn_samples_v8/mnistCUDNN/mnistCUDNN
#编译一下例子
sudo make 
# 为可执行文件添加执行权限
sudo chmod a+x mnistCUDNN 
#运行测试
./mnistCUDNN

运行成功为最后显示检测结果为:1 3 5

检查OpenCV

python3下查看Opencv正常使用及版本

import cv2
print(cv2.__version__)

安装Conda

由于Jetson为aarch64架构,目前不支持annconda;这里miniforge和annconda使用方式基本一致。

#上面官网链接下载
Mambaforge-4.9.2-7-Linux-aarch64.sh
#直接运行安装脚本;安装过程回有几个选项:要么回车要么yes。
sh ./Mambaforge-4.9.2-7-Linux-aarch64.sh
vim  ~/.bashrc
#最后面添加如下内容:
alias sudo="sudo env PATH=$PATH"
#退出更新变量
source ~/.bashrc
#这是配置进入终端直接 是conda的base环境  false是关闭
conda config --set auto_activate_base false

安装pinyin,pip,python3变更为默认

需要ssh传输文件,需要安装lrzsz。

sudo apt-get install lrzsz

语言支持选择汉语(图形界面下使用,不需要可不装)

sudo apt-get install ibus-pinyin
reboot

安装pip,pip更换阿里源(这里是本机原本的python环境)

sudo apt-get install python3-pip

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

python -m pip install --upgrade pip

自带python2与python3,将Python3设置为默认。

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
python --version
 #显示为3.x.x就说明切换成功
Python 3.6.5

Swap交换空间增加

Jetson Nano 内存为4G,显存与内存共用机制。使交换空间为12G,解决一些耗尽内存的程序出错(比如说编译。依次输入以下命令,并使其永久生效。

sudo fallocate -l 12G /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'