TensorRT Development document

网页版文档网址:https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#install

关于API:

C++ API可以可以应用在性能要求、安全要求更为严格的场景中,Python API的好处在于便于数据的预处理。

C++ API:

1、首先需要创建一个ICudaEngine类型的对象,这个对象是engine。engine的创建有两种方式:

  • 在导入用户model的网络define的时候 生成
  • by reading the serialized engine from the disk. In this case, the performance is better, since the steps of parsing the model and creating intermediate objects are bypassed。

需要创建一个全局的iLogger型对象,

 

步骤0:

IBuilder* builder = createInferBuilder(gLogger);

步骤1:

INetworkDefinition* network = builder->createNetwork();

 

 

定义Network:

在任何一种情况下,您都明确需要告诉 TensorRT 需要哪些张量作为推断的输出。 未标记为输出的张量被认为是可由建造者优化的瞬态值。 输出张量的数量没有限制,但是,将张量标记为输出可能会禁止对张量进行一些优化。

1、自己利用已有的C++ API层层构建这个网络

在步骤1已经create了network,此处可直接拿来使用

构建输入层,输入层是前向第一层的图片输入:

 

auto data = network->addInput(INPUT_BLOB_NAME, dt, Dims3{1, INPUT_H, INPUT_W});

 

加入卷积层:

auto conv1 = network->addConvolution(*data->getOutput(0), 20, DimsHW{5, 5}, weightMap["conv1filter"], weightMap["conv1bias"]);
conv1->setStride(DimsHW{1, 1});

加入pooling层:

auto pool1 = network->addPooling(*conv1->getOutput(0), PoolingType::kMAX, DimsHW{2, 2});
pool1->setStride(DimsHW{2, 2});

加入全连接层和激活层:

auto ip1 = network->addFullyConnected(*pool1->getOutput(0), 500, weightMap["ip1filter"], weightMap["ip1bias"]);
auto relu1 = network->addActivation(*ip1->getOutput(0), ActivationType::kRELU);

加入Softmax层,并得到输出:

auto prob = network->addSoftMax(*relu1->getOutput(0));
prob->getOutput(0)->setName(OUTPUT_BLOB_NAME);

输出结果:

network->markOutput(*prob->getOutput(0));

2、使用Parser导入模型:

ONNX:

auto parser = nvonnxparser::createParser(*network,gLogger);

UFF:

auto parser = createUffParser();

NVCaffe:

ICaffeParser* parser = createCaffeParser();

后面是使用parser导入模型

parser->parse(args);

 

上一篇:tensorRT 使用过程中的Bug记录


下一篇:模型加速[tensorflow&tensorrt]