tensorrt推理过程

tensorrt推理过程


前言

tensorrt推理过程:首先是准备模型,需要定义logger,创建接口实例,加载模型文件并用接口实例反序列化,之后执行一下上下文;建立输入输出buffer,并在cuda上建立对应内存,把数据拷贝到GPU,执行同步或异步推理,把cuda输出拷贝到CPU,然后就可以进行后处理了。

一、tensorrt推理过程

首先是准备模型,需要定义logger,创建接口实例,加载模型文件并用接口实例反序列化,之后执行一下上下文;建立输入输出buffer,并在cuda上建立对应内存,把数据拷贝到GPU,执行同步或异步推理,把cuda输出拷贝到CPU,然后就可以进行后处理了。
// ------------------------------ 1. 准备模型并加载 ----------------------------
//首先定义logger

TRTLogger logger;

// 执行推理前,需要创建一个推理的runtime接口实例。与builer一样,runtime需要logger:

nvinfer1::IRuntime* runtime   = nvinfer1::createInferRuntime(logger);

//加载之前编译生成的engine模型

auto engine_data = load_file("engine.trtmodel");
这里可以:
std::ifstream engineFile(engine_file, std::ios::binary);
  engineFile.read(engineData.data(), fsize);

// 对engine_data进行反序列化以获得engine

ICudaEngine *engine_ = runtime_->deserializeCudaEngine(engineData.data(), fsize, nullptr);

//拿到engine过后,创建一个执行上下文
IExecutionContext *context_ = engine_->createExecutionContext();

// ------------------------------ 2. 准备好要推理的数据并搬运到GPU ----------------------------

float input_data_host[] = {1, 2, 3};//因为输入是3个,所以这里写123
float* input_data_device = nullptr;

float output_data_host[2];
    float* output_data_device = nullptr;
    //分配device空间,即给device memory分配多少个字节的空间
    cudaMalloc(&input_data_device, sizeof(input_data_host));
    cudaMalloc(&output_data_device, sizeof(output_data_host));
    //把input_data_host内存上的数据复制到input_data_device内存上,加了stream说明用的异步
    cudaMemcpyAsync(input_data_device, input_data_host, sizeof(input_data_host), cudaMemcpyHostToDevice, stream);

// ------------------------------ 3. 推理并将结果搬运回CPU ----------------------------

bool success      = execution_context->enqueueV2((void**)bindings, stream, nullptr);
//推理并将output搬运回CPU,加了一个memory copy的任务加的stream队列里去,把output_data_device的数据拷贝到output_data_host上
cudaMemcpyAsync(output_data_host, output_data_device, sizeof(output_data_host), cudaMemcpyDeviceToHost, stream);
//对stream做一个同步,即等待stream完全结束
cudaStreamSynchronize(stream);

有时会用到下面的函数

int32_t nNumBindings = engine_->getNbBindings();

函数用于获取TensorRT引擎绑定的数量。这个函数通常在TensorRT的上下文中使用,函数返回的是引擎当前绑定的数量,这包括输入和输出的绑定。在处理模型转换和部署的过程中,确保正确的绑定数量对于避免资源冲突和优化性能至关重要。

总结

tensorrt推理过程:首先是准备模型,需要定义logger,创建接口实例,加载模型文件并用接口实例反序列化,之后执行一下上下文;建立输入输出buffer,并在cuda上建立对应内存,把数据拷贝到GPU,执行同步或异步推理,把cuda输出拷贝到CPU,然后就可以进行后处理了。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值