概述
NVIDIA Jetson Nano 是 Jetson 系列产品或 Jetson 模组的一员,是一款小巧而强大的基于 Linux (Ubuntu) 的嵌入式计算机,配备 2GB/4GB GPU。使用它,您可以高效地运行许多 PyTorch 模型。本文档总结了我们在 Jetson Nano 上使用 3 种不同机制运行各种深度学习模型的经验。
- Jetson Inference 是更高级的 NVIDIA API,内置了对运行大多数常见计算机视觉模型的支持,这些模型可以在 Jetson 平台上通过 PyTorch 进行迁移学习。
- TensorRT 是一个来自 NVIDIA 的高性能推理 SDK,需要将 PyTorch 模型转换为 ONNX,然后再转换为 TensorRT 运行时可以运行的 TensorRT 引擎文件。
- PyTorch 使用直接的 PyTorch API
torch.nn进行推理。
设置 Jetson Nano
在此处购买 Jetson Nano 后,只需按照清晰的分步说明将 Jetson Nano 开发者套件的 SD 卡镜像下载并写入 microSD 卡,即可完成设置。设置完成后启动 Nano,您将看到标准的 Linux 提示符以及设置时使用的用户名和 Nano 名称。
要检查 Nano 上的 GPU 状态,请运行以下命令:
sudo pip3 install jetson-stats
sudo jtop
您将看到相关信息,包括:

您还可以查看已安装的 CUDA 版本:
$ ls -lt /usr/local
lrwxrwxrwx 1 root root 22 Aug 2 01:47 cuda -> /etc/alternatives/cuda
lrwxrwxrwx 1 root root 25 Aug 2 01:47 cuda-10 -> /etc/alternatives/cuda-10
drwxr-xr-x 12 root root 4096 Aug 2 01:47 cuda-10.2
若要在 Jetson Nano 上使用摄像头(例如 Arducam 8MP IMX219),请按照此处的说明操作,或在安装摄像头模块后运行以下命令:
cd ~
wget https://github.com/ArduCAM/MIPI_Camera/releases/download/v0.0.3/install_full.sh
chmod +x install_full.sh
./install_full.sh -m arducam
另一种方法是使用原生的 Jetson Nano 摄像头驱动程序:
sudo dpkg -r arducam-nvidia-l4t-kernel
sudo shutdown -r now
然后,使用 ls /dev/video0 来确认摄像头已被识别:
$ ls /dev/video0
/dev/video0
最后,使用以下命令查看摄像头实时画面:
nvgstcapture-1.0 --orientation=2
使用 Jetson Inference
NVIDIA Jetson Inference API 为在 Jetson Nano 上运行图像识别、目标检测、语义分割和姿态估计模型提供了最简单的方法。Jetson Inference 内置了 TensorRT,因此速度非常快。
要测试运行 Jetson Inference,首先克隆仓库并下载模型:
git clone --recursive https://github.com/dusty-nv/jetson-inference
cd jetson-inference
然后使用已经安装了 PyTorch 的预构建 Docker 容器来测试运行模型:
docker/run.sh --volume ~/jetson_inference:/jetson_inference
要在测试图像上运行图像识别、目标检测、语义分割和姿态估计模型,请使用以下命令:
cd build/aarch64/bin
./imagenet.py images/jellyfish.jpg /jetson_inference/jellyfish.jpg
./segnet.py images/dog.jpg /jetson_inference/dog.jpeg
./detectnet.py images/peds_0.jpg /jetson_inference/peds_0.jpg
./posenet.py images/humans_0.jpg /jetson_inference/pose_humans_0.jpg
将生成运行四个不同模型后的四个结果图像。退出 Docker 镜像即可查看它们:
$ ls -lt ~/jetson_inference/
-rw-r--r-- 1 root root 68834 Oct 15 21:30 pose_humans_0.jpg
-rw-r--r-- 1 root root 914058 Oct 15 21:30 peds_0.jpg
-rw-r--r-- 1 root root 666239 Oct 15 21:30 dog.jpeg
-rw-r--r-- 1 root root 179760 Oct 15 21:29 jellyfish.jpg




您也可以使用该 Docker 镜像运行 PyTorch 模型,因为该镜像已安装了 PyTorch、torchvision 和 torchaudio。
# pip list|grep torch
torch (1.9.0)
torchaudio (0.9.0a0+33b2469)
torchvision (0.10.0a0+300a8a4)
尽管 Jetson Inference 已包含转换为 TensorRT 引擎格式的模型,但您可以通过按照此处“使用 PyTorch 进行迁移学习(针对 Jetson Inference)”的步骤进行微调。
使用 TensorRT
TensorRT 是 NVIDIA 推出的一个高性能推理 SDK。Jetson Nano 通过 Jetpack SDK 支持 TensorRT,该 SDK 包含在用于设置 Jetson Nano 的 SD 卡镜像中。要确认 TensorRT 已安装在 Nano 上,请运行 dpkg -l|grep -i tensorrt:

理论上,TensorRT 可用于“获取训练好的 PyTorch 模型并对其进行优化,以便在 NVIDIA GPU 上进行更高效的推理”。请按照笔记本 (notebook) 中的说明和代码,了解如何在 torchvision Resnet50 模型上通过 ONNX 将 PyTorch 与 TensorRT 结合使用。
- 如何将模型从 PyTorch 转换为 ONNX;
- 如何将 ONNX 模型转换为 TensorRT 引擎文件;
- 如何使用 TensorRT 运行时运行引擎文件以提升性能:推理时间从原始的 31.5ms/19.4ms(FP32/FP16 精度)提高到 6.28ms(TensorRT)。
您可以将笔记本代码中的 Resnet50 模型替换为其他 PyTorch 模型,按照上述转换过程操作,并使用 TensorRT 运行时运行最终转换后的 TensorRT 引擎文件,以查看优化后的性能。但请注意,由于 Nano GPU 内存限制,超过 100MB 的模型很可能会运行失败,并出现以下错误信息:
错误代码 1:Cuda Runtime(所有支持 CUDA 的设备均忙碌或不可用)
在将 PyTorch 模型转换为 ONNX 模型时,您也可能会遇到错误,这可以通过将以下代码:
torch.onnx.export(resnet50, dummy_input, "resnet50_pytorch.onnx", verbose=False)
替换为:
torch.onnx.export(model, dummy_input, "deeplabv3_pytorch.onnx", opset_version=11, verbose=False)
使用 PyTorch
首先,要在 Nano 上下载并安装 PyTorch 1.9,请运行以下命令(更多信息请参阅此处):
wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl -O torch-1.9.0-cp36-cp36m-linux_aarch64.whl
sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
pip3 install Cython
pip3 install numpy torch-1.9.0-cp36-cp36m-linux_aarch64.whl
要在 Nano 上下载并安装 torchvision 0.10,请运行以下命令:
https://drive.google.com/uc?id=1tU6YlPjrP605j4z8PMnqwCSoP6sSC91Z
pip3 install torchvision-0.10.0a0+300a8a4-cp36-cp36m-linux_aarch64.whl
完成上述步骤后,运行此命令进行确认:
$ pip3 list|grep torch
torch (1.9.0)
torchvision (0.10.0)
您也可以使用“使用 Jetson Inference”章节中描述的 Docker 镜像(该镜像也安装了 PyTorch 和 torchvision),从而跳过上述手动步骤。
官方 YOLOv5 仓库被用于在 Jetson Nano 上运行 PyTorch YOLOv5 模型。登录 Jetson Nano 后,按照以下步骤操作:
- 获取仓库并安装所需依赖:
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
- 运行
python3 detect.py,默认使用 PyTorch yolov5s.pt 模型。您应该会看到类似以下内容:
detect: weights=yolov5s.pt, source=data/images, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False
YOLOv5 🚀 v5.0-499-g48b00db torch 1.9.0 CUDA:0 (NVIDIA Tegra X1, 3956.1015625MB)
Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/5 /home/jeff/repos/yolov5-new/yolov5/data/images/bus.jpg: 640x480 4 persons, 1 bus, 1 fire hydrant, Done. (0.142s)
...
在 Jetson Nano GPU 上的推理时间约为 140ms,比在 iOS 或 Android(约 330ms)上的推理时间快两倍以上。
如果遇到错误 “ImportError: The _imagingft C module is not installed.”,则需要重新安装 pillow:
sudo apt-get install libpng-dev
sudo apt-get install libfreetype6-dev
pip3 uninstall pillow
pip3 install --no-cache-dir pillow
成功运行 python3 detect.py 后,位于 data/images 中的测试图像的目标检测结果将保存在 runs/detect/exp 目录中。要使用实时摄像头而非本地图像进行检测测试,请在运行 python3 detect.py 时使用 --source 0 参数。
~/repos/yolov5$ ls -lt runs/detect/exp10
total 1456
-rw-rw-r-- 1 jeff jeff 254895 Oct 15 16:12 zidane.jpg
-rw-rw-r-- 1 jeff jeff 202674 Oct 15 16:12 test3.png
-rw-rw-r-- 1 jeff jeff 217117 Oct 15 16:12 test2.jpg
-rw-rw-r-- 1 jeff jeff 305826 Oct 15 16:12 test1.png
-rw-rw-r-- 1 jeff jeff 495760 Oct 15 16:12 bus.jpg
使用 PyTorch iOS YOLOv5 演示应用或 Android YOLOv5 演示应用中使用的相同测试文件,您可以比较在移动设备上运行 YOLOv5 PyTorch 模型与在 Jetson Nano 上运行的结果。


图 1. Jetson Nano 上的 PyTorch YOLOv5。


图 2. iOS 上的 PyTorch YOLOv5。


图 3. Android 上的 PyTorch YOLOv5。
总结
根据我们在 Jetson Nano 上运行各种 PyTorch 模型以用于潜在演示应用的经验,我们看到即使是 Jetson 系列产品中入门级的 Jetson Nano,也提供了强大的 GPU 和嵌入式系统,能够直接高效地运行一些最新的预训练或迁移学习过的 PyTorch 模型。
在 Jetson Nano 上构建 PyTorch 演示应用与在 Linux 上构建类似,但您也可以选择在将 PyTorch 模型转换为 TensorRT 引擎文件格式后使用 TensorRT。
但是,如果您只需要在 Jetson Nano 上使用支持图像识别、目标检测、语义分割和姿态估计模型的 NVIDIA Jetson Inference 运行一些常见的计算机视觉模型,那么这是最简单的方法。
参考文献
Torch-TensorRT,一个通过 TensorRT 实现的 PyTorch 编译器:https://github.com/NVIDIA/Torch-TensorRT/
Jetson Inference Docker 镜像详情:https://github.com/dusty-nv/jetson-inference/blob/master/docs/aux-docker.md
NVIDIA Jetson Nano 上使用 TensorRT 的指南:https://docs.donkeycar.com/guide/robot_sbc/tensorrt_jetson_nano/(包括)
- 使用 Jetson 作为便携式 GPU 设备来运行 NN 象棋引擎模型:https://medium.com/@ezchess/jetson-lc0-running-leela-chess-zero-on-nvidia-jetson-a-portable-gpu-device-a213afc9c018
- 一个使用 PyTorch 和 torchvision 并直接通过 pip 安装的 MaskEraser 应用:https://github.com/INTEC-ATI/MaskEraser#install-pytorch