网页版文档网址: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);