Win10系统C++将ONNX转换为TensorRT

文章目录

  • 先决条件
  • 下载TensorRT
  • Debug模式
    • 1. 创建新项目
    • 2. 复制TensorRT文件至CUDA
    • 3. 创建onnx2TensorRT函数
    • 4. 设置属性
      • 4.1. 设置属性 --- 包含目录
      • 4.2. 设置属性 --- 库目录
      • 4.3. 设置属性 --- 链接器
    • 5. 创建模型文件夹
    • 6. 运行
    • 7. 问题 --- 缺少 zlibwapi.dll 文件
    • 8. 生成engine文件
  • Release模式
    • 点击,更换为Release
    • 重新配置属性
  • 结束。

先决条件

如果还没有安装CUDA和CUDNN,请参考这批文章:
文章链接:https://blog.csdn.net/qq_43522163/article/details/125881611?spm=1001.2014.3001.5502
我的CUDA版本:11.3
我的CUDNN版本:8.4.1

下载TensorRT

建议下载GA版本(正式版本),链接:https://developer.nvidia.com/tensorrt
我下载的8.4.1.5版本,下载完成后解压

Win10系统C++将ONNX转换为TensorRT_第1张图片
解压后可以看到这三个文件夹

Win10系统C++将ONNX转换为TensorRT_第2张图片

Debug模式

1. 创建新项目

Win10系统C++将ONNX转换为TensorRT_第3张图片

2. 复制TensorRT文件至CUDA

lib中的dll文件复制到 …\NVIDIA GPU Computing Toolkit\CUDA\v11.3\bin(这是我的路径)

Win10系统C++将ONNX转换为TensorRT_第4张图片

Win10系统C++将ONNX转换为TensorRT_第5张图片

3. 创建onnx2TensorRT函数

当前是Debug模式,将代码copy进去,这时出现错误(红色波浪线)不用管。

Win10系统C++将ONNX转换为TensorRT_第6张图片

#include 
#include 
#include "NvInfer.h"
#include "NvOnnxParser.h"

// 实例化记录器界面。捕获所有警告消息,但忽略信息性消息
class Logger : public nvinfer1::ILogger
{
    void log(Severity severity, const char* msg) noexcept override
    {
        // suppress info-level messages
        if (severity <= Severity::kWARNING)
            std::cout << msg << std::endl;
    }
} logger;


void ONNX2TensorRT(const char* ONNX_file, std::string save_ngine)
{
    // 1.创建构建器的实例
    nvinfer1::IBuilder* builder = nvinfer1::createInferBuilder(logger);

    // 2.创建网络定义
    uint32_t flag = 1U << static_cast<uint32_t>(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
    nvinfer1::INetworkDefinition* network = builder->createNetworkV2(flag);

    // 3.创建一个 ONNX 解析器来填充网络
    nvonnxparser::IParser* parser = nvonnxparser::createParser(*network, logger);

    // 4.读取模型文件并处理任何错误
    parser->parseFromFile(ONNX_file, static_cast<int32_t>(nvinfer1::ILogger::Severity::kWARNING));
    for (int32_t i = 0; i < parser->getNbErrors(); ++i)
    {
        std::cout << parser->getError(i)->desc() << std::endl;
    }

    // 5.创建一个构建配置,指定 TensorRT 应该如何优化模型
    nvinfer1::IBuilderConfig* config = builder->createBuilderConfig();

    // 6.设置属性来控制 TensorRT 如何优化网络
    // 设置内存池的空间
    config->setMemoryPoolLimit(nvinfer1::MemoryPoolType::kWORKSPACE, 16 * (1 << 20));
    // 设置低精度   注释掉为FP32
    if (builder->platformHasFastFp16())
    {
        config->setFlag(nvinfer1::BuilderFlag::kFP16);
    }

    // 7.指定配置后,构建引擎
    nvinfer1::IHostMemory* serializedModel = builder->buildSerializedNetwork(*network, *config);

    // 8.保存TensorRT模型
    std::ofstream p(save_ngine, std::ios::binary);
    p.write(reinterpret_cast<const char*>(serializedModel->data()), serializedModel->size());

    // 9.序列化引擎包含权重的必要副本,因此不再需要解析器、网络定义、构建器配置和构建器,可以安全地删除
    delete parser;
    delete network;
    delete config;
    delete builder;

    // 10.将引擎保存到磁盘,并且可以删除它被序列化到的缓冲区
    delete serializedModel;
}


void exportONNX(const char* ONNX_file, std::string save_ngine)
{
    std::ifstream file(ONNX_file, std::ios::binary);
    if (!file.good())
    {
        std::cout << "Load ONNX file failed! No file found from:" << ONNX_file << std::endl;
        return ;
    }

    std::cout << "Load ONNX file from: " << ONNX_file << std::endl;
    std::cout << "Starting export ..." << std::endl;

    ONNX2TensorRT(ONNX_file, save_ngine);

    std::cout << "Export success, saved as: " << save_ngine << std::endl;

}


int main(int argc, char** argv)
{
    // 输入信息
    const char* ONNX_file  = "../weights/test.onnx";
    std::string save_ngine = "../weights/test.engine";

    exportONNX(ONNX_file, save_ngine);

    return 0;
}

4. 设置属性

右键属性

Win10系统C++将ONNX转换为TensorRT_第7张图片

4.1. 设置属性 — 包含目录

找到VC++目录中的包含目录,将下面的路径写入,保存退出

注意:TensorRT路径需要替换成你的路径,CUDA路径复制即可。

$(CUDA_PATH)\include
D:\software\TensorRT-8.4.1.5_CUDA11.6_Cudnn8.4.1\include
D:\software\TensorRT-8.4.1.5_CUDA11.6_Cudnn8.4.1\samples\common

Win10系统C++将ONNX转换为TensorRT_第8张图片

Win10系统C++将ONNX转换为TensorRT_第9张图片

4.2. 设置属性 — 库目录

找到库目录,将下面的路径写入,保存退出

注意:TensorRT路径需要替换成你的路径,CUDA路径复制即可。

$(CUDA_PATH)\lib
$(CUDA_PATH)\lib\x64
D:\software\TensorRT-8.4.1.5_CUDA11.6_Cudnn8.4.1\lib

Win10系统C++将ONNX转换为TensorRT_第10张图片

Win10系统C++将ONNX转换为TensorRT_第11张图片

4.3. 设置属性 — 链接器

找到链接器下的输入,在附加依赖项中加入
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib
cudnn.lib
cublas.lib
cudart.lib

Win10系统C++将ONNX转换为TensorRT_第12张图片

Win10系统C++将ONNX转换为TensorRT_第13张图片

5. 创建模型文件夹

新建weights文件夹,将你的onnx文件放在里面

Win10系统C++将ONNX转换为TensorRT_第14张图片

Win10系统C++将ONNX转换为TensorRT_第15张图片

6. 运行

点击运行即可(可能有点慢)

Win10系统C++将ONNX转换为TensorRT_第16张图片

7. 问题 — 缺少 zlibwapi.dll 文件

若出现缺少zlibwapi.dll,需要下载,
链接:https://pan.baidu.com/s/12sVdiDH-NOOZNI9QqJoZuA?pwd=a0n0
提取码:a0n0
下载后解压,将zlibwapi.dll 放入 …\NVIDIA GPU Computing Toolkit\CUDA\v11.3\bin(我的路径)
重新运行程序

在这里插入图片描述

Win10系统C++将ONNX转换为TensorRT_第17张图片

Win10系统C++将ONNX转换为TensorRT_第18张图片

8. 生成engine文件

Win10系统C++将ONNX转换为TensorRT_第19张图片

Release模式

点击,更换为Release

Win10系统C++将ONNX转换为TensorRT_第20张图片

重新配置属性

重新配置步骤4,添加库目录包含目录附加依赖项,即可。

结束。

你可能感兴趣的:(c++,开发语言,深度学习)