TensorRT cheat sheet

TensorRT 备忘清单

问题 方案
如何检验TensorRT上计算结果的精度,找出精度不足的layer, 进行计算图优化 使用polygraphy
如何分析不同layer的推理时间, 找出耗时较大的layer 通过nsight systems得到运行阶段的timeline,并可视化
engine构建时间太长,怎么节约多次构建时的时间 使用Timing Cache
Dynamic Shape模式在min-opt-max跨度较大时性能下降 1. 构建期间创建多个OptimizationProfile, 每个profile范围要尽量小,方便TensorRT优化
2. 推理时根据数据形状选择相应的Profile, 缺点是会增加显存占用
怎样重叠计算和数据拷贝时间,增加GPU利用率 MultiStream,使用CUDA stream和CUDA event进行异步调用,同时使用Pinned memory
怎样使一个engine供多个线程使用 使用多个Context, 多个Context可以基于同一个engine独立的进行推理计算
怎样优化Kernel的调用,减少Launch Bound的发生
也就是CPU发起函数调用,到GPU真正执行所花费的时间过大, 大部分时间浪费在准备工作和数据拷贝等步骤上
1. 使用Cuda Graph
2. 将大部分Launch准备工作提前完成
3. CUDA工作流优化
某些Layer的算法导致较大的误差,如何屏蔽掉该选择 通过算法选择器完成
1. 先通过ploygraph等工具发现某些层的Tactic结果不理想
2. 通过算法选择器屏蔽掉这些层
3. 重新构建engine
想更新模型的权重,但又不想重新构建engine 使用Refit
构建期/运行期显存占用过大,怎么减少 BuilderConfig中,默认开启了cuBLAS、cuBLASLt、cuDNN三个库的算子备选方案。TensorRT优选kernel的时候,会从中选择性能最好的实现来放入engine。
可以人工屏蔽其中一种或多种库,从而禁止从这些库中选择算法来实现,可以节约内存和显存占用,减少engine构建时间
缺点是可能会导致engine性能下降或构建失败。后续版本TensorRT会彻底断开对外部库的依赖

猜你喜欢

转载自blog.csdn.net/weixin_41817841/article/details/127859247