多线程会降低GPU性能
问题描述
在我的Python应用程序中,我使用Detectron2对图像运行预测,并检测图像中所有人的关键点。
我希望(使用aiortc)对流式传输到我的应用程序LIVE的帧运行预测,但我发现预测时间要糟糕得多,因为它现在运行在新线程上(服务器占用了主线程)。
在线程上运行预测需要1.5到4秒,这是很长的时间。
在主线程(不含视频流部分)上运行预测时,我得到的预测时间小于1秒。
我的问题是为什么会发生这种情况,我如何修复它?为什么从新线程使用GPU时,GPU性能会如此急剧下降?
备注:
代码在使用Tesla P100 GPU的Google Colab中进行测试,并通过从视频文件中读取帧来模拟视频流。
我使用this question中的代码计算对帧运行预测所需的时间。
我尝试切换到多进程,但无法使用CUDA(我使用import multiprocessing
和import torch.multiprocessing
都尝试了import torch.multiprocessing
和set_stratup_method('spawn')
),只是在进程上调用start
时卡住了。
示例代码:
推荐答案
问题出在您的硬件、库或示例代码与实际代码之间的差异。
我在NVIDIA Jetson Xavier上实现了您的代码。我使用以下命令安装了所有需要的库:
之后,我在示例视频上运行您的示例脚本,并收到以下输出:
在第一次通过之后,检测器始终需要大约400ms来运行检测。这对杰森·泽维尔来说似乎很合适。我没有经历您所描述的速度减慢。
我必须指出,Jetson是一种特定的硬件。在此硬件中,CPU和GPU共享RAM内存。因此,我不必将数据从CPU传输到GPU。因此,如果您的速度减慢是由CPU和GPU内存之间的传输引起的,我的设置中不会遇到此问题。
这篇关于多线程会降低GPU性能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!