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

前面我们花了很多力气在 tao 上面训练模型,其最终目的就是要部署到推理设备上发挥功能。除了将模型训练过程进行非常大幅度的简化,以及整合迁移学习等功能之外,tao 还有一个非常重要的任务,就是让我们更轻松获得 tensorrt 加速引擎。
将一般框架训练的模型转换成 tensorrt 引擎的过程并不轻松,但是 tensorrt 所带来的性能红利又是如此吸引人,如果能避开麻烦又能享受成果,这是多么好的福利!
一般深度学习模型转成 tensorrt 引擎的流程
下图是将一般模型转成 tesnorrt 的标准步骤,在中间 “builder” 右边的环节是相对单纯的,比较复杂的是 “builder” 左边的操作过程。
下图就上图 “networkdefinition” 比较深入的内容,tensorrt 提供 caffe、uff 与 onnx 三种解析器,其中 caffe 框架已淡出市场、uff 仅支持 tensorflow 框架,其他的模型就需要透过 onnx 交换格式进行转换。
这里以 tensorrt 所提供的 yolov3 范例来做范例,在安装 jetpack 4.6 版本的 jetson nano 设备上进行体验,请进入到 tesnorrt 的 yolov3 范例中:
cd /usr/src/tensorrt/samples/python/yolov3_onnx ‍
根据项目的 readme.md 指示,我们需要先为工作环境添加依赖库,不过由于部分库的版本关系,请先将 requirements.txt 的第 1、3 行进行以下的修改:
numpy==1.19.4protobuf>=3.11.3onnx==1.10.1pillow; python_version=3.6pycuda<2021.1  
然后执行以下指令进行安装:
python3 -m pip install -r requirements.txt  
接下来需要先下载 download.yml 里面的三个文件,
wget https://pjreddie.com/media/files/yolov3.weights wget https://raw.githubusercontent.com/pjreddie/darknet/f86901f6177dfc6116360a13cc06ab680e0c86b0/cfg/yolov3.cfg wget https://github.com/pjreddie/darknet/raw/f86901f6177dfc6116360a13cc06ab680e0c86b0/data/dog.jpg   
然后就能执行以下指令,将 yolov3.weights 转成 yolov3.onnx:
./yolov3_to_onnx.py -d /usr/src/tensorrt  
这个执行并不复杂,是因为 tensorrt 已经提供 yolov3_to_onnx.py 的 python 代码,但如果将代码打开之后,就能感受到这 750+ 行代码要处理的内容是相当复杂,必须对 yolov3 的结构与算法有足够了解,包括解析 yolov3.cfg 的 788 行配置。想象一下,如果这个代码需要自行开发的话,这个难度有多高!
接下去再用下面指令,将 yolov3.onnx 转成 yolov3.trt 加速引擎:
./onnx_to_tensorrt.py -d /usr/src/tensorrt  
以上是从一般神经网络模型转成 tensorrt 加速引擎的标准步骤,这需要对所使用的神经网络的结构层、数学公式、参数细节等等都有相当足够的了解,才有能力将模型先转换成 onnx 文件,这是技术门槛比较高的环节。
tao 工具训练的模型转成 tensorrt 引擎的工具
用 tao 工具所训练、修剪并汇出的 .etlt 文件,可以跳过上述过程,直接在推理设备上转换成 tensorrt 加速引擎,我们完全不需要了解神经网络的任何结构与算法内容,直接将 .etlt 文件复制到推理设备上,然后用 tao 所提供的转换工具进行转换就可以。
这里总共需要执行三个步骤:
1、下载 tao-converter 工具,并调试环境:
请根据以下 jetpack 版本,下载对应的 tao-converter 工具:
jetpack 4.4:https://developer.nvidia.com/cuda102-trt71-jp44-0 jetpack 4.5:https://developer.nvidia.com/cuda110-cudnn80-trt72-0 jetpack 4.6:https://developer.nvidia.com/jp46-20210820t231431z-001zip  
下载压缩文件后执行解压缩,就会生成 tao-converter 与 readme.txt 两个文件,再根据 readme.txt 的指示执行以下步骤:
(1) 安装 libssl-dev 库:
sudo apt install libssl-dev  
(2) 配置环境,请在 ~/.bashrc 最后面添加两行设置:
export trt_lib_path=/usr/lib/aarch64-linux-gnuexport trt_include_path=/usr/include/aarch64-linux-gnu  
(3) 将 tao-convert 变成可执行文件:
source ~/.bashrcchmod +x tao-convertersudo  cp  tao-converter  /usr/local/bin  
2、安装 tensorrt 的 oss (open source software)
这是 tensorrt 的开源插件,项目在 https://github.com/nvidia/tensorrt,下面提供的安装说明非常复杂,我们将繁琐的步骤整理之后,就是下面的步骤:
export arch=请根据设备进行设置,例如nano为53、nx为72、xavier为62export trtver=请根据系统的tensorrt版本,例如jetpack 4.6为8.0.1git clone -b $trtver https://github.com/nvidia/tensorrt trtoss cd trtoss/git checkout -b $trtver && git submodule update --init --recursivemkdir -p build && cd buildcmake ..  -dgpu_archs=$arch  -dtrt_lib_dir=/usr/lib/aarch64-linux-gnu/  -dcmake_c_compiler=/usr/bin/gcc  -dtrt_bin_dir=`pwd`/out  -dtrt_platform_id=aarch64  -dcuda_version=10.2make nvinfer_plugin -j$(nproc)sudo  mv /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.8.0.1  /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.8.0.1.baksudo 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 最后所提供的转换指令,如下:
%set_env key=tao converter -k $key -d 3,300,300 -o nms -e ssd_resnet18_epoch_080.trt # 自己设定输出名称 -m 16 -t fp16 # 使用export时相同精度 -i nchw     ssd_resnet18_epoch_080.etlt  
这样就能生成在 jetson nano 上的 ssd_resnet18_epoch_080.trt 加速引擎文件,整个过程比传统方式要简便许多。
原文标题:nvidia jetson nano 2gb系列文章(64):将模型部署到jetson设备
文章出处:【微信公众号:nvidia英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。


晶圆制造业的特点
荣耀畅玩7A评测 首款支持人脸识别功能的百元机
鲁大师7月新机性能/流畅/久用榜:骁龙8 Gen2领先版亮相,性能跑分再破新高
三星Exynos 2100多核跑分突破4000
npu芯片有什么用
深度学习模型转成TensorRT引擎的流程
微雪电子人工智能开发套件简介
数字校准使自动化测试变得容易;校准常见问题
设计工业连接器时的7个注意事项
虹科案例丨 适用于苛刻石油和天然气应用的锤接头变送器解决方案
华为举办秋季全场景新品发布会:华为万物互联的全场景生态
静态开关基本原理图
最常见电线电缆答疑
友达光电将建6代OLED生产线!
软通动力以卓越的服务能力成为天翼云首批MSP战略合作伙伴
推陈出新 时钟同步技术的现状及发展
智能工业质检解决方案
小米MAX2什么时候上市?小米MAX2最新消息:小米Max2骁龙660版曝光,5月23发布狙击360N5S
助听器电池的种类和使用时间
一文读懂全球Micro OLED厂商