参考文献
https://github.com/NVIDIA/TensorRT
https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html
https://docs.nvidia.com/deeplearning/sdk/tensorrt-archived/
https://developer.nvidia.com/tensorrt
https://github.com/NVIDIA-AI-IOT/torch2trt
特性
- 量化的时候不损失精度, 量化的过程中做精度校正,通过将模型量化到INT8或FP16来最大化吞吐量,同时保持准确性。
- Layer以及Tensor之间相互融合,减少inference过程中的计算量。
- 根据GPU平台的不同,定制专属的Engine.
- 提高内存利用率
- 多流并行计算
融合机制
- 垂直融合
- 将一些Convolution, bia和激活等层合在一起计算
- 水平融合
- 将一些非常相似的操作合在一起同时计算
图示
原始网络:
- 垂直层融合
- 水平融合
操作步骤
Environment:
Drive: 418.87 <> Cuda: 10.1 <> Cudnn: 7.6.5 <> tensorrt: 6.0.1.5
Install:
- 在官网上下载tensorRT压缩包
- tar -xvzf TensorRT-.Ubuntu-16.04.x86_64-gnu.cuda-10.1.cudnn7.6.tar.gz
- export TRT_RELEASE=
pwd
/TensorRT-< version> - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: $TRT_RELEASE/lib
- cd TensorRT-< version>/python/
- pip install tensorrt-< version>-cp37-none-linux_x86_64.whl
Pseudocode(伪代码):
TensorRT-API
- 创建builder
trt_logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(trt_logger) - 通过builder创建一个空的TensorRT网络(Net)
network = builder.create_network() - 为这个空的Net添加组件
network.add_input()
network.add_convolution()
… - 为builder设置参数
builder.max_workspace_size = 1 << 20
builder.fp16_mode = True
builder.max_batch_size = 16
… - 通过这个builder将Net打包成一个engine
engine = builder.build_cuda_engine(network)
如果要是有engine的时候,可以通过以下方式load:
with open(engine_name, “rb”) as f, trt.Runtime(trt_logger) as runtime:
engine = runtime.deserialize_cuda_engine(f.read()) - 通过engine创建上下文执行环境
context = engine.create_execution_context() - 定义自己的output, 用于接收tensorRT的输出结果
- code
结果
yolov3 <> Drive: 418.87 <> Cuda: 10.1 <> Cudnn: 7.6.5