记一次 Pytorch 多线程推理速度排查

1.问题:

一次单线程推理速度很慢,在 torch 的各类算子都非常慢(机器 4090):

多线程,只执行一个线程(单相机推理)

image2024-8-23_14-56-39

多线程,执行所有线程(多相机推理):

image2024-8-23_14-57-38

推测原因:可能是GIL 在多线程时候要保持不断获取和释放,导致耗时,调低这个参数以后,只推理一个相机的速度也恢复了正常。

2.调整方法:

sys.setswitchinterval(xxxxx)

sys.setswitchinterval(interval)

Set the interpreter’s thread switch interval (in seconds). This floating-point value determines the ideal duration of the “timeslices” allocated to concurrently running Python threads. Please note that the actual value can be higher, especially if long-running internal functions or methods are used. Also, which thread becomes scheduled at the end of the interval is the operating system’s decision. The interpreter doesn’t have its own scheduler.

Added in version 3.2.

解释:

通过 sys.setswitchinterval(0.01) 设置线程切换间隔为 10 毫秒,让两个线程更频繁地交替执行。

如果设置为一个较大的值,例如 sys.setswitchinterval(0.5),线程切换将变得很少,每个线程会执行较长时间后再切换。

作用:优化多线程应用,通过调整切换间隔,可以对多线程应用的性能进行微调。如果某个任务是 I/O 密集型的(例如网络请求、文件读取等),通常希望线程切换频繁一些,以便在等待 I/O 完成时能够让其他线程利用 CPU。如果是 CPU 密集型任务,则可能希望减少切换频率,以减少上下文切换带来的开销。

对于计算密集型的任务,较高的 sys.setswitchinterval(interval) 值通常更有利,因为它减少了不必要的线程切换开销,使得任务能更快地完成。相反,对于I/O密集型任务,较低的 interval 值可能会让系统更快速响应I/O操作,从而提高性能。因此,interval 的最佳设置应根据具体的任务类型进行调整。

3.现象

在其他条件全部控制一致前提下:

sys.setswitchinterval(0.01):

image2024-8-23_15-5-57

sys.setswitchinterval(0.00001):

image2024-8-23_15-7-15