目录
- 前言
- 1. ONNX解析器更新
- 总结
前言
杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。
本次课程学习 tensorRT 基础-从下载 onnx-tensorrt 到配置好并运行起来
课程大纲可看下面的思维导图
1. ONNX解析器更新
这节课我们来学习 onnx 解析器更新
这里我们以实际操作来更新下 onnx 解析器,从网上下载并使用,通过本节课程使得自己可以根据需求来更新它
onnx 解析器地址:https://github.com/onnx/onnx-tensorrt
tensorRT 是跟 onnx 解析器挂钩的,因此要版本匹配,先看下 tensorRT 是什么版本。我们可以进入到 tensorRT 的安装目录的 include 文件夹下有一个 NvInferVersion.h
,将其打印出来,如下图所示:
从上图可知博主的 tensorRT 版本为 8.4.1,所以我们选择 onnx-tensorrt-8.4-GA 版本,它有一个 third_party 第三方库,打开其实就是 onnx,就是一个套娃,我们知道 onnx-tensorrt 依赖自 onnx 就行了
我们往下翻可以看到其安装要求,如下所示,看自己对应的软件符不符合要求即可
因此我们把它下载下来后就去使用它,解压过后删除一些不必要的文件,执行 make run 后出现如下错误:
那是否我们必须去下载 onnx 第三方库呢?其实不然,我们可以去 官网 查看它具体内容,它其实就是在包含 onnx-ml.pb.h,那这个文件大家应该还有印象,它就是 onnx-ml.proto 所生成的东西
那 onnx-ml.proto 和 onnx-ml.proto3 两者我们是去选择前者,proto3 问题一般多,那我们把 onnx-ml.proto 它的代码整个复制下来,那注意这里有个坑,经验之举,在文件最后我们应该屏蔽 option optimize_for = LITE_RUNTIME;
否则开启后它不再依赖 protobuf 而是依赖 protobuf-lite.so
接下来就要利用 protoc 这个工具去编译 onnx-ml.proto,如下图所示:
编译成功了,我们把编译好的文件移动到 src/onnx 文件夹下,然后新建一个 onnx_pb.h 其内容如下:
#ifndef ONNX_PB_H
#define ONNX_PB_H
#include "onnx-ml.pb.h"
#endif // ONNX_PB_H
由于 Makefile 里面编译的 cpp,它不认识 cc 代码,因此要将 onnx-ml.pb.cc 修改为 onnx-ml.pb.cpp,再执行下 make run
我们来看下 common/stl_bakcports.h 官网 内容,它没有一些特别的依赖,那我们其实并不太需要它,因此我们把它屏蔽掉,再执行下 make run
找不到 onnx 解析器,因为我们文件夹名字换了,不再是 onnx-tensorrt 而是 onnx-tensorrt-8.4-GA,修改下再执行 make run,出现如下错误:
这个时候就来了一个非常经典的错误,叫作 ONNX_NAMESPACE,它想在 ONNX_NAMESPACE 下面使用 TensorProto_DataType,那我们在 onnx-ml.pb.h 中可以发现 TensorProto_DataType 它属于的命名空间是 onnx 而不是 ONNX_NAMESPACE,那我们就可以将其替换 onnx,那为什么会知道要替换呢,其实是 onnx-tensorrt 的 CMakeLists.txt 也会帮我们做这么一件事情,那这里我们其实是手动实现的
注意替换的时候选择的是 src 底下的文件,替换完成后再执行下 make run,正常来说就会成功,但是博主依旧遇到了问题如下:
博主将 ImporterContex.hpp 中 112 行报错的内容替换成如下内容:
public:
ImporterContext(nvinfer1::INetworkDefinition* network, nvinfer1::ILogger* logger)
: mNetwork(network)
, mLogger(logger)
// , mErrorWrapper(onnx::make_unique<ErrorRecorderWrapper>(mNetwork, logger))
, mErrorWrapper(nullptr)
再次执行 make run 之后依旧存在问题如下:
根据错误提示博主将 Makefile 文件中的 cpp 标准修改为了 c++14,再执行 make run
终于成功了,不容易吖😂
那其实还有一个 onnx-operator-ml.proto 文件,它其实是一个扩展算子,看起来也没有必要,
总结
本节课程带我们从零开始,从下载 onnx-tensorrt 代码到配置运行起来,整个过程就是在不断的报错不断的解决。我感觉这种解决问题的方式更加值得去学习,同时从源码编译可以更加满足我们定制化的需求,毕竟你想怎么修改就怎么修改,你想写插件直接在源码中按照要求写好编译就行了,那下节课我们就会讲解关于插件的编写。