873浏览
查看: 873|回复: 4

NVIDIA Jetson Nano 2GB系列文章(64):将模型部署到Jetson设备

[复制链接]
NVIDIA Jetson Nano 2GB系列文章(64):将模型部署到Jetson设备图1

前面我们花了很多力气在 TAO 上面训练模型,其最终目的就是要部署到推理设备上发挥功能。除了将模型训练过程进行非常大幅度的简化,以及整合迁移学习等功能之外,TAO 还有一个非常重要的任务,就是让我们更轻松获得 TensorRT 加速引擎。

将一般框架训练的模型转换成 TensorRT 引擎的过程并不轻松,但是 TensorRT 所带来的性能红利又是如此吸引人,如果能避开麻烦又能享受成果,这是多么好的福利!

  • 一般深度学习模型转成 TensorRT 引擎的流程


下图是将一般模型转成 TesnorRT 的标准步骤,在中间 “Builder” 右边的环节是相对单纯的,比较复杂的是 “Builder” 左边的操作过程。

NVIDIA Jetson Nano 2GB系列文章(64):将模型部署到Jetson设备图2

下图就上图 “NetworkDefinition” 比较深入的内容,TensorRT 提供 Caffe、uff 与 ONNX 三种解析器,其中 Caffe 框架已淡出市场、uff 仅支持 TensorFlow 框架,其他的模型就需要透过 ONNX 交换格式进行转换。

NVIDIA Jetson Nano 2GB系列文章(64):将模型部署到Jetson设备图3

这里以 TensorRT 所提供的 YOLOv3 范例来做范例,在安装 Jetpack 4.6 版本的 Jetson Nano 设备上进行体验,请进入到 TesnorRT 的 YOLOv3 范例中:

  1. cd  /usr/src/tensorrt/samples/python/yolov3_onnx
复制代码


根据项目的 README.md 指示,我们需要先为工作环境添加依赖库,不过由于部分库的版本关系,请先将 requirements.txt 的第 1、3 行进行以下的修改:

  1. numpy==1.19.4
  2. protobuf>=3.11.3
  3. onnx==1.10.1
  4. Pillow; python_version<"3.6"
  5. Pillow==8.1.2; python_version>="3.6"
  6. pycuda<2021.1
复制代码


然后执行以下指令进行安装:

  1. python3 -m pip install -r requirements.txt
复制代码


接下来需要先下载 download.yml 里面的三个文件,

  1. wget https://pjreddie.com/media/files/yolov3.weights
  2. wget https://raw.githubusercontent.com/pjreddie/darknet/f86901f6177dfc6116360a13cc06ab680e0c86b0/cfg/yolov3.cfg
  3. wget https://github.com/pjreddie/darknet/raw/f86901f6177dfc6116360a13cc06ab680e0c86b0/data/dog.jpg
复制代码


然后就能执行以下指令,将 yolov3.weights 转成 yolov3.onnx:

  1. ./yolov3_to_onnx.py  -d  /usr/src/tensorrt
复制代码


这个执行并不复杂,是因为 TensorRT 已经提供 yolov3_to_onnx.py 的 Python 代码,但如果将代码打开之后,就能感受到这 750+ 行代码要处理的内容是相当复杂,必须对 YOLOv3 的结构与算法有足够了解,包括解析 yolov3.cfg 的 788 行配置。想象一下,如果这个代码需要自行开发的话,这个难度有多高!

接下去再用下面指令,将 yolov3.onnx 转成 yolov3.trt 加速引擎:

  1. ./onnx_to_tensorrt.py  -d  /usr/src/tensorrt
复制代码


以上是从一般神经网络模型转成 TensorRT 加速引擎的标准步骤,这需要对所使用的神经网络的结构层、数学公式、参数细节等等都有相当足够的了解,才有能力将模型先转换成 ONNX 文件,这是技术门槛比较高的环节。

  • TAO 工具训练的模型转成 TensorRT 引擎的工具


用 TAO 工具所训练、修剪并汇出的 .etlt 文件,可以跳过上述过程,直接在推理设备上转换成 TensorRT 加速引擎,我们完全不需要了解神经网络的任何结构与算法内容,直接将 .etlt 文件复制到推理设备上,然后用 TAO 所提供的转换工具进行转换就可以。

这里总共需要执行三个步骤:

1、下载 tao-converter 工具,并调试环境:

请根据以下 Jetpack 版本,下载对应的 tao-converter 工具:

  1. Jetpack 4.4:https://developer.nvidia.com/cuda102-trt71-jp44-0
  2. Jetpack 4.5:https://developer.nvidia.com/cuda110-cudnn80-trt72-0
  3. Jetpack 4.6:https://developer.nvidia.com/jp46-20210820t231431z-001zip
复制代码


下载压缩文件后执行解压缩,就会生成 tao-converter 与 README.txt 两个文件,再根据 README.txt 的指示执行以下步骤:

(1) 安装 libssl-dev 库:

  1. sudo  apt  install  libssl-dev
复制代码


(2) 配置环境,请在 ~/.bashrc 最后面添加两行设置:
  1. export TRT_LIB_PATH=/usr/lib/aarch64-linux-gnu
  2. export TRT_INCLUDE_PATH=/usr/include/aarch64-linux-gnu
复制代码



(3) 将 tao-convert 变成可执行文件:

  1. source ~/.bashrc
  2. chmod  +x  tao-converter
  3. sudo  cp  tao-converter  /usr/local/bin
复制代码


2、安装 TensorRT 的 OSS (Open Source Software)

这是 TensorRT 的开源插件,项目在 https://github.com/NVIDIA/TensorRT,下面提供的安装说明非常复杂,我们将繁琐的步骤整理之后,就是下面的步骤:

  1. export  ARCH=请根据设备进行设置,例如Nano为53、NX为72、Xavier为62
  2. export  TRTVER=请根据系统的TensorRT版本,例如Jetpack 4.6为8.0.1
  3. git  clone  -b  $TRTVER  https://github.com/nvidia/TensorRT  TRToss
  4. cd  TRToss/
  5. git checkout  -b  $TRTVER  &&  git  submodule  update  --init  --recursive
  6. mkdir  -p  build  &&  cd  build
  7. cmake .. \
  8. -DGPU_ARCHS=$ARCH \
  9. -DTRT_LIB_DIR=/usr/lib/aarch64-linux-gnu/ \
  10. -DCMAKE_C_COMPILER=/usr/bin/gcc \
  11. -DTRT_BIN_DIR=`pwd`/out \
  12. -DTRT_PLATFORM_ID=aarch64 \
  13. -DCUDA_VERSION=10.2
  14. make  nvinfer_plugin  -j$(nproc)
  15. sudo  mv /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.8.0.1
  16.   /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.8.0.1.bak
  17. sudo cp libnvinfer_plugin.so.8.0.1  /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.8.0.1
复制代码


这样就能开始用 tao-converter 来将 .etlt 文件转换成 TensorRT 加速引擎了。

3、用 tao-converter 进行转换

(1)首先将 TAO 最终导出 (export) 的文件复制到 Jetson Nano 上,例如前面的实验中最终导出的文件 ssd_resnet18_epoch_080.etlt,

(2)在 Jetson Nano 上执行 TAO 的 ssd.ipynb 最后所提供的转换指令,如下:

  1. %set_env KEY=
  2. tao converter  -k  $KEY \
  3. -d  3,300,300 \
  4.     -o  NMS \
  5.     -e  ssd_resnet18_epoch_080.trt \  # 自己设定输出名称
  6.     -m  16 \
  7.     -t  fp16 \                      # 使用export时相同精度
  8.     -i  nchw \
  9.     ssd_resnet18_epoch_080.etlt
复制代码


这样就能生成在 Jetson Nano 上的 ssd_resnet18_epoch_080.trt 加速引擎文件,整个过程比传统方式要简便许多。



三春牛-创客  初级技神

发表于 2023-8-18 16:27:33

厉害厉害
回复

使用道具 举报

三春牛-创客  初级技神

发表于 2023-8-18 16:28:35

不错不错
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-8-18 16:34:11

厉害厉害
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-8-18 16:35:12

赞赞赞赞赞
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail