文章目录
安装部署
首先根据NVIDIA官网的指南就很容易知道如何安装Jetson Nano了。大致也就如下几步:
- 使用“SD Memory Card Formatter”格式化SD卡;
- 使用“Etcher”将官方镜像刷进去。最好留意一下官方镜像称为JetPack,不仅是Ubuntu系统,也预装了很多计算机视觉和深度学习方面的库(CUDA、cudnn等),具体参考官方网站:https://developer.nvidia.com/zh-cn/embedded/jetpack
- 之后按照官网说明的连接方式先连接上USB电源,之后连接上显示器、键盘和鼠标,成功进入系统,发现其实就是Ubuntu,这时感觉Jetson Nano实际上就是一个非常mini的服务器。简单配置后关机进行其他尝试。
- 考虑到一直连接这么多外围设备使得系统很笨重,尝试串口连接设备。此时就需要将J48引脚连接上,之后使用5V4A直流电源连接J25电源插孔,空出USB接口连接PC。按照官方说明,在Putty上选择Serial连接,速率为115200。也可以成功连接上系统,但只能使用命令行。
- 观察到网上有评论5V4A的直流电源比USB供电功率更大更稳定,因此即使使用显示屏,也选择连接上J48引脚,并使用5V4A的电源。
- 最后关机,拆下显卡,把WiFi模块装上;
- 再把MIPI-CSI摄像头安装上,注意安装时金属针脚朝向Jetson Nano内侧。
- 开发过程中通过ssh远程连接比较方便,但往往不能使用图形化界面,尤其无法展示视频流,因此选择Putty + Xming的方式远程可视化连接。参考博客:http://www.uuc.me/1211.html。
系统配置
- 就像安装一台新服务器一样,首先确定系统版本:
# 查看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
- 更新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->软件和更新”中修改下载服务器。
- 进入系统设置,查看并根据自己的喜好修改一些设置。
开发环境检查配置
开始进行机器学习和使用之前,首先要确定开发环境的正确性。
检查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安装和配置
- 首先命令行安装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
- 更换pip安装源:
> cd ~
> mkdir .pip
> vi ./.pip/pip.conf
# 写入如下配置
[global]
trusted-host = mirrors.aliyun.com
index-url = http://mirrors.aliyun.com/pypi/simple
timeout = 120
- 可以从
pip list
中查看到已经安装了numpy、scipy等基本包,但还没有安装TensorFlow。网上搜索到各种不同的安装方法,最后查到官方有TensorFlow的安装指南,故决定按照该指南安装专用于Jetson平台的TensorFlow。
TensorFlow安装和配置
-
首先应该根据JetPack的版本确定能用的TensorFlow版本:
-
命令行安装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.0
和3.4.13
两个版本的源码备用。也需要在Opencv额外库的GitHub上下载对应版本的源码。
NVIDIA论坛上发现有人提供了在Jetson上安装OpenCV的shell脚本,于是直接参照该脚本编译安装OpenCV 3.4.13:
- 删除预装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
- 安装必须库:
> 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
- 解压
opencv-3.4.13.zip
和opencv_contrib-3.4.13.zip
:
> unzip ./opencv-3.4.13.zip
> unzip ./opencv_contrib-3.4.13.zip
- 编译安装,编译命令行的一些参数值记录一下:
- 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
就可以了。
-
之后
jtop
检查安装情况:
可以看到OpenCV的版本号就是刚刚安装的3.4.13
,并且也是complied with CUDA
的。再在系统的Python3中import cv2
,也没有报错,说明安装成功! -
但目前也仅能在系统的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的工具:
- 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