检查或关闭Numpy/SciPy并行化

4

我正在使用sklearn包中的K-Means聚类算法。

虽然我按照sklearn文档的说明设置了参数n_jobs = 1,并且只有一个进程在运行,但是这个进程将消耗我的计算机上所有的CPU。也就是说,在top命令中,我可以看到Python进程使用了,比如说4核机器上的400%。

需要明确的是,如果我设置n_jobs = 2,那么我会得到两个Python实例,但是每个实例都使用200%的CPU,再次消耗我的计算机全部4个核心。

我认为问题可能出在NumPy/SciPy的并行化层面。

是否有一种方法可以验证我的假设?例如,是否有一种方法可以关闭NumPy/SciPy中的任何并行化?


你的结论是正确的,你可以通过跟随代码来确认。并行化是在numpy构建时使用的BLAS中完成的。我不认为你可以关闭它(尽管我不是100%确定)。 - Andreas Mueller
这难道不会成为需要在共享资源上运行此代码的人们面临的问题吗?这正是我遇到的问题。如果没有对这种并行化进行定制,我将不得不请求队列系统中每台机器的最大CPU数量。 - EMiller
你的调度系统不应该照顾那个吗? - Andreas Mueller
我的意思是,我可以请求每台机器上的所有CPU,但当我只想使用一个核心并更快地运行和完成作业时,这是不必要的。 - EMiller
同时,并行化可能会有一些大的开销,在没有开销的情况下,如果您已经在进行更高级别的并行化,例如将数据分成单独的分区或通常运行单独的作业,则没有意义。 - Radio Controlled
1个回答

1

实际上,BLAS(基本线性代数子程序)或在我的情况下是OpenBLAS执行并行化。

解决方案是将环境变量OMP_NUM_THREADS设置为1

然后世界就恢复正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接