onnx
因项目需求要用到onnx-tensorrt,在安装过程中遇到不少坑,故这里简单记录一下,给大家一个参考。
首先是尝试在本机上直接安装,发现会出现版本对应不上一系列问题,故最终我还是选择在docker拉去一个镜像去配环境和使用。
1.docker
进入下面链接查找合适的cuda版docker
.md
# 拉取镜像
sudo docker pull nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04# 创建容器
# 其中,-v 指定一个路径是主机和docker共享的文件夹,
# xxx/trt_docker/表示在主机下的路径,/docker_data表示docker下的路径
sudo docker run --gpus all -it -v xxx/trt_docker/:/docker_data nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04 /bin/bash# 可以使用docker ps -a 查看创建的容器
2.tensorrt-8.4.5.1安裝
首先下载对应版本的安装包,我选择的是TensorRT-8.4.5.1,下载好的包放在xxx/trt_docker/下。
在安装tensorrt之前先安装python环境。
复制以下代码安装python
apt-get install -y --no-install-recommends \
python3 \
python3-pip \
python3-dev \
python3-wheel &&\
cd /usr/local/bin &&\
ln -s /usr/bin/python3 python &&\
ln -s /usr/bin/pip3 pip;
在.bashrc里配置环境
vim ~/.bashrc
export LD_LIBRARY_PATH=/解压TensorRT的路径/TensorRT-8.4.1.5/lib:$LD_LIBRARY_PATH
source ~/.bashrc
安装python版的tensorrt
cd TensorRT-8.4.1.5/python/
pip install tensorrt-8.4.1.5-cp38-none-linux_x86_64.whl
查看是否安装成功
import tensorrt
tensorrt.__version__
若报错
libnvinfer.so.8: cannot open shared object file: No such file or directory
# 在~/.bashrc里添加以下内容,即可解决
export PATH=/xxx/TensorRT-8.4.1.5/bin:$PATH
export LD_LIBRARY_PATH=/xxx/TensorRT-8.4.1.5/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=/xxx/TensorRT-8.4.1.5/lib:$LIBRARY_PATH
3.protobuf-3.9.2安装
cd protobuf-3.9.2/./autogen.sh
./configure '''
执行./autogen.sh,出错:
+ mkdir -p third_party/googletest/m4
+ autoreconf -f -i -Wall,no-obsolete
./autogen.sh: 37: autoreconf: not found解决:参考
按顺序执行下列代码:sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool若出现: E:Unable to locate package xxx
更新源 apt-get update
再执行上述命令
'''# 编译,安装
make -j 12
make -j 12 check
make install# 刷新共享库
ldconfig# 验证版本
protoc --version
libprotoc 3.9.2
4.onnx-tensorrt-8.4-EA安装
下载源码
.4-EA
git clone -b 8.4-EA git@github:onnx/onnx-tensorrt.git
修改CMakeLists.txt文件
添加6-9行
# SPDX-License-Identifier: Apache-2.0cmake_minimum_required(VERSION 3.13)
project(onnx2trt LANGUAGES CXX C)include_directories(/xxxx/TensorRT-8.4.1.5/include)
include_directories(/usr/local/cuda/include)
link_directories(/xxxx/TensorRT-8.4.1.5/lib)
set(TENSORRT_ROOT /xxxx/TensorRT-8.4.1.5)
set(ONNX2TRT_ROOT ${PROJECT_SOURCE_DIR})
下载onnx-1.8.0
=2
# 1.解压文件
tar -zxvf onnx-1.8.0.tar.gz# 2.将解压后的onnx文件夹下的内容复制到 /onnx-tensorrt-8.4-EA/third_party/onnx/下cd xxx/onnx-tensorrt-8.4-EA/third_party/onnx/# 编译
cmake ..
make
编译安装
mkdir build && cd buildcmake .. -DProtobuf_PROTOC_EXECUTABLE=-DTENSORRT_ROOT=xxx/TensorRT-8.4.1.5make -j12make install
安装python版本onnx和onnx-tensorrt
# 安装onnx
python -m pip install onnx==1.8.0# 安装onnx-tensorrt
# 进入onnx-tensorrt文件夹下
cd xxx/onnx-tensorrt-8.4-EA/# 执行命令
python3 setup.py install#在执行上述命令时可能的报错:
#1.ModuleNotFoundError: No module named 'pycuda'
pip install pycuda# 2.TypeError : Descriptors cannot not be created directly . If this call came from a _pb2.py file , your generated code is out of date and must be regenerated with protoc >=3.19.0. If you cannot immediately regenerate your protos , some othe r possible workarounds are :1. Downgrade the protobuf package to 3.20.x or lo wer .2. Set PROTOCOL BUFFERS PYTHON IMPLEMENTATION = python ( b ut this will use pure - Python parsing and will be much slower ).
pip install protobuf# 3.AttributeError: module 'numpy' has no attribute 'object'. `np.object` was a deprecated alias for the builtin `object`. To avoid this error in existing code, use `object` by itself. Doing this will not modify any behavior and is safe.
#numpy版本太高,降低版本
pip uninstall numpy
pip install numpy==1.23.4
至此,onnx-tensorrt安装成功。
python版推理使用
import onnx
import onnx_tensorrt.backend as backend
import numpy as npmodel = onnx.load("/path/to/model.onnx")
engine = backend.prepare(model, device='CUDA:1')
input_data = np.random.random(size=(32, 3, 224, 224)).astype(np.float32)
output_data = engine.run(input_data)[0]
print(output_data)
print(output_data.shape)
使用onnx2trt转engine
onnx2trt my_model.onnx -o my_engine.trt