为什么 python 线程会减慢更快的 R-CNN 的推理时间
Why does python threading slow down inference time for faster R-CNN
我正在开发一个流量跟踪系统,该系统可以分析已收集的视频。我正在使用 opencv、threading、pytorch 和 dectron2。为了加快从 opencv 抓取帧的速度,我决定使用一个线程,它运行一个循环,用帧填充队列,如 blog post 所示。实现这个之后,我可以像我的处理管道的其余部分一样快地访问帧,所以那里没有问题。当我现在对帧进行推理(只是通过 Faster R-CNN 模型向前传递)时会出现问题,与过去的 0.11 秒相比,现在需要 5 秒以上。我的 GPU 正在使用中,而我的 CPU 远未得到充分利用。什么会导致这种情况发生?
CPython 有一个全局解释器锁。这意味着解释器有一个大锁,可以防止同时从多个线程评估 Python 字节码。
用 C 实现并提供对高级操作的访问的包通常能够在 运行 时发布 GIL,但如果您的处理代码主要是 Python 和 CPU-bound,你不会从多线程中获得任何加速:你将有线程相互竞争,但由于 GIL,你的处理最终将完全顺序进行。
在那种情况下,您需要 multiprocessing 来获得加速,GIL 是针对每个解释器的,因此不同进程中的不同解释器不会相互干扰。通信/同步成本甚至更高。
我正在开发一个流量跟踪系统,该系统可以分析已收集的视频。我正在使用 opencv、threading、pytorch 和 dectron2。为了加快从 opencv 抓取帧的速度,我决定使用一个线程,它运行一个循环,用帧填充队列,如 blog post 所示。实现这个之后,我可以像我的处理管道的其余部分一样快地访问帧,所以那里没有问题。当我现在对帧进行推理(只是通过 Faster R-CNN 模型向前传递)时会出现问题,与过去的 0.11 秒相比,现在需要 5 秒以上。我的 GPU 正在使用中,而我的 CPU 远未得到充分利用。什么会导致这种情况发生?
CPython 有一个全局解释器锁。这意味着解释器有一个大锁,可以防止同时从多个线程评估 Python 字节码。
用 C 实现并提供对高级操作的访问的包通常能够在 运行 时发布 GIL,但如果您的处理代码主要是 Python 和 CPU-bound,你不会从多线程中获得任何加速:你将有线程相互竞争,但由于 GIL,你的处理最终将完全顺序进行。
在那种情况下,您需要 multiprocessing 来获得加速,GIL 是针对每个解释器的,因此不同进程中的不同解释器不会相互干扰。通信/同步成本甚至更高。