大家好,又见面了,我是你们的朋友全栈君。
参考:TensorRT(1)-介绍-使用-安装 | arleyzhang
1 什么是TensorRT
一般的深度学习项目,训练时为了加快速度,会使用多 GPU 分布式训练。但在部署推理时,为了降低成本,往往使用单个 GPU 机器甚至嵌入式平台(比如 NVIDIA Jetson)进行部署,部署端也要有与训练时相同的深度学习环境,如 caffe,TensorFlow 等。由于训练的网络模型可能会很大(比如,inception,resnet 等),参数很多,而且部署端的机器性能存在差异,就会导致推理速度慢,延迟高。这对于那些高实时性的应用场合是致命的,比如自动驾驶要求实时目标检测,目标追踪等。所以为了提高部署推理的速度,出现了很多轻量级神经网络,比如 squeezenet,mobilenet,shufflenet 等。基本做法都是基于现有的经典模型提出一种新的模型结构,然后用这些改造过的模型重新训练,再重新部署。
而 TensorRT 则是对训练好的模型进行优化。 TensorRT 就只是推理优化器。当你的网络训练完之后,可以将训练模型文件直接丢进 TensorRT中,而不再需要依赖深度学习框架(Caffe,TensorFlow 等),如下:
可以认为 TensorRT 是一个只有前向传播的深度学习框架,这个框架可以将 Caffe,TensorFlow 的网络模型解析,然后与 TensorRT 中对应的层进行一一映射,把其他框架的模型统一全部转换到 TensorRT 中,然后在 TensorRT 中可以针对 NVIDIA 自家 GPU 实施优化策略,并进行部署加速。
如果想了解更多关于 TensorRT 的介绍,可参考官网介绍
2 TensorRT安装
TensorRT 的安装方式很简单,只需要注意一些环境的依赖关系就可以,我们以 TensorRT 5.0.4 版本为例,参考官网安装教程,这里简单总结一下步骤
TensorRT 支持的环境和 Python 版本如表所示(来源)
2.1 环境确认
- 确认 CUDA 版本是 9.0 或者 10.0,可通过运行 nvcc -V 指令来查看 CUDA,如果不是 9.0 以上,则需要先把 CUDA 版本更新一下
- cudnn 版本是 7.3.1,如果不满足要求,按照《Linux之cudnn升级方法》进行升级
- 需安装有 TensorFlow,uff模块需要
2.2 安装 pycuda
如果要使用 Python 接口的 TensorRT,则需要安装 Pycuda
代码语言:javascript复制pip install 'pycuda>=2017.1.1'
我在 ubuntu 16.04 上安装时报错如下
ERROR: Could not build wheels for pycuda which use PEP 517 and cannot be installed directly
目前还没找到解决方法,但在 ubuntu18.04 上安装时没问题
2.3 下载安装包
- 进入下载链接
- 点击 Download Now(需要登录英伟达账号,没有的注册一个)
- 选择下载的版本
- 完成问卷调查
- 选择同意协议
- 根据自己的系统版本和 CUDA 版本,选择安装包,如图所示(如果是完整安装,建议选择Tar File Install Packages,这样可以自行选择安装位置)
2.4 安装指令
安装时只需要把压缩文件解压,相应的库文件拷贝到系统路径下即可
代码语言:javascript复制#在home下新建文件夹,命名为tensorrt_tar,然后将下载的压缩文件拷贝进来解压
tar xzvf TensorRT-5.0.2.6.Ubuntu-16.04.4.x86_64-gnu.cuda-9.0.cudnn7.3.tar
#解压得到TensorRT-5.0.2.6的文件夹,将里边的lib绝对路径添加到环境变量中
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lthpc/tensorrt_tar/TensorRT-5.0.2.6/lib
为了避免其它软件找不到 TensorRT 的库,建议把 TensorRT 的库和头文件添加到系统路径下
代码语言:javascript复制# TensorRT路径下
sudo cp -r ./lib/* /usr/lib
sudo cp -r ./include/* /usr/include
如果要使用 python 版本,则使用 pip 安装,执行下边的指令
代码语言:javascript复制# 安装TensorRT
cd TensorRT-5.0.2.6/python
pip install tensorrt-5.0.2.6-py2.py3-none-any.whl
# 安装UFF,支持tensorflow模型转化
cd TensorRT-5.0.2.6/uff
pip install uff-0.5.5-py2.py3-none-any.whl
# 安装graphsurgeon,支持自定义结构
cd TensorRT-5.0.2.6/graphsurgeon
pip install graphsurgeon-0.3.2-py2.py3-none-any.whl
很多人安装某些版本的时候会报错,比如
ERROR: tensorrt-6.0.1.5-cp36-none-linux_x86_64.whl is not a supported wheel on this platform.
这个是因为自己 python 版本不对,输入 pip –version 来查看 python 版本是否是自己想象中的版本,不对的话切换一下
============= 20200618更新 ===============
为了避免安装时各种问题,我们也可以使用 deb 包的方式安装,即在 2.3 步骤中选择自己系统对应的版本,然后使用如下指令安装
代码语言:javascript复制# 首先根据自己下载的版本填写os和tag变量
# 我下载的版本是 nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.0.0.11-ga-20191216_1-1_amd64.deb
# 得到如下值
os="ubuntu1804"
tag="cuda10.2-trt7.0.0.11-ga-20191216"
sudo dpkg -i nv-tensorrt-repo-${os}-${tag}_1-1_amd64.deb
sudo apt-key add /var/nv-tensorrt-repo-${tag}/7fa2af80.pub
sudo apt-get update
sudo apt-get install tensorrt
sudo apt-get install python-libnvinfer-dev # for python2
sudo apt-get install python3-libnvinfer-dev # for python3
sudo apt-get install uff-converter-tf # for tensorflow
安装完之后运行下边指令
代码语言:javascript复制dpkg -l | grep TensorRT
输出如下,表明安装成功
代码语言:javascript复制ii graphsurgeon-tf 7.1.0-1 cuda10.2 amd64 GraphSurgeon for TensorRT package
ii libnvinfer-bin 7.1.0-1 cuda10.2 amd64 TensorRT binaries
ii libnvinfer-dev 7.1.0-1 cuda10.2 amd64 TensorRT development libraries and headers
ii libnvinfer-doc 7.1.0-1 cuda10.2 all TensorRT documentation
ii libnvinfer-plugin-dev 7.1.0-1 cuda10.2 amd64 TensorRT plugin libraries
ii libnvinfer-plugin7 7.1.0-1 cuda10.2 amd64 TensorRT plugin libraries
ii libnvinfer-samples 7.1.0-1 cuda10.2 all TensorRT samples
ii libnvinfer7 7.1.0-1 cuda10.2 amd64 TensorRT runtime libraries
ii libnvonnxparsers-dev 7.1.0-1 cuda10.2 amd64 TensorRT ONNX libraries
ii libnvonnxparsers7 7.1.0-1 cuda10.2 amd64 TensorRT ONNX libraries
ii libnvparsers-dev 7.1.0-1 cuda10.2 amd64 TensorRT parsers libraries
ii libnvparsers7 7.1.0-1 cuda10.2 amd64 TensorRT parsers libraries
ii python-libnvinfer 7.1.0-1 cuda10.2 amd64 Python bindings for TensorRT
ii python-libnvinfer-dev 7.1.0-1 cuda10.2 amd64 Python development package for TensorRT
ii python3-libnvinfer 7.1.0-1 cuda10.2 amd64 Python 3 bindings for TensorRT
ii python3-libnvinfer-dev 7.1.0-1 cuda10.2 amd64 Python 3 development package for TensorRT
ii tensorrt 7.1.0.x-1 cuda10.2 amd64 Meta package of TensorRT
ii uff-converter-tf 7.1.0-1 cuda10.2 amd64 UFF converter for TensorRT package
2.5 环境测试
运行 python 测试,导入模块不报错就表明安装正确
注意:导入 uff 的时候需要安装 tensorflow 模块,tensorflow 版本要与 cuda 版本对应,比如 cuda9 要对应 tensorflow1.12 及以下版本,以上版本需要 cuda10,具体参考官网
如果导入 TensorRT 报错如下,则是因为 python 版本不对,应根据 2.1 节上边的那个表调整自己的 python 版本
Traceback (most recent call last): File “<stdin>”, line 1, in <module> File “/home/xxx/anaconda3/lib/python3.6/site-packages/tensorrt/__init__.py”, line 1, in <module> from .tensorrt import * ImportError: /home/xxx/anaconda3/lib/python3.6/site-packages/tensorrt/tensorrt.so: undefined symbol: _Py_ZeroStruct
安装后会在 /usr/src 目录下生成一个 TensorRT 文件夹,里面包含 bin,data,python,samples 四个文件夹,samples 文件夹中是官方例程的源码;data,python 文件中存放官方例程用到的资源文件,比如 caffemodel 文件,TensorFlow 模型文件,一些图片等;bin 文件夹用于存放编译后的二进制文件。
============= 20200618更新 ===============
也可以使用如下方法测试
代码语言:javascript复制sudo cp -r /usr/src/tensorrt/ ~/
cd ~/tensorrt/samples
sudo make
cd ../bin
./sample_int8 mnist
3 使用流程
在 /TensoRT-5.0.2.6/samples/python 文件夹下有很多 python 的例子,我们以第一个 end_to_end_tensorflow_mnist 的例子为例,描述 TensorRT 的使用流程,在 README.md 文件里也说得很明白了
3.1 安装依赖
需要安装好 numpy、Pillow、pycuda、tensorflow 等环境,如果都有可以跳过
3.2 生成pb文件
代码语言:javascript复制mkdir models
python model.py
运行 model.py 后,会下载数据 mnist.npz,并开始训练,完成后在 models 文件夹下生成 lenet5.pb 文件,如果自己已经训练得到 pb 文件,上述过程可以跳过
3.3 格式转化
要将 tensorflow 的 pb 文件转化为 uff 格式的文件,首先找到 convert_to_uff 文件,看自己用的是哪个版本的 python,如果是 python3,则在 /usr/lib/python3.5/dist-packages/uff/bin 文件夹下,如果是 python2,则在 /usr/lib/python2.7/dist-packages/uff/bin 文件夹下
我们在终端中进入 end_to_end_tensorflow_mnist,运行以下指令
代码语言:javascript复制python3.5 /usr/lib/python3.5/dist-packages/uff/bin/convert_to_uff.py --input_file models/lenet5.pb
则会在 models 文件夹中生成 lenet5.uff 文件
需要注意的是:该转化过程只支持在 x86 平台上实现,如果想在 TX2 等嵌入式平台上使用 TensorRT ,需要先在 x86 平台上将 pb 模型转化为 uff 文件,然后再拷贝到 TX2 上使用
3.4 运行文件
运行 sample.py 文件,得到如下输出,表明可完整的使用 TensorRT
4 使用自己的模型
前边 3 步相当于是环境的配置,当然还不够,我们需要的是可以转化并运行我们自己的模型,达到加速的效果,因此接下来对相关的工作进行总结,具体转换参考《TX2之TensorRT加速TensorFlow目标检测模型》
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128721.html原文链接:https://javaforall.cn