看来我的numpy库正在使用4个线程,而设置OMP_NUM_THREADS=1并没有阻止它.
numpy.show_config() 给我这些结果:
atlas_threads_info:
libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib64/atlas']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = f77
include_dirs = ['/usr/include']
blas_opt_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib64/atlas']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = c
include_dirs = ['/usr/include']
atlas_blas_threads_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib64/atlas']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = c
include_dirs = ['/usr/include']
openblas_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib64/atlas']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] …Run Code Online (Sandbox Code Playgroud) 我试图使用多处理运行一个简单的测试.测试工作正常,直到我导入numpy(即使它没有在程序中使用).这是代码:
from multiprocessing import Pool
import time
import numpy as np #this is the problematic line
def CostlyFunc(N):
""""""
tstart = time.time()
x = 0
for i in xrange(N):
for j in xrange(N):
if i % 2: x += 2
else: x -= 2
print "CostlyFunc : elapsed time %f s" % (time.time() - tstart)
return x
#serial application
ResultList0 = []
StartTime = time.time()
for i in xrange(3):
ResultList0.append(CostlyFunc(5000))
print "Elapsed time (serial) : ", time.time() - StartTime
#multiprocessing …Run Code Online (Sandbox Code Playgroud) 所以,我玩弄multiprocessing.Pool和Numpy,但似乎我错过了一些重要的一点.为什么pool版本慢得多?我查看了htop,我可以看到创建了几个进程,但它们共享一个CPU,最多可达100%.
$ cat test_multi.py
import numpy as np
from timeit import timeit
from multiprocessing import Pool
def mmul(matrix):
for i in range(100):
matrix = matrix * matrix
return matrix
if __name__ == '__main__':
matrices = []
for i in range(4):
matrices.append(np.random.random_integers(100, size=(1000, 1000)))
pool = Pool(8)
print timeit(lambda: map(mmul, matrices), number=20)
print timeit(lambda: pool.map(mmul, matrices), number=20)
$ python test_multi.py
16.0265390873
19.097837925
Run Code Online (Sandbox Code Playgroud)
[更新]
timeit基准测试流程仍然没有变化.pool版本仍然较慢,我可以看到htop,只使用了一个核心,也产生了几个进程. …
我的主要问题是在这里发布。由于还没有人给出解决方案,我决定找到一种解决方法。我正在寻找一种使用python 代码限制 python 脚本 CPU 使用率(不是优先级,而是 CPU 内核数)的方法。我知道我可以使用多处理库(池等)来做到这一点,但我不是使用多处理运行它的人。所以,我不知道该怎么做。而且我也可以通过终端来做到这一点,但是这个脚本是由另一个脚本导入的。不幸的是,我没有通过终端调用它的奢侈。
tl; dr:如何限制由另一个脚本导入的 python 脚本的CPU 使用率(核心数),我什至不知道为什么它并行运行,而不是通过终端运行它。请检查下面的代码片段。
导致问题的代码片段:
from sklearn.datasets import load_digits
from sklearn.decomposition import IncrementalPCA
import numpy as np
X, _ = load_digits(return_X_y=True)
#Copy-paste and increase the size of the dataset to see the behavior at htop.
for _ in range(8):
X = np.vstack((X, X))
print(X.shape)
transformer = IncrementalPCA(n_components=7, batch_size=200)
#PARTIAL FIT RUNS IN PARALLEL! GOD WHY?
---------------------------------------
transformer.partial_fit(X[:100, :])
---------------------------------------
X_transformed = transformer.fit_transform(X)
print(X_transformed.shape)
Run Code Online (Sandbox Code Playgroud)
版本:
python unix multiprocessing python-3.x python-multiprocessing
我想知道如何将N个独立任务分配给具有L个核心的机器上的M个处理器,其中L> M. 我不想使用所有处理器,因为我仍然希望I/O可用.我试过的解决方案似乎被分发到所有处理器,使系统陷入困境.
我假设多处理模块是可行的方法.
我做数值模拟.我的背景是物理学,而不是计算机科学,所以不幸的是,我经常不完全理解涉及标准任务模型的讨论,如服务器/客户端,生产者/消费者等.
以下是我尝试过的一些简化模型:
假设我有一个run_sim(**kwargs)运行模拟的函数(参见下面的内容),以及用于模拟的一长串kwargs,我有一个8核机器.
from multiprocessing import Pool, Process
#using pool
p = Pool(4)
p.map(run_sim, kwargs)
# using process
number_of_live_jobs=0
all_jobs=[]
sim_index=0
while sim_index < len(kwargs)+1:
number_of_live_jobs = len([1 for job in all_jobs if job.is_alive()])
if number_of_live_jobs <= 4:
p = Process(target=run_sim, args=[], kwargs=kwargs[sim_index])
print "starting job", kwargs[sim_index]["data_file_name"]
print "number of live jobs: ", number_of_live_jobs
p.start()
p.join()
all_jobs.append(p)
sim_index += 1
Run Code Online (Sandbox Code Playgroud)
当我用"顶部"然后"1"查看处理器使用情况时,无论如何,所有处理器似乎都被使用了.我错误地解释了"top"的输出并不是不可能的,但如果run_simulation()处理器密集,那么机器会严重陷入困境.
假设模拟和数据:
# simulation kwargs
numbers_of_steps = range(0,10000000, 1000000)
sigmas = [x …Run Code Online (Sandbox Code Playgroud) 我需要限制以下命令的 CPU 使用率,因为它使用了 100% 的 CPU。
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept = True, n_jobs = 1)
model.fit(df_x0, df_y0)
model.predict(df_x1)
Run Code Online (Sandbox Code Playgroud)
我已经设置了n_jobs == 1,并且没有使用多处理,但它仍然使所有内核和df_y0.
ndim == 1,我了解到n_jobs如果这样的话就不会有效。
谁能告诉我为什么它使用 100% 的 CPU,以及如何在 python 中解决这个问题?
Python 3.7、Linux。
我正在使用sklearn模块的混合子模块用于高斯混合模型...当我在多核系统上运行我的代码时,它使用多个核,即使我在代码中没有要求它.这是默认行为吗?更重要的是,我该如何禁用它?
谢谢
我正在研究一种算法,除了使用 numpy/scipy 之外,我没有尝试对其进行并行化。看着htop,有时代码使用我的所有核心,有时只使用一个。我正在考虑使用multiprocessing或类似的东西向单线程部分添加并行性。
假设我拥有所有并行的 BLAS/MKL 库,是否有一些我可以遵循的经验法则来猜测 numpy/scipy ufunc 是否将是多线程的?更好的是,有没有地方记录了这一点?
揣摩了这一点,我已经看了:https://scipy.github.io/old-wiki/pages/ParallelProgramming,Python的:如何从多线程停止numpy的?, python/numpy 中的多线程 blas。
我正在尝试在Windows 10 Intel Core i7-8550U处理器上使用Python 3.7.4进行python多处理。
我正在用两个函数测试多进程,一个函数使用基本sleep(),另一个函数使用sklearn的matthews_corrcoef。多重处理可使用睡眠功能,但不能使用sklearn功能。
import numpy as np
from sklearn.metrics import matthews_corrcoef
import time
import concurrent.futures
from multiprocessing import Process, Pool
from functools import partial
import warnings
import sys
class Runner():
def sleeper(self, pred, man, thr = None):
return time.sleep(2)
def mcc_score(self, pred, man, thr = None):
warnings.filterwarnings("ignore")
return matthews_corrcoef(pred, man)
def pool(self, func):
t1 = time.perf_counter()
p = Pool()
meth = partial(func, pred, man)
res = p.map(meth, thres)
p.close()
t2 = time.perf_counter()
print(f'Pool {func.__name__} {round((t2-t1), 3)} …Run Code Online (Sandbox Code Playgroud) python windows scikit-learn python-multiprocessing python-pool
某些numpy版本/版本具有某些操作的多线程执行。关于如何启用此功能,StackOverflow上存在许多问题。从理论上讲,这很棒。但是,我想禁用它。
原因是我在使用多处理进行并行化的脚本上下文中运行了一些numpy代码。默认的numpy多线程似乎不太“智能”,每个进程都将尝试使用计算机上的所有内核,如果我有多个进程正在运行,这将很快使事情过载。(此外,这是一台共享计算机,因此一般来说只是粗鲁的行为)。
我使用的numpy是当前默认安装的版本conda。这是我最终得到的有关numpy版本的信息:
In [1]: import numpy
In [2]: numpy.__version__
Out[2]: '1.10.2'
In [3]: numpy.__config__.show()
lapack_opt_info:
libraries = ['openblas']
library_dirs = ['/home/mwaskom/anaconda/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
blas_opt_info:
libraries = ['openblas']
library_dirs = ['/home/mwaskom/anaconda/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
openblas_info:
libraries = ['openblas']
library_dirs = ['/home/mwaskom/anaconda/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
openblas_lapack_info:
libraries = ['openblas']
library_dirs = ['/home/mwaskom/anaconda/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
blas_mkl_info:
NOT AVAILABLE
Run Code Online (Sandbox Code Playgroud)
当使用numpy时MKL …
python ×9
numpy ×5
scikit-learn ×3
anaconda ×1
blas ×1
conda ×1
cpu-usage ×1
pool ×1
python-3.x ×1
python-pool ×1
scipy ×1
unix ×1
windows ×1