TensorRT Developer Guide

TensorRT Developer Guide

Overview

NVIDIA TensorRT™是一个C ++库,可以帮助NVIDIA图形处理器(GPU)进行高性能推理。
TensorRT通过合并张量和图层,转换权重,选择高效的中间数据格式,并根据图层参数和
测量的性能从大型内核目录中进行选择,从而对网络进行定义并对其进行优化。
TensorRT包含导入方法,可帮助您为TensorRT表达训练有素的深度学习模型以优化和运行。 它是一种优化工具,可以应用图形优化和图层融合,并利用各种高度优化的内核集合找到该模
型的最快实现,以及可用于在推理上下文中执行此网络的运行时方法。

install

官方安装流程

c++简易安装

1,首先从官网 下载TensorRT安装文件

image

2, 解压缩文件

$ tar -xzvf TensorRT-4.0.0.3.Ubuntu-16.04.4.x86_64-gnu.cuda-9.0.cudnn7.0.tar.gz

3, 添加环境变量

$ vim ~/.bashrc

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/TensorRT-4.0.0.3/lib

$ source ~/.bashrc

Working With TensorRT Using The C++ API

Instantiating TensorRT Objects in C++

首先,您都必须实现一个日志记录接口,TensorRT通过该接口打印错误,警告和信息性消息。
日志记录接口可用于创建多个运行时和构建器实例,但是日志记录接口是一个单例(整个应用程序
中只有一个类实例且这个实例所占资源在整个应用程序中是共享的),所以你必须为每个对象使用
同一个日志记录实例。

class Logger : public ILogger           
 {
     void log(Severity severity, const char* msg) override
     {
         // suppress info-level messages
         if (severity != Severity::kINFO)
             std::cout << msg << std::endl;
     }
 } gLogger;

Creating A Network Definition In C++

使用TensorRT进行inference的第一步是从您的模型创建TensorRT网络。实现此目的的最简单方法是使用
TensorRT解析器库导入模型,该解析器库支持以下格式的序列化模型:

sampleMNIST(BVLC和NVCaffe)

sampleOnnxMNIST 1.0和1.1,以及

sampleUffMNIST(用于TensorFlow)

另一种方法是使用TensorRT API直接定义模型。这要求您进行少量API调用以定义网络图中的每个层,并为模型的训练参数实现自己的导入机制。

在任何一种情况下,您都明确需要告诉TensorRT需要哪些tensors作为inference的输出。未标记为输出的tensors被认为是可被优化的瞬态值。输出tensors的数量没有限制,但是,将tensors标记为输出可能会禁止对tensors进行一些优化。在推理时,您将为引擎提供一个指向输入和输出缓冲区的指针数组。

现在我们只讨论如何基于一个caffe模型,导出网络定义。

  1. Create the TensorRT builder and network.
IBuilder* builder = createInferBuilder(gLogger);
nvinfer1::INetworkDefinition* network = builder->createNetwork();
  1. Parse caffe model to populate network, then set the outputs
std::vector<std::string> outputs{"prob"};
ICaffeParser* parser = createCaffeParser();
const IBlobNameToTensor* blobNameToTensor = parser->parse(deployFile,
                                                          modelFile,
                                                          *network,
                                                          DataType::kFLOAT);
 for (auto& s : outputs)
        network->markOutput(*blobNameToTensor->find(s.c_str()));

    builder->setMaxBatchSize(maxBatchSize);
    builder->setMaxWorkspaceSize(1 << 20);
  1. Build engine
ICudaEngine* engine = builder->buildCudaEngine(*network);
  1. Serialize engine
IHostMemory *serializedModel = engine->serialize();
// store model to disk
// <…>
serializedModel->destroy();

Performing Inference In C++

  1. Deserialize engine we serialized earlier
IRuntime* runtime = createInferRuntime(gLogger);

//get model from disk or hostMemory
ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream->data(), trtModelStream->size(), nullptr);
  
IExecutionContext* context = engine->createExecutionContext();
  1. Use the input and output blob names to get the corresponding input and output index
int inputIndex = engine.getBindingIndex(INPUT_BLOB_NAME);
int outputIndex = engine.getBindingIndex(OUTPUT_BLOB_NAME);
  1. allocate GPU buffers
Dims3 inputDims = static_cast<Dims3&&>(engine->getBindingDimensions(inputIndex));
outputDims = static_cast<Dims3&&>(engine->getBindingDimensions(outputIndex));

size_t inputSize = batchSize * inputDims.d[0] * inputDims.d[1] * inputDims.d[2] * sizeof(float);
size_t outputSize = batchSize * outputDims.d[0] * outputDims.d[1] * outputDims.d[2] * sizeof(float);
void* buffers[2];

cudaMalloc(&buffers[inputIndex], inputSize);
cudaMalloc(&buffers[outputIndex], outputSize)

//copy dato to gpu
cudaMemcpy(buffers[inputIndex], input, batchSize * INPUT_H * INPUT_W * sizeof(float));
  1. do interence and get output
 context->execute(batchSize, buffers);
 cudaMemcpy(output.data(), buffers[outputIndex], output_size_, cudaMemcpyDeviceToHost);

请阅读官方demo/sampleMNIST,demo路径为TensorRT-4.0.1.6/samples/sampleMNIST

Working With Mixed Precision

混合精度是在计算方法中组合使用不同的数值精度。 TensorRT可以存储权重和激活,并以32位浮点,16位浮点或量化的8位整数执行层。

使用低于FP32的精度可减少内存使用,允许部署更大的网络。 数据传输花费的时间更少,计算性能也会提高,尤其是在Tensor Core支持该精度的GPU上。

默认情况下,TensorRT使用FP32推理,但它也支持FP16和INT8。 在运行FP16推理时,它会自动将FP32权重转换为FP16权重。
注意:指定网络的精度定义应用程序的最低可接受精度。 如果对于某些特定的内核参数集更快,或者如果不存在低精度内核,则可以选择更高精度的内核。

bool useFp16 = builder->platformHasFastFp16();

DataType modelDataType = useFp16 ? DataType::kHALF : DataType::kFLOAT; // create a 16-bit model if it's natively supported
const IBlobNameToTensor *blobNameToTensor =
        parser->parse(locateFile(deployFile).c_str(),               // caffe deploy file
                                 locateFile(modelFile).c_str(),     // caffe model file
                                 *network,                          // network definition that the parser will populate
                                 modelDataType);

 // set up the network for paired-fp16 format if available
if(useFp16)
    builder->setFp16Mode(true);

customer layer

These are the operations that are supported in a Caffe framework:

Convolution

Pooling

InnerProduct

SoftMax

ReLU, TanH, and Sigmoid

LRN

Power

ElementWise

Concatenation

Deconvolution

BatchNormalization

Scale

Crop

Reduction

Reshape

Permute

Dropout

可能存在支持的层不满足模型的特定需求。 在这种情况下,用户可以通过使用C++ API实现自定义层来扩展TensorRT功能。 自定义层(通常称为插件)由应用程序实现和实例化,它们必须跨越TensorRT引擎的生命周期。

要在C++中添加自定义图层,请实现IPluginExt类。 对于基于Caffe的网络,如果使用TensorRT Caffe Parser,您还将实现nvcaffeparser1 :: IPluginFactoryExt和nvinfer1 :: IPluginFactory类。
具体流程请参考demo/samplePlugin ,路径为/TensorRT-4.0.1.6/samples/samplePlugin

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容