安装tensorRT之后,官网有很多小的sample,也就是使用的案例,可以按照教程运行一下这些案例来入门如何使用tensorRT。我再使用其自带的sample时,发现也有一些小问题,这里记录一下运行的过程和遇到的一些问题以及解决方法。
环境:
docker中的Ubuntu18.04(虽然是容器,但是这里使用的操作和普通机器也没有区别,使用普通机器的也可以参考)
conda 10.0.130.
tensorRT6.0.15-cuda10.0
tensorflow-gpu 1.14
1.首先是sample的介绍
https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-601/tensorrt-sample-support-guide/index.html
我安装的是tensorRT6.0.1.5,这里是官网6.0.1的sample介绍。官网介绍上说使用tnsorRT时 “网络可以直接从NVCaffe导入,也可以通过UFF或ONNX格式从其他框架导入。也可以通过实例化各个图层并直接设置参数和权重,使用C ++或Python API以编程方式创建它们。”
我的理解是,一般会将各种框架如tensorflow训练得到的模型存储处理后,转换为tensorRT规定的几种格式,然后将转换后的文件使用tensorRT解析推理。这些案例就是各种不同的导入文件,不同框架的使用的sample,可以用它来学习如何使用tensorRT。
这里我打算用tensorflow使用tensorrt,因此选择的sample是26,一个使用tensorflow训练的小网络,从训练模型到存储模型,到转换存储文件再使用tensorRT推理的sample。
“Hello World” For TensorRT Using TensorFlow And Python | end_to_end_tensorflow_mnist | An end-to-end sample that trains a model in TensorFlow and Keras, freezes the model and writes it to a protobuf file, converts it to UFF, and finally runs inference using TensorRT. |
可以看到这个sample是在安装tensorRT时已经下载过了,位置在 /usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist
从里面的readme文件中可以看到使用介绍。
2.end_to_end_tensorflow_mnist
按照readme里的介绍理解sample的内容,以及如何执行文件。执行步骤如下:
2.0 检查是否安装好所有需要的包
在这个sample文件夹中有requirements.txt文件,文件中是需要安装的python包的名字。使用pip list 检查下自己是否安装了这里需要的包,如果有哪个包没有,pip安装即可。
这里稍微注意一下,readme里说可以用指令python3 -m pip install -r requirements.txt安装所有需要的依赖,但是如果这么安装的话,会自动安装最新版本的依赖。tensorflow-gpu一般大家都已经装好,如果这么安装,新版本可能会覆盖你之前安装版本。
之前安装tensorRT的时候有说明,如果要使用python3 需要 sudo apt-get install python3-libnvinfer-dev
如果要使用tensorflow,需要 sudo apt-get install uff-converter-tf
如果想运行需要ONNX graphsurgeon的示例,或者为自己的项目使用Python模块,需要 sudo apt-get install onnx-graphsurgeon
忘记自己是否装了的,可以用指令 dpkg -l | grep TensorRT 查看
这里根据自己的需求确认自己装了这些包,反正pip安装很方便,建议都装了。
2.1.首先在文件夹下使用指令创建文件夹models,用于存储训练结果。
root@yf-jupyter-2pkqf:/usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist# mkdir models
2.2 然后运行model.py训练模型存储模型
root@yf-jupyter-2pkqf:/usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist# python model.py
执行后可以看到训练的结果,acc值等。
训练完成之后可以在models文件夹下看到训练并经过tensorRT frozen的模型文件 lenet5.pb。看完记得回到end_to_end_tensorflow_mnist目录下。
root@yf-jupyter-2pkqf:/usrc/tensorrt/samples/python/end_to_end_tensorflow_mnist# cd models
root@yf-jupyter-2pkqf:/usrc/tensorrt/samples/python/end_to_end_tensorflow_mnist/models# ls
lenet5.pb
2.3 转换pb文件为uff文件
使用指令convert-to-uff models/lenet5.pb 将pb文件转换为uff文件。
root@yf-jupyter-2pkqf:/usrc/tensorrt/samples/python/end_to_end_tensorflow_mnist/models# convert-to-uff models/lenet5.pb
bash: convert-to-uff: command not found
这里出现错误显示command not found。这里之前已经使用指令sudo apt-get install uff-converter-tf 安装了包,但是显示没有这个命令。
这里参照https://forums.developer.nvidia.com/t/convert-to-uff-command-not-found/116782解决。执行以下指令
UFF_PATH="$(python -c 'import uff; print(uff.__path__[0])')"
chmod +x ${UFF_PATH}/bin/convert_to_uff.py
ln -sf ${UFF_PATH}/bin/convert_to_uff.py /usr/local/bin/convert-to-uff
完成后就没有这个问题了。这时再执行上面的命令,就会将pb文件转换为uff文件。可以在models文件夹下面看到。看完记得回到end_to_end_tensorflow_mnist目录下。
root@yf-jupyter-2pkqf:/usrc/tensorrt/samples/python/end_to_end_tensorflow_mnist# cd models
root@yf-jupyter-2pkqf:/usrc/tensorrt/samples/python/end_to_end_tensorflow_mnist/models# ls
lenet5.pb lenet5.uff
2.4 执行sample.py文件
然后python运行sample.py文件。报错Could not find 2.pgm. Searched in data paths: ['/usrc/tensorrt/data/mnist']
root@yf-jupyter-2pkqf:/usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist# python sample.py
Traceback (most recent call last):
File "sample.py", line 112, in <module>
main()
File "sample.py", line 103, in main
case_num = load_normalized_test_case(data_paths, pagelocked_buffer=inputs[0].host)
File "sample.py", line 87, in load_normalized_test_case
[test_case_path] = common.locate_files(data_paths, [str(case_num) + ".pgm"])
File "/usr/src/tensorrtmples/python/end_to_end_tensorflow_mnist/../common.py", line 129, in locate_files
raise FileNotFoundError("Could not find {:}. Searched in data paths: {:}".format(filename, data_paths))
FileNotFoundError: Could not find 2.pgm. Searched in data paths: ['/usr/src/tensorrt/data/mnist']
这里的解决方法参照https://github.com/NVIDIA/TensorRT/issues/165 运行 generate_pgms.py 生成缺的这个文件。
root@yf-jupyter-2pkqf:/usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist# cd /usr/src/tensorrt/data/mnist
root@yf-jupyter-2pkqf:/usr/src/tensorrt/data/mnist# ls
LegacyCalibrationTable generate_pgms.py lenet5_custom_pool.uff mnist.caffemodel mnist_lenet.caffemodel mnistgie.wts
README.md lenet5.uff lenet5_custom_pool.uff.txt mnist.onnx mnist_mean.binaryproto
deploy.prototxt lenet5.uff.txt lenet5_mnist_frozen.pb mnist.prototxt mnistapi.wts
root@yf-jupyter-2pkqf:/usr/src/tensorrt/data/mnist# python generate_pgms.py
Traceback (most recent call last):
File "generate_pgms.py", line 48, in <module>
main()
File "generate_pgms.py", line 36, in main
data = load_mnist_data(args.dataset)
File "generate_pgms.py", line 9, in load_mnist_data
with open(filepath, "rb") as f:
FileNotFoundError: [Errno 2] No such file or directory:'/usr/src/tensorrt/data/mnist/train-images-idx3-ubyte'
然后又会报错, No such file or directory:'/usr/src/tensorrt/data/mnist/train-images-idx3-ubyte'。
这里参照https://github.com/carpedm20/DCGAN-tensorflow/issues/196 解决。
Go to here
https://github.com/Manuel4131/GoMNIST/tree/master/data
and download the mnist data.
Copy the mnist data to./data/mnist/
(If the directory doesn't exist, create by yourself.)
(Usegzip -d
command to uncompress the data first)
在https://github.com/Manuel4131/GoMNIST/tree/master/data
上下载文件train-images-idx3-ubyte.gz 和 train-labels-idx1-ubyte.gz 上传到目录/usr/src/tensorrt/data/mnist/ 并用gzip -d 指令解压。
root@yf-jupyter-2pkqf:~# cp train-images-idx3-ubyte.gz /usr/src/tensorrt/data/mnist/
root@yf-jupyter-2pkqf:~# cp train-labels-idx1-ubyte.gz /usr/src/tensorrt/data/mnist/
root@yf-jupyter-2pkqf:~# cd /usr/src/tensorrt/data/mnist/
root@yf-jupyter-2pkqf:/usr/src/tensorrt/data/mnist# ls
LegacyCalibrationTable lenet5.uff lenet5_mnist_frozen.pb mnist_lenet.caffemodel train-images-idx3-ubyte.gz
README.md lenet5.uff.txt mnist.caffemodel mnist_mean.binaryproto train-labels-idx1-ubyte.gz
deploy.prototxt lenet5_custom_pool.uff mnist.onnx mnistapi.wts
generate_pgms.py lenet5_custom_pool.uff.txt mnist.prototxt mnistgie.wts
root@yf-jupyter-2pkqf:/usr/src/tensorrt/data/mnist# gzip -d train-images-idx3-ubyte.gz
root@yf-jupyter-2pkqf:/usr/src/tensorrt/data/mnist# gzip -d train-labels-idx1-ubyte.gz
此时再执行python generate_pgms.py 就能成功了。
解决完后回到/usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist 目录下执行sample.py文件就能看到使用tensorRT做了一次推理的结果了
root@yf-jupyter-2pkqf:/usr/src/tensorrt/data/mnist# cd /usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist/
root@yf-jupyter-2pkqf:/usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist# ls
README.md model.py models requirements.txt sample.py
root@yf-jupyter-2pkqf:/usr/src/tensorrt/samples/python/end_to_end_tensorflow_mnist# python sample.py
Test Case: 8
Prediction: 8