Jetson Nano安装配置

安装部署

首先根据NVIDIA官网的指南就很容易知道如何安装Jetson Nano了。大致也就如下几步:

  1. 使用“SD Memory Card Formatter”格式化SD卡;
  2. 使用“Etcher”将官方镜像刷进去。最好留意一下官方镜像称为JetPack,不仅是Ubuntu系统,也预装了很多计算机视觉和深度学习方面的库(CUDA、cudnn等),具体参考官方网站:https://developer.nvidia.com/zh-cn/embedded/jetpack
  3. 之后按照官网说明的连接方式先连接上USB电源,之后连接上显示器、键盘和鼠标,成功进入系统,发现其实就是Ubuntu,这时感觉Jetson Nano实际上就是一个非常mini的服务器。简单配置后关机进行其他尝试。
  4. 考虑到一直连接这么多外围设备使得系统很笨重,尝试串口连接设备。此时就需要将J48引脚连接上,之后使用5V4A直流电源连接J25电源插孔,空出USB接口连接PC。按照官方说明,在Putty上选择Serial连接,速率为115200。也可以成功连接上系统,但只能使用命令行。
  5. 观察到网上有评论5V4A的直流电源比USB供电功率更大更稳定,因此即使使用显示屏,也选择连接上J48引脚,并使用5V4A的电源。
  6. 最后关机,拆下显卡,把WiFi模块装上;
  7. 再把MIPI-CSI摄像头安装上,注意安装时金属针脚朝向Jetson Nano内侧。
  8. 开发过程中通过ssh远程连接比较方便,但往往不能使用图形化界面,尤其无法展示视频流,因此选择Putty + Xming的方式远程可视化连接。参考博客:http://www.uuc.me/1211.html。

系统配置

  1. 就像安装一台新服务器一样,首先确定系统版本:
# 查看Linux系统内核
> uname -a
Linux gdcc-desktop 4.9.140-tegra #1 SMP PREEMPT Tue Oct 27 21:02:37 PDT 2020 aarch64 aarch64 aarch64 GNU/Linux
# 查看Ubuntu发行版本
> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.5 LTS
Release:        18.04
Codename:       bionic
# 查看JetPack版本号
> cat /etc/nv_tegra_release
# R32 (release), REVISION: 4.4, GCID: 23942405, BOARD: t210ref, EABI: aarch64, DATE: Fri Oct 16 19:44:43 UTC 2020

记录一些关键信息备用:

  • 内核架构:aarch64、amd64;
  • Ubuntu发行版本号:18.04.5 LTS;代号:bionic;
  • JetPack版本号:4.4
  1. 更新apt源。一方面可以在命令行修改/etc/apt/sources.list文件修改,注意OS版本:
# 先保存原始文件
mv /etc/apt/sources.list /etc/apt/sources.list.bak

# 创建新文件
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 update
sudo apt full-upgrade

# 查看已安装的包
dpkg -l > ~/pakageInstalled.txt

另一方面也可以通过图形界面“设置->关于->Software Updates->软件和更新”中修改下载服务器。

  1. 进入系统设置,查看并根据自己的喜好修改一些设置。

开发环境检查配置

开始进行机器学习和使用之前,首先要确定开发环境的正确性。

检查python

> which python
/usr/bin/python
> which python3
/usr/bin/python3
> python --version
Python 2.7.17
> python3 --version
Python 3.6.9

检查TensorRT

> dpkg -l | grep TensorRT
ii  nvidia-container-csv-tensorrt  7.1.3.0-1+cuda10.2  arm64  Jetpack TensorRT CSV file
ii  tensorrt  7.1.3.0-1+cuda10.2  arm64  Meta package of TensorRT

检查CUDA

运行nvcc -V检查CUDA版本,发现没有输出,需要添加环境变量:

> vi  /etc/profile
# 添加如下内容
export CUDA_HOME=/usr/local/cuda-10.2
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.2/bin:$PATH

> source /etc/profile
> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_21:14:42_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

检查CuDNN

直接尝试跑一个例子:

> cd /usr/src/cudnn_samples_v8/mnistCUDNN   #进入例子目录
> sudo make     #编译一下例子
> sudo chmod a+x mnistCUDNN # 为可执行文件添加执行权限
> ./mnistCUDNN > /home/gdcc/cudnnTest.txt  # 执行

摘录一些输出中的重要信息:

cudnnGetVersion() : 8000 , CUDNN_VERSION from cudnn.h : 8000 (8.0.0)
Host compiler version : GCC 7.5.0

There are 1 CUDA capable devices on your machine :
device 0 : sms  1  Capabilities 5.3, SmClock 921.6 Mhz, MemSize (Mb) 3964, MemClock 12.8 Mhz, Ecc=0, boardGroupID=0

检查OpenCV

> pkg-config opencv4 --modversion
4.1.1
# 进入Python查看是否可以用OpenCV
> python3
>>> import cv2
>>> print(cv2.__version__)
4.4.1

安装配置拼音输入法

> apt-get install ibus-pinyin

之后在"System Settings -> Language Support -> 添加或删除语言"中添加中文,并调整到最前面,之后重启电脑。终端中ibus-setup调出ibus首选项,“输入法”选项中添加汉语“Intelligent Pinyin”选项,之后就可以使用中文输入法了。

删除LibreOffice

该软件对深度学习没什么用,故选择直接删除:

sudo apt-get purge libreoffice*
sudo apt-get clean

开发环境搭建

JetPack包提供的开发环境并不完整,还需要自己安装和配置一些更多的包。

pip安装和配置

  1. 首先命令行安装pip:
> apt-get install python3-pip python3-dev  # 安装pip
> python3 -m pip install --upgrade pip  #升级pip
> pip3 -V
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 20.3.3 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)
> python3 -m pip list > /home/gdcc/PipPackage.txt
  1. 更换pip安装源:
> cd ~
> mkdir .pip
> vi ./.pip/pip.conf
# 写入如下配置
[global]
trusted-host = mirrors.aliyun.com
index-url = http://mirrors.aliyun.com/pypi/simple
timeout = 120
  1. 可以从pip list中查看到已经安装了numpy、scipy等基本包,但还没有安装TensorFlow。网上搜索到各种不同的安装方法,最后查到官方有TensorFlow的安装指南,故决定按照该指南安装专用于Jetson平台的TensorFlow。

TensorFlow安装和配置

  1. 首先应该根据JetPack的版本确定能用的TensorFlow版本:
    版本匹配

  2. 命令行安装TensorFlow:

# 安装TensorFlow必需的包
> apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran

# 安装和更新必需的Python包,注意一些包必须安装指定版本
> python3 -m pip install -U testresources setuptools==49.6.0
> python3 -m pip install -U numpy==1.16.1 future==0.18.2 mock==3.0.5 h5py==2.10.0 keras_preprocessing==1.1.1 keras_applications==1.0.8 gast==0.2.2 scipy==1.4.1 
> python3 -m pip install protobuf pybind11

# 安装TensorFlow for JetPack
> python3 -m pip install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v44 tensorflow

安装过程中遇到各种问题,尤其出现在pip install的过程中,有时是下载很慢,有时是卡在编译过程。Building wheel for numpy编译时等了好久都没有反应。

这时发现Jetson下载平台上还提供了各种TensorFlow for Jetson的wheel文件,这种文件都是已经编译完成的包。那么直接根据需求选择合适的版本,下载这些文件,之后pip install ./***.whl就可以安装对应的环境。过程中一样也需要下载和编译一些必需的包,需要耐心等待。安装完成后执行如下命令检查能否成功导入TensorFlow:

> python3
> import tensorflow as tf
2020-12-21 18:03:24.986485: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.2

设置交换区

首先插上USB摄像头,使用OpenCV-Python简单测试视频流的读取,发现非常卡顿。网上查找发现嵌入式系统普遍存在内存不足(memory limitation)的问题,因此常常需要建立交换区(Swap partition)来解决该问题。首先使用“系统监视器”查看得知已经建立有2GB的Swap交换空间。了解到通常情况下交换区4GB足够,故决定再添加2GB交换空间:

# 新增swapfile文件大小自定义
sudo fallocate -l 2G /var/swapfile
# 配置该文件的权限
sudo chmod 600 /var/swapfile
# 建立交换分区
sudo mkswap /var/swapfile
# 启用交换分区
sudo swapon /var/swapfile
# 设置为自动启用该Swapfile
sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'

再查看“系统监视器”,发现交换空间已变为4GB。不过应注意交换空间尽可以被CPU利用,而无法被GPU使用。

Python虚拟环境安装及配置

很多时候需要不同版本的TensorFlow跑不同的模型,因此还需要用到Python虚拟环境,下面安装并配置Python虚拟环境包:

> python3 -m pip install virtualenv virtualenvwrapper
> mkdir /home/gdcc/.virtualenvs
> vi /etc/profile
# 添加环境目录至该文件
export WORKON_HOME=$HOME/.virtualenvs  # 指定所有虚拟环境的安装位置
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 #指定解释器
source /home/gdcc/.local/bin/virtualenvwrapper.sh  #进行激活生效

> source /etc/profile
> mkvirtualenv <env_name> -p python3  # 使用该命令创建指定名称的虚拟环境

虚拟环境常用命令记录如下:

#创建一个环境
mkvirtualenv name #在~/.virtualenvs下安装name的虚拟环境
#激活工作环境
workon name
#workon后不加任何东西可以列出所有虚拟环境
#退出当前虚拟环境
deactivate
#删除虚拟环境,需先退出
rmvirtualenv name
#列出所有虚拟环境
lsvirtualenv

jtop安装

安装系统工具jtop, 可以同时查看CPU和GPU资源以及温度等信息:

> sudo -H python3 -m pip install jetson-stats
> sudo jtop

OpenCV编译安装

通过jtop观察到自带的OpenCV并没有compiled CUDA
在这里插入图片描述
并且在配置新的Python虚拟环境时也无法import cv2。尝试通过pip install opencv-python时,也一直卡在编译阶段:

Building wheels for collected packages: opencv-python
  Building wheel for opencv-python (PEP 517) ... -

网上查询得知OpenCV-python并没有提供Arm64架构使用的包,故尝试自行下载OpenCV的源码并编译安装。首先源码可以在OpenCV的GitHub上下载到,下载4.5.03.4.13两个版本的源码备用。也需要在Opencv额外库的GitHub上下载对应版本的源码。

NVIDIA论坛上发现有人提供了在Jetson上安装OpenCV的shell脚本,于是直接参照该脚本编译安装OpenCV 3.4.13:

  1. 删除预装OpenCV:
# 检查之前预装的所有与OpenCV相关的包
> dpkg -l | grep opencv
ii  libopencv                                     4.1.1-2-gd5a58aa75                               arm64        Open Computer Vision Library
ii  libopencv-dev                                 4.1.1-2-gd5a58aa75                               arm64        Development files for Open Source Computer Vision Library
ii  libopencv-python                              4.1.1-2-gd5a58aa75                               arm64        Python bindings for Open Source Computer Vision Library
ii  libopencv-samples                             4.1.1-2-gd5a58aa75                               arm64        Samples for Open Source Computer Vision Library
ii  opencv-licenses                               4.1.1-2-gd5a58aa75                               arm64        Open Computer Vision Library
# 先卸载预装的OpenCV 4.4.1
> sudo apt-get purge *libopencv*
下列软件包将被【卸载】:
  libopencv* libopencv-dev* libopencv-python* libopencv-samples*
  opencv-licenses* vpi-samples*
解压缩后将会空出 85.0 MB 的空间。
您希望继续执行吗? [Y/n] y
(正在读取数据库 ... 系统当前共安装有 157315 个文件和目录。)
正在卸载 vpi-samples (0.4.4) ...
正在卸载 libopencv-dev (4.1.1-2-gd5a58aa75) ...
正在卸载 opencv-licenses (4.1.1-2-gd5a58aa75) ...
正在卸载 libopencv-python (4.1.1-2-gd5a58aa75) ...
dpkg: 警告: 卸载 libopencv-python 时,目录 /usr/lib/python3.6/dist-packages/cv2 非空,因而不会删除该目录
正在卸载 libopencv-samples (4.1.1-2-gd5a58aa75) ...
正在卸载 libopencv (4.1.1-2-gd5a58aa75) ...

# 确认删除情况
> dpkg -l | grep opencv
  1. 安装必须库:
> sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
> sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
> sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
> sudo apt-get install libv4l-dev v4l-utils qv4l2 v4l2ucp
  1. 解压opencv-3.4.13.zipopencv_contrib-3.4.13.zip
> unzip ./opencv-3.4.13.zip
> unzip ./opencv_contrib-3.4.13.zip
  1. 编译安装,编译命令行的一些参数值记录一下:
  • CUDA_ARCH_BIN:该值就对应硬件的Compute Capability,Nano的值为5.3
  • OPENCV_EXTRA_MODULES_PATH:额外库的位置,即为contrib库的解压缩位置/home/gdcc/opencv_contrib-3.4.13/modules
> cd ./opencv-3.4.13/
> mkdir ./release
> cd ./release/
> cmake -D WITH_CUDA=ON -D WITH_CUDNN=ON -D CUDA_ARCH_BIN="5.3" -D CUDA_ARCH_PTX="" -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=/home/gdcc/opencv_contrib-3.4.13/modules -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
> make -j$(nproc)
> sudo make install

make过程中报错boostdesc_bgm.i: 没有那个文件或目录,搜索都是由于缺少某些文件导致,网上可以下载到这些文件,解压后放在/home/gdcc/opencv_contrib-3.4.13/modules/xfeatures2d/src/再重新make即可。

还有报错找不到opencv2/xfeatures2d/cuda.hpp的,按照CSDN上的博客,将对应文件中的cuda.hpp路径修改为/home/gdcc/opencv_contrib-3.4.13/modules/xfeatures2d/include/opencv2/xfeatures2d/cuda.hpp就可以了。

  1. 之后jtop检查安装情况:
    在这里插入图片描述
    可以看到OpenCV的版本号就是刚刚安装的3.4.13,并且也是complied with CUDA的。再在系统的Python3中import cv2,也没有报错,说明安装成功!

  2. 但目前也仅能在系统的Python中使用OpenCV,想要在Python的虚拟环境中使用,还需要将构建好的OpenCV库链接到对应的python虚拟环境:

# 在虚拟环境的site-packages库中添加编译安装后OpenCV的库的链接
> cd /home/gdcc/.virtualenvs/tf-pose-env/lib/python3.6/site-packages
> ln -s /home/gdcc/opencv-3.4.13/release/lib/python3/cv2.cpython-36m-aarch64-linux-gnu.so cv2.so

这样安装的OpenCV之后可以在Python中import cv2,但pip list中并没有opencv-python项,因此在安装一些依赖包的时候仍会报错Error: No matching distribution found for opencv-python。此时仅需要在安装时添加no-dependencies参数即可,即pip3 install <some_opencv_dependent_package> --no-dependencies

参考文档:

  • https://jkjung-avt.github.io/opencv-on-nano/
  • https://www.cnblogs.com/ikic/p/12601450.html
  • https://forums.developer.nvidia.com/t/how-to-make-pre-installed-in-jetson-nano-opencv-python-visible-for-pip3/110152

其他

编译安装一些CUDA的工具:

  1. deviceQuery:该程序可以检测到GPU的详细信息:
> cd /usr/local/cuda-10.2/samples/1_Utilities/deviceQuery
> sudo make
> ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "NVIDIA Tegra X1"
  CUDA Driver Version / Runtime Version          10.2 / 10.2
  CUDA Capability Major/Minor version number:    5.3
  Total amount of global memory:                 3964 MBytes (4156682240 bytes)
  ( 1) Multiprocessors, (128) CUDA Cores/MP:     128 CUDA Cores
  GPU Max Clock rate:                            922 MHz (0.92 GHz)
  Memory Clock rate:                             13 Mhz
  Memory Bus Width:                              64-bit
  L2 Cache Size:                                 262144 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            Yes
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            No
  Supports Cooperative Kernel Launch:            No
  Supports MultiDevice Co-op Kernel Launch:      No
  Device PCI Domain ID / Bus ID / location ID:   0 / 0 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.2, CUDA Runtime Version = 10.2, NumDevs = 1
Result = PASS
  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值