tensorrtの基本的な流れ

tensorrt を使用した高速化は構築フェーズと運用フェーズの 2 つのプロセスに分かれており、構築フェーズでは主に onnx_Parser または tensorrt API を通じてネットワーク シリアル化エンジン モデルを構築します。実行フェーズでは、逆シリアル化されたエンジン モデルを読み込み、メモリ内に既存のリソースを作成して割り当て、ネットワーク推論を実行します。

tensorrt ビルドフェーズ

1. ロガーを作成します ロガー
ロガー gLogger;

2、建立BuilderとBuilderConfig
IBuilder* builder = createInferBuilder(gLogger);
IBuilderConfig* config = builder->createBuilderConfig();

3、创建ネットワーク(API)
ICudaEngineエンジン = nullptr;
エンジン = build_det_engine(max_batchsize, builder, config, DataType::kFLOAT, gd, gw, wts_name);
{ INetworkDefinition
network = builder->createNetworkV2(0U);

ITensor* data = network->addInput(kInputTensorName, dt, Dims3{ 3, kInputH, kInputW });
auto conv0 = convBlock(network,weightMap,*data,get_width(64,gw),6,2,1,“model.0”);
auto conv1 = convBlock(network,weightMap, *conv0->getOutput(0), get_width(128, gw), 3, 2, 1, “model.1”);
auto bottleneck_CSP2 = C3(ネットワーク、weightMap、conv1->getOutput(0)、get_width(128、gw)、get_width(128、gw)、get_ Depth(3、gd)、true、1、0.5、“model.2”) ;



auto yolo = addYoLoLayer(network,weightMap, “model.24”, std::vector<IConvolutionLayer
>{det0, det1, det2});

yolo->getOutput(0)->setName(kOutputTensorName);
network->markOutput(*yolo->getOutput(0));

builder->setMaxBatchSize(maxBatchSize);
config->setMaxWorkspaceSize(16 * (1 << 20));
config->setFlag(BuilderFlag::kFP16);
ICudaEngine* エンジン = builder->buildEngineWithConfig(*network, *config);

ネットワーク->破壊();
}

4、SerializedNetwork
IHostMemory* の生成serialized_engine = Engine->serialize();

5、释放资源
engine->destroy();
builder->destroy();
config->destroy();
シリアライズドエンジン->destroy();

tensorrt 実行フェーズ

1、構築エンジン
std::ifstream ファイル(engine_name, std::ios::binary);
char* trtModelStream= 新しい char[サイズ];
file.read(trtModelStream, サイズ);

IRuntime* ランタイム = createInferRuntime(gLogger);
ICudaEngine* エンジン = runtime->deserializeCudaEngine(trtModelStream, size, nullptr);

2、context
IExecutionContext* context = Engine->createExecutionContext();

3. バッファの準備 (ホストとデバイス)
const int inputIndex = m_Engine->getBindingIndex(“data”); // input
const int OutputIndex = m_Engine->getBindingIndex(“prob”); // bbox

float * input= 新しい float[入力サイズ];
float * cpu_output_buffer = new float[kBatchSize * kOutputSize];

float * gpu_buffers[2];
cudaMalloc(&gpu_buffers[inputIndex], kBatchSize * 3 * kInputH * kInputW * sizeof(float));
cudaMalloc(&gpu_buffers[outputIndex], kBatchSize * kOutputSize1 * sizeof(float));

4、バッファ贝ホストからデバイスへ
cudaMemcpyAsync(gpu_buffers[inputIndex], input, patchSize * 3 * m_InputH * m_InputW * sizeof(float), cudaMemcpyHostToDevice, stream);

5. 推論の実行
context->enqueue(batchSize, (void**)gpu_buffers, stream, nullptr); を実行します。

6、バッファ贝デバイスからホストへ
cudaMemcpyAsync(cpu_output_buffer, gpu_buffers[outputIndex],バッチサイズ * kOutputSize1 * sizeof(float), cudaMemcpyDeviceToHost, stream);

7. リソースを解放します
cudaFree(gpu_buffers[inputIndex]);
cudaFree(gpu_buffers[outputIndex]);
context ->destroy();
Engine->destroy();

おすすめ

転載: blog.csdn.net/threestooegs/article/details/130344329