0%

TensorRT

[TOC]

introduction

TensorRT

install

可以使用三种方式进行安装,包括

  • container 形式进行安装,下载NGC container;
  • debian 形式安装
  • pip 形式进行安装

container 形式安装

下载https://github.com/NVIDIA/TensorRT/blob/main/docker/ubuntu-18.04.Dockerfile
docker build -f ubuntu-18.04.Dockerfile --build-arg CUDA_VERSION=11.4.3 --tag=tensorrt-ubuntu .

debian 形式安装

pip形式进行安装

与TensorRT包里面wheel包安装形式不同,这种方式是自己管理TensorRT安装,不需要提前安装TensorRT包。目前只支持Python 3.6~3.9和CUDA 11.4。

安装前的准备

1
python3 -m pip install nvidia-pyindex

pip install时需要额外指定--extra-index-url https://pypi.ngc.nvidia.com

安装TensorRT wheel包

1
python3 -m pip install --upgrade nvidia-tensorrt

进行验证

1
2
3
4
python3
>>> import tensorrt
>>> print(tensorrt.__version__)
>>> assert tensorrt.Builder(tensorrt.Logger())

TensorRT生态

basic workflow

workflow

convert

deploy

  • 使用 TensorFlow

    使用 TensorFflow 模型部署即可,TensorRT不支持的OP,会fall back到TensorFlow实现。

  • 使用 TRT Runtime API

    开销最小,能实现细粒度控制。对于不是原生支持的OP,需要使用plugin进行实现

  • 使用 Nvidia Triton Inference Server

    能支持多种框架,包括 TensorFlow, TensorRT, PyTorch, ONNX Runtime, 或者自定义框架。

TensorRT 基础介绍

创建引擎

1
2
3
Logger gLogger;
IBuilder* builder = createInferBuilder(gLogger);
nvinfer1::INetworkDefinition* network = builder->createNetworkV2(1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH));

构建推理

1
2
3
4
5
6
7
IBuilderConfig* config = builder->createBuilderConfig();
config->setMemoryPoolLimit(1 << 20);
//设置推理精度
config->setFlag(nvinfer1::BuilderFlag::kFP16);

engine = builder->buildSerializedNetwork(*network, *config);
context = engine->createExecutionContext();
1
2
3
void* buffers[n];
engine->getBindingIndex(
context->enqueueV2(buffers, stream, nullptr);

dynamic shape

createNetwork()与createNetworkV2()的区别有两处,一是前者处理的维度为(C,H,W), 后者为(B,C,H,W);二是后者支持dynamic shapes。

plugin

TensorRT API

1
2
3
4
5
6
bool reshapeWeights(
const Weights& input, int32_t const* shape, int32_t const* shapeOrder, void* data, int32_t nbDims) noexcept;
bool reorderSubBuffers(
void* input, int32_t const* order, int32_t num, int32_t size) noexcept;
bool transposeSubBuffers(
void* input, DataType type, int32_t num, int32_t height, int32_t width) noexcept;

TensorRT 常见问题

DLA

DLA Supported Layers

reference

TensorRT

TensorRT Developer Guide

TensorRT API

ONNX-TensorRT

Torch-TensorRT