本文介绍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'
...