Python 并行运行的进程数是由物理CPU数还是逻辑CPU数决定的?

Python 并行运行的进程数是由物理CPU数还是逻辑CPU数决定的?,python,multiprocessing,ray,Python,Multiprocessing,Ray,以下是我的CPU信息: 我用来训练强化学习算法,在这里我定义了一个由@ray.remote(num\u cpus=2)修饰的学习者类和一个由ray.remote(num\u cpus=1)修饰的工作者类。为了获得最佳绩效,我可以有多少员工 我曾经把工人的数量设置为8-10人,但今天我遇到了这样的情况,即 对于许多工作负载(尤其是数字工作负载),您通常不能期望比物理CPU数量更快的加速 这似乎是说物理CPU的数量限制了并行运行的进程的数量。这是否意味着我不应该使用超过4个工人,以获得最大的性能,

以下是我的CPU信息:

我用来训练强化学习算法,在这里我定义了一个由
@ray.remote(num\u cpus=2)
修饰的
学习者
类和一个由
ray.remote(num\u cpus=1)
修饰的
工作者
类。为了获得最佳绩效,我可以有多少员工

我曾经把工人的数量设置为8-10人,但今天我遇到了这样的情况,即

对于许多工作负载(尤其是数字工作负载),您通常不能期望比物理CPU数量更快的加速

这似乎是说物理CPU的数量限制了并行运行的进程的数量。这是否意味着我不应该使用超过4个工人,以获得最大的性能,假设工人是CPU密集型的?我希望有人能给我一个详细的解释(或参考)。提前谢谢

更新 感谢@AMC和@KlausD的评论。。我在这里更新了我的问题,希望它能让我的问题更清楚

我做了一些测试。例如,我分别对1名、3名和8名工人进行了实验。结果如下:

  • 对于单工情况,运行400个步骤需要4m17秒
  • 对于3人的情况,运行400个步骤平均需要4M29秒
  • 对于6人的情况,运行400个步骤平均需要5m30秒
我断定CPU争用发生在6人案件中。然而,我打开了
top
(在这里我可以看到12个CPU)来检查CPU的使用情况,所有工人都使用了大约100%的CPU。因此,我不知道我的结论是否正确

我还写了一个小程序来做进一步的测试。代码如下所示

从时间导入时间
将numpy作为np导入
导入光线
@远程(num_CPU=1)
定义f(x,y):
开始=时间()
尽管如此:
x+=y
如果np.平均值(x)>100:
打破
返回时间()-开始
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#我打算使x和y变大以增加cpu的使用。
x=np.rand.rand(100010000)
y=np.随机均匀(0,3,(1000,10000))
打印('x平均值:',np.平均值(x))
打印('y均值:',np.均值(y))
对于范围(1,30,3)内的n:
ray.init()
开始=时间()
结果=射线获取([f.remote(x,y)用于范围(n)])
打印('工作人数:',n)
#打印('运行时:',结果)
打印('平均运行时间:',np.平均值(结果))
打印('Ray运行时:',time()-start)
ray.shutdown()
这是结果

x mean: 0.4998949941471149
y mean: 1.4997634832632463

Num of workers: 1
Average run time: 1.3638701438903809
Ray run time: 2.1305620670318604

Num of workers: 4
Average run time: 3.1797224283218384
Ray run time: 4.065998554229736

Num of workers: 7
Average run time: 5.139907530375889
Ray run time: 6.446819543838501

Num of workers: 10
Average run time: 7.569052147865295
Ray run time: 8.996447086334229

Num of workers: 13
Average run time: 8.455958109635572
Ray run time: 11.761570692062378

Num of workers: 16
Average run time: 7.848772034049034
Ray run time: 13.739320278167725

Num of workers: 19
Average run time: 8.033894174977354
Ray run time: 16.16210103034973

Num of workers: 22
Average run time: 8.699185609817505
Ray run time: 18.566803693771362

Num of workers: 25
Average run time: 8.966830835342407
Ray run time: 21.45942711830139

Num of workers: 28
Average run time: 8.584995950971331
Ray run time: 23.2943696975708

我希望至少4个工作线程的时间应该与1个工作线程的时间差不多,因为我有6个物理内核。但结果似乎表明了一个不同的故事。此外,我不明白为什么
平均运行时间
在工作进程数大于10时停止增加?

可以并行运行的进程数取决于计算机可以加速进程的可用工作进程数,这与您的计算机CPU内核和可用处理器(双核系统等)直接相关。通过可用CPU内核拥有的可用工作线程越多,可以同时运行的进程就越多。我在linux机器上工作,检查CPU信息的一种方法是

cat /proc/cpuinfo
如果您使用python运行多进程,我建议您使用该库,因为它可以根据计算机的规格自动增加适当数量的工作线程,以获得最佳的并行任务性能,尽管如果您希望增加或减少工作线程,可以选择覆盖它

因此,为了回答您关于内核的问题,内核是在处理器的金属散热器下面运行的。它们是计算机内部的物理芯片,既不是隐喻性的,也不是逻辑性的。每个CPU本身就是一个完整的CPU,它们可以同时运行完全不同的代码位

你的实验适得其反的原因很简单。 创建任务(进程)并将其分配给工作人员(cpu)需要计算机时间 内核)以及在这些进程运行时关闭这些进程的额外时间 已经完成。这是你一直回来的额外时间 你的实验,这就是为什么一个工人比其他任何数量的工人花更少的时间来计算的原因,如果你注意到你使用的工人越多,那么你使用的工人越多 这需要时间,因为更多的工序必须分配给更多的工人, 完成后关闭。因此,因为没有时间被节省在网络上 程序的计算只会使您的代码速度变慢,这意味着它们不是任何繁重的计算,因此一个工作人员以最佳效率执行任务,但当您引入更多工作人员时,必须从原始任务创建更多进程并分配给创建的新工作人员(这将增加代码运行所需的时间)当这些进程完成时,它们必须关闭(这也会增加程序完成运行所需的时间)


通常,多处理只适用于非常繁重的CPU限制操作(繁重的计算、游戏等),如果不是这样的话,它们会适得其反,最终会减慢程序的速度。在其他方面,要处理不受CPU限制的事情,您应该考虑使用线程(我推荐的模块也支持线程)或异步编码

如何测试一些数字,看看什么是最快的选择?我希望有人能为我提供详细的解释(或参考)。具体是什么的详细解释?链接的内容看起来很清楚,不是吗?另外,我认为这篇文章的标题可能太模糊了。嗨,我更新了我的问题,添加了一些实验结果。我希望这次更清楚。谢谢你的回答。我想知道“CPU核心”是否意味着物理CPU和“进程”