TensorRT教程1:优化原理

TensorRT优化原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTFG1B5M-1624787358269)(1-1 TensorRT精华总结.assets/TensorRT-optimize-method.png)]

TensorRT优化方法主要有以下几种方式,最主要的是前面两种。

1、层间融合或张量融合----在构建engine阶段完成

算子融合(网络层合并):如下图左侧是GoogLeNetInception模块的计算图。这个结构中有很多层,在部署模型推理时,这每一层的运算操作都是由GPU完成的,但实际上是GPU通过启动不同的CUDA(Compute unified device architecture)核心来完成计算的,CUDA核心计算张量的速度是很快的,但是往往大量的时间是浪费在CUDA核心的启动和对每一层输入/输出张量的读写操作上面,这造成了内存带宽的瓶颈和GPU资源的浪费。TensorRT通过对层间的横向或纵向合并==(合并后的结构称为CBR,意指 convolution, bias, and ReLU layers are fused to form a single layer)==,使得层的数量大大减少。横向合并可以把卷积、偏置和激活层合并成一个CBR结构,只占用一个CUDA核心纵向合并可以把结构相同,但是权值不同的层合并成一个更宽的层,也只占用一个CUDA核心。合并之后的计算图(图4右侧)的层次更少了,占用的CUDA核心数也少了,因此整个模型结构会更小,更快,更高效。

concat 层的消除:对于 channel 维度的 concat 层,TensorRT 通过非拷贝方式将层输出定向到正确的内存地址来消除 concat 层,从而减少内存访存次数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PjJGxBSB-1624787337466)(1-1 TensorRT精华总结.assets/TensorRT-layer-fusion.png)]

2、低精度量化----在构建engine阶段完成

大部分深度学习框架在训练神经网络时网络中的张量(Tensor)都是32位浮点数的精度(Full 32-bit precision,FP32),一旦网络训练完成,在部署推理的过程中由于不需要反向传播,完全可以适当降低数据精度,比如降为FP16或INT8的精度。更低的数据精度将会使得内存占用和延迟更低,模型体积更小。

如下表为不同精度的动态范围:

PrecisionDynamic Range
FP32−3.4×1038 +3.4×1038
FP16−65504 +65504
INT8−128 +127

INT8只有256个不同的数值,使用INT8来表示 FP32精度的数值,肯定会丢失信息,造成性能下降。不过TensorRT会提供完全自动化的校准(Calibration )过程,会以最好的匹配性能将FP32精度的数据降低为INT8精度,最小化性能损失。关于校准过程,后面会专门做一个探究。

3、CUDA核自动调整----在推理阶段完成

网络模型在推理计算时,是调用GPU的CUDA核进行计算的。TensorRT可以针对不同的算法,不同的网络模型,不同的GPU平台,进行 CUDA核的调整(包括:怎么调用 CUDA 核心、怎么分配、每个 block 里面分配多少个线程、每个 grid 里面有多少个 block。),以保证当前模型在特定平台上以最优性能计算。

不同的硬件TensorRT 都会做对应的优化,得到优化后的 engine

4、动态张量显存----在推理阶段完成

在每个tensor的使用期间,TensorRT会为其指定显存,避免显存重复申请,减少内存占用和提高重复使用效率。

5、并行处理多流输入----在推理阶段完成

Scalable design to process multiple input streams in parallel,这个应该就是GPU底层的优化了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrThArgm-1624787337468)(1-1 TensorRT精华总结.assets/TensorRT-model-import2.png)]

  • 13
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,出现了一个ImportError错误,错误信息为"/home/xi/.conda/envs/tensor/lib/python3.8/site-packages/tensorrt/tensorrt.so: undefined symbol: getBuilderPluginRegistry"。这个错误通常是由于缺少依赖或版本不匹配导致的。解决这个问题的思路如下: 1. 确保依赖已安装:首先,您需要确保所需的依赖已正确安装。在这种情况下,您需要确保TensorRT和相关的依赖已正确安装。您可以使用以下命令检查TensorRT是否已正确安装: ```shell pip list | grep tensorrt ``` 如果没有输出结果,则表示TensorRT未安装。您可以使用以下命令安装TensorRT: ```shell pip install tensorrt ``` 2. 检查版本兼容性:如果您已经安装了TensorRT,但仍然遇到该错误,可能是由于版本不兼容导致的。请确保您使用的TensorRT版本与您的代码和其他依赖项兼容。您可以查看TensorRT文档或与您使用的框架的官方文档进行比对,以确保版本兼容性。 3. 更新依赖:如果您已经安装了TensorRT并且版本兼容,但仍然遇到该错误,您可以尝试更新TensorRT和其他相关依赖项。使用以下命令更新TensorRT: ```shell pip install --upgrade tensorrt ``` 然后,重新运行您的代码,看看问题是否解决。 请注意,这只是一些解决ImportError错误的常见思路。具体解决方法可能因您的环境和代码而异。如果上述方法无法解决问题,请提供更多详细信息,以便我能够提供更准确的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米斯特龙_ZXL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值