当前位置: 首页 > article >正文

c++加载TensorRT调用深度学习模型方法

使用TensorRT来调用训练好的模型并输出结果是一个高效的推理过程,特别是在需要低延迟和高吞吐量的应用场景中。以下是一个基本的步骤指南,展示了如何在C++中使用TensorRT进行推理。

步骤1:准备环境

  1. 安装TensorRT:确保你已经安装了NVIDIA TensorRT库。
  2. 准备模型:确保你的训练好的模型已经转换为TensorRT支持的格式,通常是一个.engine文件。你可以使用onnx-tensorrt、TensorFlow-TensorRT等工具将模型转换为TensorRT引擎。

步骤2:编写C++代码

以下是一个简单的C++代码示例,演示如何加载TensorRT引擎并执行推理。

cpp复制代码

#include <NvInfer.h>

#include <NvInferRuntime.h>

#include <cuda_runtime_api.h>

#include <fstream>

#include <iostream>

#include <memory>

#include <vector>

// Logger for TensorRT info/warning/errors

class Logger : public nvinfer1::ILogger {

public:

void log(Severity severity, const char* msg) noexcept override {

// Filter out info-level messages

if (severity != Severity::kINFO)

std::cout << msg << std::endl;

}

};

std::vector<char> readFile(const std::string& filepath) {

std::ifstream file(filepath, std::ios::binary | std::ios::ate);

if (!file.is_open()) {

throw std::runtime_error("Unable to open file " + filepath);

}

size_t size = file.tellg();

file.seekg(0, std::ios::beg);

std::vector<char> buffer(size);

file.read(buffer.data(), size);

return buffer;

}

void inference(const std::string& enginePath, const std::vector<float>& inputData) {

// Logger

Logger logger;

// Read the engine file

std::vector<char> engineData = readFile(enginePath);

std::istringstream engineStream(std::string(engineData.begin(), engineData.end()));

// Deserialize the engine

IRuntime* runtime = createInferRuntime(logger);

ICudaEngine* engine = runtime->deserializeCudaEngine(engineStream);

// Create execution context

IExecutionContext* context = engine->createExecutionContext();

// Allocate GPU memory

void* buffers[2];

cudaMalloc(&buffers[0], inputData.size() * sizeof(float)); // Input buffer

float* outputData = nullptr;

cudaMalloc(&buffers[1], engine->getBindingDimensions(1).d[0] * sizeof(float)); // Output buffer

// Copy input data to GPU

cudaMemcpy(buffers[0], inputData.data(), inputData.size() * sizeof(float), cudaMemcpyHostToDevice);

// Set dynamic input dimensions if needed (omitting for simplicity)

// Run inference

context->enqueue(batchSize, buffers, 0, nullptr);

// Synchronize the stream

cudaStreamSynchronize(context->getStream());

// Copy the output data to the host

outputData = new float[engine->getBindingDimensions(1).d[0]];

cudaMemcpy(outputData, buffers[1], engine->getBindingDimensions(1).d[0] * sizeof(float), cudaMemcpyDeviceToHost);

// Print the output data (or process it as needed)

std::cout << "Output data: ";

for (int i = 0; i < engine->getBindingDimensions(1).d[0]; ++i) {

std::cout << outputData[i] << " ";

}

std::cout << std::endl;

// Clean up

delete[] outputData;

cudaFree(buffers[0]);

cudaFree(buffers[1]);

context->destroy();

engine->destroy();

runtime->destroy();

}

int main() {

// Path to the TensorRT engine file

std::string enginePath = "your_model.engine";

// Example input data (must match the model's input dimensions)

std::vector<float> inputData = { /* Populate with your input data */ };

// Run inference

try {

inference(enginePath, inputData);

} catch (const std::exception& ex) {

std::cerr << "Error: " << ex.what() << std::endl;

return EXIT_FAILURE;

}

return EXIT_SUCCESS;

}

注意事项

  1. 输入数据:确保输入数据的维度和类型与你的模型匹配。
  2. 动态维度:如果你的模型包含动态输入维度,需要在创建执行上下文后设置这些维度。
  3. 错误处理:实际代码中应包含更多的错误处理逻辑,以应对各种可能的异常情况。
  4. 优化:TensorRT提供了多种优化选项,例如使用FP16进行推理以减少内存带宽和计算需求,你可以根据需求进行调整。

编译和运行

确保你的编译命令链接了TensorRT和CUDA库。例如:

sh复制代码

g++ -o tensorrt_inference tensorrt_inference.cpp -lnvinfer -lnvinfer_runtime -lcudart -lcudnn

./tensorrt_inference

希望这个示例能帮助你理解如何在C++中使用TensorRT进行推理。


http://www.kler.cn/a/538440.html

相关文章:

  • 【Git】tortoisegit使用配置
  • Neo4j图数据库学习(二)——SpringBoot整合Neo4j
  • PCIE Hot-Reset相关知识
  • camera系统之cameraprovider
  • C++Primer学习(2.2)
  • 黑马 Linux零基础快速入门到精通 笔记
  • 跟着李沐老师学习深度学习(五)
  • ESP32的IDF实现C语言和C++语言的混合编译
  • P1049 装箱问题(dp)
  • C++ 字符串编码转换
  • kafka生产者之发送模式与ACK
  • 【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)
  • 人工智能入门 数学基础 线性代数 笔记
  • 6.Python函数:函数定义、函数的类型、函数参数、函数返回值、函数嵌套、局部变量、全局变量、递归函数、匿名函数
  • 【专题】2025年我国机器人产业发展形势展望:人形机器人量产及商业化关键挑战报告汇总PDF洞察(附原数据表)
  • 基于大语言模型的自然语言研究
  • 【python】matplotlib(animation)
  • LLM:DeepSeek 系列(一)
  • 基于Flask的当当网畅销图书榜单可视化分析系统的设计与实现
  • 国产编辑器EverEdit - 查找功能详解
  • 【手写公式识别】MEMix: Improving HMER with Diverse Formula Structure Augmentation 论文阅读
  • Java Stream API:高效数据处理的利器引言
  • 虚拟局域网之详解(Detailed Explanation of Virtual Local Area Network)
  • Docker 常见问题解决方法
  • Docker-compose 编排lnmp(dockerfile) 完成Wordpress
  • 人工智能图像分割之Mask2former源码解读