tar -xvzf TensorRT-6.0.1.5.Ubuntu-18.04.2.x86_64-gnu.cuda-10.1.cudnn7.6.tar.gz
export TRT_RELEASE=`pwd`/TensorRT-6.0.1.5 # 环境变量
mkdir build
cd build
vim ../thied_party/ # 可以省去
编译命令
cmake .. -DTRT_LIB_DIR=$TRT_RELEASE/lib -DTRT_OUT_DIR=`pwd`/out -DCUDA_VERSION=10.0-DPROTOBUF_VERSION=3.6.1
make -j4
TRT Build生成的模型文件(plan file)不是跨平台的,比如在server gpu上生成的plan file不能在板子上跑。同样是server上的卡,跨架构也是不行的,在Tensla T4上生成的,不能在P40上跑。相同架构的卡,是可以的,P40上生成的,可以在P4上跑,但会报warning。
在Build阶段,TRT能做的优化。比较有限。(不怎么通用) c++ api
根据模型结构使用TRT API复现定义网络 network definition
使用builder生成一个优化后的engine
将engine序列化到文件中,即生成的plan file
读取序列化的plan file并做inference
c++ api vs python api
本质上没啥区别,python适合算法人员验证 Tensorrt步骤
1.创建引擎 build engine
Create parser: 创建解析器
Setworkspace 设置工作空间
SetkType 设置推理模式 int8 fp16
Serialize:序列化:可以把一个引擎序列化为一个文件,可以把这个文件反序列化为引擎的一个方法或者说是操作(生成引擎)
Free : 释放空间
2.构建推理 do_inference
Bind the buffers: 绑定输入和输出,把gpu和cpu的空间想对应起来,通过名字或者id
Create GPU buffers and s stream:创建gpu的空间和它支持的流,(tensorrt可以有多流的执行,多个流或者不同的流中去执行我们的程序,成为不同的引擎。)
Trainsfer data:创建数据
Enqueue:执行
Release the stream and the buffers: 总结:
Ilogger是一个接口,可以在这个接口中定义自己的log格式,可以直接生成一个builder
序列化模型,也就是数组和内存,放在内存中。 building an engine in c++
在build阶段,TRT会根据GPU的特性和输入数据的大小,选择最后的实现算法(比如矩阵乘),所以最好build和inference都在一块显卡上。cudablas tensorrt底层调用算法不一样。(可以自己些一个全连接层,设置不通用的输入大小,查看底层调用的算法。)
谨慎设置max_batch_size
在build阶段,TRT选择最优算法的时候,是需要一定workspace的,所以设置足够的workspace size比较重要。(它会把每一个算法跑一遍,看哪个最快选择哪个,比如卷积,有一种算法,可以直接算,另一个,输入的图像转为矩阵格式,然后再给一个卷积去做矩阵乘,这样的矩阵乘就可以int8;另一种,就是将矩阵战成一个向量) 注意:
序列化顾名思义可就是将engine写到文件中,TRT build阶段比较耗时,可以一半的操作是离线build,并序列化。然后线上反序列化模型文件到inference。
调用context进行inference操作。
Engine内存储网络结构、模型参数以及必要的存储空间。
context则存储网络的中间结果。
多个context可以共享一个engine,即共享权值。这样效率比较高。 TRT显存管理
TRT显存管理,在生成context的时候,trt会根据maxBatch先开辟足够的显存。如果不想在生成context的时候开辟显存,则使用createExecutionWithoutDeviceMemory这个接口生成context。
支持自定义显存申请接口。 不重新build的情况下,更新engine中的权值
实例:
api构建网络
sampleMINISTAPI.cpp 重点:build
parser构建网络
sampleMINIST.cpp 3.2 TRT可借鉴的代码样例
看一下头文件:Nvinfer.h
layerType
第一个onnx的pa
build_op_inporters.cpp讲解了onnx转为trt
tensorflowd的tensorlow2tensorrt 3.3 plugin
3.3.1 plugin 例子和原理