1 使用TensorRT C++ SDK部署模型推理时间不稳定或者推理速度越来越慢的问题

最近今天在使用TensorRT C++ SDK部署PaddleSeg的PPMattingV2-512模型,如果只是对单张图片进行推理的话,推理一张图片在8-10ms左右。如果对摄像头或者是视频文件进行推理,前面几十帧的推理速度还是比较正常的,但是越到后面推理速度越来越慢,并且推理时间非常不稳定,在8-25ms波动,这对后续项目实际使用影响非常大。

2 相应的解决方案

2.1 修改显卡NVIDIA设置

进入NVIDIA控制面板 ,全局设置,修改低延时模式为超高,修改电源管理模式为最高性能优先

TensorRT – 使用TensorRT C++ SDK部署模型时推理时间波动不稳定或者推理速度越来越慢的问题-StubbornHuang Blog

2.2 修改显卡最大时钟频率

使用管理员模式打开cmd,不使用管理员模式打开,之后在设置时钟频率会会出现权限错误,错误如下

TensorRT – 使用TensorRT C++ SDK部署模型时推理时间波动不稳定或者推理速度越来越慢的问题-StubbornHuang Blog
The current user does not have permission to change clocks for GPU 00000000:01:00.0.
Terminating early due to previous errors.

使用管理员权限打开cmd工具之后,先使用

nvidia-smi -q -d SUPPORTED_CLOCKS

命令查询当前显卡的最大频率,比如我显卡的最大时钟频率为2130MHz,

TensorRT – 使用TensorRT C++ SDK部署模型时推理时间波动不稳定或者推理速度越来越慢的问题-StubbornHuang Blog

然后使用以下命令将显卡的时钟频率设置为最大的2130MHz

nvidia-smi -lgc 2130

在设置完成之后,如果要恢复原来的设置,可使用

nvidia-smi -rgc

命令进行恢复。

经过这两个步骤的设置,TensorRT的推理时间变得非常稳定,一帧图片基本上维持在8-9ms的范围内,不再出现推理时间波动以及推理速度越来越慢的问题。

2.3 Windows系统设置无分页内存

还有网上的博文介绍了一种方式是在Windows上对系统设置无分页内存,进入高级系统设置页面,就是设置系统环境变量那个页面

然后选择高级-设置

TensorRT – 使用TensorRT C++ SDK部署模型时推理时间波动不稳定或者推理速度越来越慢的问题-StubbornHuang Blog

在性能选项中再选择高级-虚拟内存-更改

TensorRT – 使用TensorRT C++ SDK部署模型时推理时间波动不稳定或者推理速度越来越慢的问题-StubbornHuang Blog

设置选择系统盘,选择无分页文件,点击确定,然后重启电脑。

TensorRT – 使用TensorRT C++ SDK部署模型时推理时间波动不稳定或者推理速度越来越慢的问题-StubbornHuang Blog

这个方法我没有测试,不过想一下这样设置的原因是,虚拟内存是Windows上从硬盘划一块控件当做内存使用,其读写速度就只是硬盘的读写速度。如果在TensorRT推理的过程中,内存与显卡交互时使用到了虚拟内存,那么显卡和内存之间的数据拷贝将会以硬盘的速度进行传输,所以会极大的增大推理时间。如果设置成无分页内存也就是说不使用虚拟内存,所以就不会出现上述情况,使得数据只会在内存与显存之间进行传输,从而不会影响推理时间。

参考链接