目录

1. 烧录Jetson Nano镜像

2 设置i2c permissions

3 安装pip3和python依赖

4 安装TensorFlow

4.1 安装依赖

4.2 确定需要的TensorFlow版本

4.2.1 查看jetpack 版本

4.2.2 查看jetpack与tensorflow的对应关系

4.3 下载TensorFlow

4.4 安装TensorFlow

4.5 验证安装是否成功

5 安装pytorch

5.1源码编译pytorch

5.1.1 下载pytorch源码

5.1.2 设置编译参数

5.1.3 编译

5.2 安装pytorch

5.3 验证安装是否成功

6 安装traitlets

7 安装jupyter lab

8 安装jebbot repo

9 安装jetbot services

10 设置 swapfile

11 复制 JetBot notebooks 到home目录

12使用


JetBot 项目是NVIDIA(英伟达)基于Jetson Nano开发套件而设计的一款开源智能车项目。 它提供了基于视觉的自主避障,物体跟随,路径跟踪以及人脸识别等功能。对于AI初学者来说,Jetbot是一个很好的入门途径。

Nvidia官方提供了完整的硬件和软件列表,参考https://github.com/NVIDIA-AI-IOT/jetbot/wiki, 可以自行组装jetbot小车。但是,自己采购零件还是很麻烦,国内的微雪公司提供了完整的小车方案,可以直接从https://www.waveshare.net/list.html?cat=261购买。

硬件有了,软件环境的搭建也是一个大工程。Nvidia官方提供了Jetbot镜像下载(https://drive.google.com/open?id=1G5nw0o3Q6E08xZM99ZfzQAe7-qAXxzHN), 但是很不幸,镜像位于google仓库,国内如果没有翻墙软件,根本无法下载. 本文教你如何自己从头构建一个jetbot环境。

主要参考https://github.com/NVIDIA-AI-IOT/jetbot/wiki/Create-SD-Card-Image-From-Scratchhttps://blog.csdn.net/liam_dapaitou/article/details/90451808

1. 烧录Jetson Nano镜像

这一步简单,直接参照Nvidia的官方步骤即可。

https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write

有的文章中要求ubuntu系统的用户名和密码需要为jetbot /jetbot, 按照我的实践结果,并不需要,使用自己喜欢的用户名和密码就可以。

2 设置i2c permissions

sudo usermod -aG i2c $USER

3 安装pip3和python依赖

sudo apt-get update
sudo apt install python3-pip python3-pil
sudo pip3 install --upgrade numpy 

 

4 安装TensorFlow

这里https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html

给出了官方步骤在jetson nano上安装tensorflow。

 

4.1 安装依赖

$ sudo apt-get update
$ sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran
$ sudo apt-get install python3-pip
$ sudo pip3 install -U pip testresources setuptools

  $ sudo pip3 install -U numpy==1.16.1 future==0.17.1 mock==3.0.5 h5py==2.9.0 keras_preprocessing==1.0.5 keras_applications==1.0.8 gast==0.2.2 futures protobuf pybind11

4.2 确定需要的TensorFlow版本

Jetson Nano镜像一直在更新jetpack的版本,随之使用的tensorflow版本也需要更新。所以首先需要确定自己的Jetpack版本,以及与tensorflow版本的对应关系。

 

4.2.1 查看jetpack 版本

    运行 $ head -n 1 /etc/nv_tegra_release

# R32 (release), REVISION: 4.3, GCID: 21589087, BOARD: t210ref, EABI: aarch64, DATE: Fri Jun 26 04:38:25 UTC 2020

note that, that version is jetpack4.4, not 4.3

4.2.2 查看jetpack与tensorflow的对应关系

下面链接给出了这个对应关系:

https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform-release-notes/tf-jetson-rel.html#tf-jetson-rel

我这里选的是最新的2.2.0, container20.07

4.3 下载TensorFlow

下面的网址:https://developer.nvidia.com/embedded/downloads#?search=tensorflow

 

选择需要的包下载。

4.4 安装TensorFlow

如下命令安装:

$ sudo pip3 install /local/jetbot/tensorflow-2.2.0+nv20.6-cp36-cp36m-linux_aarch64.whl

 

安装会持续很长时间,尤其在安装 sudo pip3 install grpcio 时,需要耐心等待。

4.5 验证安装是否成功

     1) 运行:

        $ python3

     2) Import TensorFlow:

        >>> import tensorflow

      如果安装成功,不会报任何错误.

     如果报错误

2020-07-30 22:25:36.863526: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudart.so.10.0'; dlerror: libcudart.so.10.0: cannot open shared object file: No such file or directory

2020-07-30 22:25:36.863829: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudart.so.10.0'; dlerror: libcudart.so.10.0: cannot open shared object file: No such file or directory

Segmentation fault (core dumped)

这个问题的出现是由于目前版本的Tensorflow还只能支持CUDA10.0,而英伟达的CUDA则是更新到了10.2,要解决这个问题,可以下载更新版本的TensorFlow。

查看CUDA的版本:

/usr/local/cuda-10.2/doc/man/man7/libcudart.so.7

/usr/local/cuda-10.2/targets/aarch64-linux/lib/libcudart.so.10.2.89

/usr/local/cuda-10.2/targets/aarch64-linux/lib/libcudart.so

/usr/local/cuda-10.2/targets/aarch64-linux/lib/libcudart.so.10.2

 

卸载老的tensorflow,使用命令:

sudo pip3 uninstall -y tensorflow

如果安装正确版本的tensorflow后,输出如下:

/local/jetbot$ python3

Python 3.6.9 (default, Jul 17 2020, 12:50:27) 

[GCC 8.4.0] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow

2020-07-31 14:13:51.745779: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.2

>>> quit()

5 安装pytorch

Pytorch在X86平台提供了很好的安装包,所以很容易安装。但是,在Nano上,需要使用Nvidia提供的安装包,参照下面的链接下载:

https://forums.developer.nvidia.com/t/pytorch-for-jetson-nano-version-1-5-0-now-available/72048

下载包:  

wget https://nvidia.app.box.com/public/static/9eptse6jyly1ggt9axbja2yrmj6pbarc.whl -O torch-1.6.0-cp36-cp36m-linux_aarch64.whl

会出现以下错误:

wget https://nvidia.app.box.com/public/static/9eptse6jyly1ggt9axbja2yrmj6pbarc.whl -O torch-1.6.0-cp36-cp36m-linux_aarch64.whl

--2020-08-14 16:14:07--  https://nvidia.app.box.com/public/static/9eptse6jyly1ggt9axbja2yrmj6pbarc.whl

Resolving nvidia.app.box.com (nvidia.app.box.com)... 203.98.7.65, 2001::c765:853e

Connecting to nvidia.app.box.com (nvidia.app.box.com)|203.98.7.65|:443... failed: Connection timed out.

Connecting to nvidia.app.box.com (nvidia.app.box.com)|2001::c765:853e|:443... failed: Network is unreachable

根本无法访问nvidia.app.box.com。

这时,我们需要从源码自己在Nano上编译pytorch。

5.1源码编译pytorch

步骤参考https://forums.developer.nvidia.com/t/pytorch-for-jetson-nano-version-1-6-0-now-available/72048

5.1.1 下载pytorch源码

运行:$ git clone --recursive --branch v1.6.0 https://github.com.cnpmjs.org/pytorch/pytorch

如果报如下错误:

robin@robin-nano:/local/jetbot$ 

git clone --recursive --branch v1.6.0 https://github.com.cnpmjs.org/pytorch/pytorch

Cloning into 'pytorch'...

remote: Enumerating objects: 419310, done.

Receiving objects:  11% (47614/419310), 15.38 MiB | 22.00 KiB/s    

error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.

fatal: The remote end hung up unexpectedly

fatal: early EOF

fatal: index-pack failed

则错误解决方法为运行如下三条命令:

      sudo apt-get install gnutls-bin

      git config --global http.sslVerify false

      git config --global http.postBuffer 1048576000

5.1.2 设置编译参数

$ export USE_NCCL=0$ export USE_DISTRIBUTED=0 # skip setting this if you want to enable OpenMPI backend$ export USE_QNNPACK=0$ export USE_PYTORCH_QNNPACK=0$ exportTORCH_CUDA_ARCH_LIST="5.3;6.2;7.2"$ export PYTORCH_BUILD_VERSION=1.6.0  #without the leading 'v', e.g. 1.3.0 for PyTorch v1.3.0

5.1.3 编译

5.1.3.1 安装依赖

$ sudo apt-get install python3-pip cmake libopenblas-dev

$ pip3 install -r requirements.txt

如果报如下错误:

Running setup.py bdist_wheel for numpy ... error Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-s5px6e7p/numpy/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmpxam0ar65pip-wheel- --python-tag cp36: Running from numpy source directory.Cythonizing sourcesProcessing numpy/random/_bounded_integers.pxd.inProcessing numpy/random/_philox.pyxTraceback (most recent call last):File "/tmp/pip-build-s5px6e7p/numpy/tools/cythonize.py", line 59, in process_pyxfrom Cython.Compiler.Version import version as cython_versionModuleNotFoundError: No module named 'Cython'
 

报此错误,可以运行: $ pip3 install cython

然后,重新执行$ pip3 install -r requirements.txt

5.1.3.2安装ninja

$ pip3 install ninja

5.1.3.3编译

$ python3 setup.py bdist_wheel

编译时间非常漫长,我用了差不多12个小时才在nano上编译完成。

编译完成后,安装包位于pytorch/dist/torch-1.6.0a0+b31f58d-cp36-cp36m-linux_aarch64.whl

5.2 安装pytorch

  1. sudo pip3 install torch-1.6.0a0+b31f58d-cp36-cp36m-linux_aarch64.whl
  2. sudo pip3 install torchvision

5.3 验证安装是否成功

Run $ pip3

>>> import torch

>>> print(torch.__version__)

>>> print('CUDA available: ' + str(torch.cuda.is_available()))

>>> print('cuDNN version: ' + str(torch.backends.cudnn.version()))

>>> a = torch.cuda.FloatTensor(2).zero_()

>>> print('Tensor a = ' + str(a))

>>> b = torch.randn(2).cuda()

>>> print('Tensor b = ' + str(b))

>>> c = a + b

>>> print('Tensor c = ' + str(c))

>>> import torchvision

>>> print(torchvision.__version__)

 

6 安装traitlets

$sudo python3 -m pip install git+https://github.com/ipython/traitlets@master

7 安装jupyter lab

1) install nodejs and nmp

download from https://nodejs.org/en/download/

install from https://github.com/nodejs/help/wiki/Installation

2) $sudo pip3 install jupyter jupyterlab

3)$sudo jupyter labextension install @jupyter-widgets/jupyterlab-manager

4) $sudo jupyter labextension install @jupyterlab/statusbar   

5) $jupyter lab --generate-config

6)$ jupyter notebook password

  密码使用:jetbot, 也可以使用别的密码,记住即可, 后面会使用此密码登录jupyter

 

注意: 系统自带的nodjs版本太低,执行第3)步时会报如下错误,所以要遵循第1)步的方法安装最新版的nodejs

robin@robin-nano:/local/jetbot$ sudo jupyter labextension install @jupyter-widgets/jupyterlab-manager

[sudo] password for robin:

An error occured.

ValueError: Please install nodejs >=10.0.0 before continuing. nodejs may be installed using conda or directly from the nodejs website.

See the log file for details:  /tmp/jupyterlab-debug-l4c2378v.log

robin@robin-nano:/local/jetbot$ nodejs -v

v8.10.0

8 安装jebbot repo

1) $sudo apt install python3-smbus
2) $git clone https://github.com/NVIDIA-AI-IOT/jetbot
3) $cd jetbot
   $sudo apt-get install cmake
4) $sudo python3 setup.py install

 

9 安装jetbot services

1)$ cd jetbot/utils
$python3 create_stats_service.py
2) $sudo mv jetbot_stats.service /etc/systemd/system/jetbot_stats.service
3) $sudo systemctl enable jetbot_stats
4) $sudo systemctl start jetbot_stats

查看jetbot_stats是否正常启动:

$ sudo systemctl status jetbot_stats
● jetbot_stats.service - JetBot stats display service
   Loaded: loaded (/etc/systemd/system/jetbot_stats.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-08-14 14:36:52 CST; 4s ago
 Main PID: 11508 (sh)
    Tasks: 2 (limit: 4174)
   CGroup: /system.slice/jetbot_stats.service
           ├─11508 /bin/sh -c python3 -m jetbot.apps.stats
           └─11515 python3 -m jetbot.apps.stats

 

5) $python3 create_jupyter_service.py
6) $sudo mv jetbot_jupyter.service /etc/systemd/system/jetbot_jupyter.service
7) $sudo systemctl enable jetbot_jupyter
8) $sudo systemctl start jetbot_jupyter

 

查看jetbot_jupyter是否正常启动:

$ sudo systemctl status jetbot_jupyter
● jetbot_jupyter.service - Jupyter Notebook Service
   Loaded: loaded (/etc/systemd/system/jetbot_jupyter.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-08-14 14:40:01 CST; 5s ago
 Main PID: 15596 (sh)
    Tasks: 2 (limit: 4174)
   CGroup: /system.slice/jetbot_jupyter.service
           ├─15596 /bin/sh -c jupyter lab --ip=0.0.0.0 --no-browser
           └─15608 /usr/bin/python3 /usr/local/bin/jupyter-lab --ip=0.0.0.0 --no-browser
 
8月 14 14:40:01 robin-nano systemd[1]: Started Jupyter Notebook Service.
8月 14 14:40:04 robin-nano sh[15596]: [I 14:40:04.619 LabApp] Writing notebook server cookie secret to /home/robin/.local/share/jupyter/runtime/no
8月 14 14:40:06 robin-nano sh[15596]: [I 14:40:06.574 LabApp] JupyterLab extension loaded from /usr/local/lib/python3.6/dist-packages/jupyterlab
8月 14 14:40:06 robin-nano sh[15596]: [I 14:40:06.575 LabApp] JupyterLab application directory is /usr/local/share/jupyter/lab
8月 14 14:40:06 robin-nano sh[15596]: [I 14:40:06.586 LabApp] Serving notebooks from local directory: /home/robin
8月 14 14:40:06 robin-nano sh[15596]: [I 14:40:06.586 LabApp] The Jupyter Notebook is running at:
8月 14 14:40:06 robin-nano sh[15596]: [I 14:40:06.587 LabApp] http://robin-nano:8888/
8月 14 14:40:06 robin-nano sh[15596]: [I 14:40:06.587 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmat

 

10 设置 swapfile

1) $sudo fallocate -l 4G /var/swapfile2) $sudo chmod 600 /var/swapfile3) $sudo mkswap /var/swapfile4) $sudo swapon /var/swapfile5) $sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'

 

11 复制 JetBot notebooks 到home目录

$cp -r ~/jetbot/notebooks ~/Notebooks

至此配置完成,重启之后,led屏上会显示当前的IP,磁盘,内存,电量信息。

12使用

按照jebot提供的例子就可以开始学习了。

https://github.com/NVIDIA-AI-IOT/jetbot/wiki/Examples

将nano接入wifi网络,查看IP地址,我这里的IP为192.168.10.137

在另一台机器上打开浏览器,输入192.168.10.137:8888,会进入如下页面,

输入密码后,就可以开始学习了。密码是在第7章时设置的密码。