onnx-tensorrt-8.4-EA安装和使用

因项目需求要用到onnx-tensorrt,在安装过程中遇到不少坑,故这里简单记录一下,给大家一个参考。

首先是尝试在本机上直接安装,发现会出现版本对应不上一系列问题,故最终我还是选择在docker拉去一个镜像去配环境和使用。

1.docker

进入下面链接查找合适的cuda版docker
https://gitlab.com/nvidia/container-images/cuda/blob/master/doc/supported-tags.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安装

https://github.com/protocolbuffers/protobuf/releases

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

解决:参考 https://blog.youkuaiyun.com/newbeixue/article/details/125239047
按顺序执行下列代码:

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安装

下载源码
https://github.com/onnx/onnx-tensorrt/tree/8.4-EA

git clone -b 8.4-EA git@github.com:onnx/onnx-tensorrt.git

修改CMakeLists.txt文件
添加6-9行

# SPDX-License-Identifier: Apache-2.0

cmake_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
https://github.com/onnx/onnx/releases?page=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 build

cmake .. -DProtobuf_PROTOC_EXECUTABLE=-DTENSORRT_ROOT=xxx/TensorRT-8.4.1.5

make -j12

make 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 np

model = 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

参考

https://zhuanlan.zhihu.com/p/502098639

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值