Ubuntu下安装ONNX、ONNX-TensorRT、Protobuf和TensorRT

2023-12-16 16:45:29

一、引言

深度学习的发展推动了人工智能技术的进步,而高效的推理框架则是将这些先进的算法应用到实际场景中的关键。在这篇文章中,我们将详细介绍如何在Ubuntu环境下安装ONNX(Open Neural Network Exchange)、ONNX-TensorRT、Protobuf(Protocol Buffers)和TensorRT。

安装目标与背景

ONNX是一个开放的格式,用于表示深度学习模型,使得模型可以在不同的框架之间无缝地迁移。TensorRT是NVIDIA提供的高性能深度学习推理优化器和运行时,能够对模型进行极致优化,提高部署效率。而Protobuf则是一种轻便高效的结构化数据序列化方案,被广泛应用于通信协议、数据存储等领域。
我们的目标是搭建一个能够在Ubuntu环境下支持ONNX模型的高效推理平台。通过安装ONNX、ONNX-TensorRT、Protobuf和TensorRT,我们可以实现从模型构建、优化到部署的一站式流程。

推荐软件版本和硬件要求

为了确保安装过程顺利进行,我们需要满足以下基本条件:

  • 操作系统:Ubuntu 18.04及以上版本,我用的18.04
  • NVIDIA显卡驱动:网上查的至少需要450.57版本,根据情况定,我的是470版本
  • CUDA Toolkit:至少需要10.0版本,建议11.0及以上,我用的11.3
  • cuDNN:网上查的至少需要7.6版本,建议用8以上的版本,我用的8.9
  • Python环境:至少需要Python 3.6版本,建议3.8或3.9,我用的3.9

请注意,不同版本的软件可能存在兼容性问题,因此建议按照官方文档的要求选择合适的版本。
具体的环境安装和配置请参考网上的其它资料,这里不再详述。


二、安装onnx

这个直接pip安装就好,版本选择与tensorrt的版本对应,tensort8.0对应1.6.0,tensort8.6-GA对应1.13.1。

pip install onnx==1.13.1
# python的protobuf会自动安装,版本暂时不用管

源码还是需要下载的,但是用处不是在onnx的安装,而是为了下面的onnx-tensorrt的安装。

# 下载源码
git clone https://github.com/onnx/onnx.git
# 查看标签
git tag
# 切换版本
git checkout v1.13.1

三、安装protobuf

目前经过调试,v3.7.x是比较合适的,v3.8及以上的有些问题。有函数参数数量错误的风险。
在cmake配置的时候,注意要参考onnx的Readme.md里面的命令。

git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
# 切换版本
git checkout v3.7.1
# 验证是否切换成功
git branch
# 安装第三方库
git submodule update --init --recursive
# 编译
cd cmake
# 以下参考onnx的Readme.md修改
# 说明,库安装路径为/usr/local/lib, 安装动态库
cmake . -DCMAKE_INSTALL_LIBDIR=lib -Dprotobuf_BUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install

如果-DCMAKE_BUILD_TYPE=Debug,最后生成的库为libprotobufd.so


四、安装TensorRT

老版本有时会出现一些问题,目前选择tensorrt8.6-GA版本
TensorRT下载地址

目前我知道的有两种安装方法,分别介绍

下载源文件直接安装,我比较推荐

这种方法比较直接,就是复制bin, include, lib下面的文件相各自相应的目录。

  1. 首先下载TensorRT的源文件
wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/secure/8.6.1/tars/TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
  1. 复制相关文件
cd TensorRT-8.6.1.6
# 拷贝执行文件,头文件和库文件到系统目录,要分别写,因为这里面有软链接
# sudo cp -r bin include lib /usr/local # 这样写不行
sudo cp -r bin/* /usr/local/bin
sudo cp -r include/* /usr/local/include
sudo cp -r lib/* /usr/local/lib
  1. 根据版本安装python包
cd python
pip install tensorrt-8.6.1-cp3x-none-linux_x86_64.whl

使用deb文件安装

这个我没具体试过,但根据网上的资料综合来看,应该是可行的。
参考:TensorRT官方安装说明

  1. 下载deb文件
wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/secure/8.6.1/local_repos/nv-tensorrt-local-repo-ubuntu1804-8.6.1-cuda-11.8_1.0-1_amd64.deb
  1. 安装TensorRT包:
    打开终端并导航到包含.deb文件的目录。然后执行以下命令来安装TensorRT包:
sudo dpkg -i nv-tensorrt-local-repo-ubuntu1804-8.6.1-cuda-11.8_1.0-1_amd64.deb
  1. 添加NVIDIA包公钥:
    安装.deb包后,您需要添加NVIDIA的公钥。执行以下命令:
sudo apt-key add /var/nv-tensorrt-local-repo-ubuntu1804-8.6.1-cuda-11.8/7fa2af80.pub
  1. 更新软件包列表:
    更新您的APT软件包列表,以包含新添加的TensorRT仓库:
sudo apt-get update
  1. 安装TensorRT:
    现在,您可以安装TensorRT及其依赖项:
sudo apt-get install tensorrt
  1. 安装Python绑定(可选):
    如果您打算在Python中使用TensorRT,您还需要安装Python绑定。这通常通过安装python3-libnvinfer包完成:
sudo apt-get install python3-libnvinfer

感觉还是挺麻烦的,建议还是用第一种方法,这个仅供参考。


五、安装onnx-tensorrt

如果系统安装了protobuf-compiler,存在/usr/bin/protoc,容易造成混乱,通过修改环境变量或者直接sudo apt-get remove protobuf-compiler的方法删除原来的protoc,进而可以使用刚才安装的3.7.1版本的protobuf的protoc。

需要找出 /usr/bin/protoc 属于哪个软件包。可以使用 dpkg 命令来查询:

dpkg -S /usr/bin/protoc

这个命令会输出 /usr/bin/protoc 所属的软件包名称。这里应该是protobuf-compiler

这里的第三方库建议直接复制onnx源码。准确的说,就是将third_party目录下的onnx,直接替换为上面说的onnx源码,注意版本的切换。
注意,一是要和TensorRT的版本保持一致,二是在cmake进行构建的过程中要指定TensorRT的tar.gz文件解压后的目录,比如我一般放在$home/TensorRT-8.6.1.6。

git clone https://github.com/onnx/onnx-tensorrt.git
cd onnx-tensorrt
# 切换版本,这个要与安装的TensorRT的版本一致
git checkout v8.6-GA
# 验证是否切换成功
git branch
# 安装第三方库,也可以直接复制onnx源码
git submodule update --init --recursive
# 编译
mkdir build && cd build
# 一定要设计TensorRT根目录
cmake .. -DTENSORRT_ROOT=$home/TensorRT-8.6.1.6
make -j$(nproc)
# 安装
sudo make install

六、 解析onnx到tensorrt模型

这一部分简单介绍一下如何解析onnx到TensorRT模型。一般有库解析和源码解析两种方法,下面分别介绍。

库解析

这个比较直接,编译onnx-tensorrt之后写代码时直接链接库即可,不详述。

  1. 编译安装onnx-tensorrt
  2. 编译可执行文件时链接nvonnxparser

源码解析

这一部分介绍如何通过源码编译的方式将onnx模型转为TensorRT模型,这是我结合多方资料结合自己的实践精心总结的,本来想单独写个博客,但是内容过于偏实践,很多原理还不是很清楚,所以先把操作方法记录下来,希望对读者有所帮助。

  1. 复制onnx/onnx下的onnx-ml.proto和onnx-operators-ml.proto到工作目录下,并将两个文件的最后一行option optimize_for = LITE_RUNTIME;注释,将onnx-operators-ml.proto中的import "onnx/onnx-ml.proto";改为import "onnx-ml.proto";
  2. 用protoc解析这两个文件
protoc onnx-ml.proto --cpp_out=<output dir>
protoc onnx-operators-ml.proto --cpp_out=<output dir>
  1. 将生成的.cc文件改为.cpp文件
  2. 新建一个onnx_pb.h文件,里面加入#include "onnx-ml.pb.h"
  3. 将对应版本的onnx-tensorrt下的.cpp, .hpp, .h文件拷贝到工作目录。
  4. 删除getSupportedAPITest.cpp, onnx_trt_backend.cpp, main.cpp,这两个不删编译时可能是要报错的。还有三个文件common.hpp, onnx2trt_common.hpp, onnx2trt_runtime.hpp也被证明没什么用处,可以删除,但对成功编译没有影响。
  5. 将所有文件的ONNX_NAMESPACE替换为onnx。
  6. 将ImporterContext.hpp中的`#include “onnx/common/stl_backports.h”。
  7. 如果有其它情况根据报错信息调整,例如可能有一个日志地方错误,注释掉即可。
  8. 将这些文件与主文件一起进行编译

七、总结

本文介绍了如何在Ubuntu环境下安装onnx、onnx-tensorrt、Protobuf和TensorRT,并演示了如何将onnx模型解析到TensorRT模型。希望能帮助读者快速进入onnx和TensorRT的世界,为深度学习项目的部署提供帮助。

文章来源:https://blog.csdn.net/m0_51661400/article/details/130679941
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。