深度学习的发展推动了人工智能技术的进步,而高效的推理框架则是将这些先进的算法应用到实际场景中的关键。在这篇文章中,我们将详细介绍如何在Ubuntu环境下安装ONNX(Open Neural Network Exchange)、ONNX-TensorRT、Protobuf(Protocol Buffers)和TensorRT。
ONNX是一个开放的格式,用于表示深度学习模型,使得模型可以在不同的框架之间无缝地迁移。TensorRT是NVIDIA提供的高性能深度学习推理优化器和运行时,能够对模型进行极致优化,提高部署效率。而Protobuf则是一种轻便高效的结构化数据序列化方案,被广泛应用于通信协议、数据存储等领域。
我们的目标是搭建一个能够在Ubuntu环境下支持ONNX模型的高效推理平台。通过安装ONNX、ONNX-TensorRT、Protobuf和TensorRT,我们可以实现从模型构建、优化到部署的一站式流程。
为了确保安装过程顺利进行,我们需要满足以下基本条件:
请注意,不同版本的软件可能存在兼容性问题,因此建议按照官方文档的要求选择合适的版本。
具体的环境安装和配置请参考网上的其它资料,这里不再详述。
这个直接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
目前经过调试,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。
老版本有时会出现一些问题,目前选择tensorrt8.6-GA版本
TensorRT下载地址
目前我知道的有两种安装方法,分别介绍
这种方法比较直接,就是复制bin, include, lib下面的文件相各自相应的目录。
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
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
cd python
pip install tensorrt-8.6.1-cp3x-none-linux_x86_64.whl
这个我没具体试过,但根据网上的资料综合来看,应该是可行的。
参考:TensorRT官方安装说明
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
sudo dpkg -i nv-tensorrt-local-repo-ubuntu1804-8.6.1-cuda-11.8_1.0-1_amd64.deb
sudo apt-key add /var/nv-tensorrt-local-repo-ubuntu1804-8.6.1-cuda-11.8/7fa2af80.pub
sudo apt-get update
sudo apt-get install tensorrt
sudo apt-get install python3-libnvinfer
感觉还是挺麻烦的,建议还是用第一种方法,这个仅供参考。
如果系统安装了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模型,这是我结合多方资料结合自己的实践精心总结的,本来想单独写个博客,但是内容过于偏实践,很多原理还不是很清楚,所以先把操作方法记录下来,希望对读者有所帮助。
option optimize_for = LITE_RUNTIME;
注释,将onnx-operators-ml.proto中的import "onnx/onnx-ml.proto";
改为import "onnx-ml.proto";
protoc onnx-ml.proto --cpp_out=<output dir>
protoc onnx-operators-ml.proto --cpp_out=<output dir>
#include "onnx-ml.pb.h"
。本文介绍了如何在Ubuntu环境下安装onnx、onnx-tensorrt、Protobuf和TensorRT,并演示了如何将onnx模型解析到TensorRT模型。希望能帮助读者快速进入onnx和TensorRT的世界,为深度学习项目的部署提供帮助。