问题 | 方案 |
---|---|
如何检验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会彻底断开对外部库的依赖 |