相关疑难解决方法(0)

限制numpy中的线程数

看来我的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)

python multithreading numpy

23
推荐指数
4
解决办法
1万
查看次数

多处理与NumPy不兼容

我试图使用多处理运行一个简单的测试.测试工作正常,直到我导入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)

python numpy multiprocessing

17
推荐指数
1
解决办法
2541
查看次数

Multiprocessing.Pool使Numpy矩阵乘法更慢

所以,我玩弄multiprocessing.PoolNumpy,但似乎我错过了一些重要的一点.为什么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基准测试流程
  • init池,包含许多核心
  • 改变计算,以便有更多的计算和更少的内存传输(我希望)

仍然没有变化.pool版本仍然较慢,我可以看到htop,只使用了一个核心,也产生了几个进程. …

python numpy pool multiprocessing

15
推荐指数
3
解决办法
2万
查看次数

如何在没有终端或多处理库的情况下限制 python 脚本使用的 CPU 数量?

我的主要问题是在这里发布。由于还没有人给出解决方案,我决定找到一种解决方法。我正在寻找一种使用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

8
推荐指数
2
解决办法
7660
查看次数

Python多处理:限制使用的核心数

我想知道如何将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)

python multiprocessing

7
推荐指数
1
解决办法
7831
查看次数

应用sklearn.Linear_model.LinearRegression时如何限制CPU使用率?

我需要限制以下命令的 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。

python cpu-usage scikit-learn

6
推荐指数
1
解决办法
4653
查看次数

python中的无意识多线程(scikit-learn)

我正在使用sklearn模块的混合子模块用于高斯混合模型...当我在多核系统上运行我的代码时,它使用多个核,即使我在代码中没有要求它.这是默认行为吗?更重要的是,我该如何禁用它?

谢谢

python multithreading scikit-learn

5
推荐指数
1
解决办法
2913
查看次数

numpy/scipy 中的哪些操作是多线程的?

我正在研究一种算法,除了使用 numpy/scipy 之外,我没有尝试对其进行并行化。看着htop,有时代码使用我的所有核心,有时只使用一个。我正在考虑使用multiprocessing或类似的东西向单线程部分添加并行性。

假设我拥有所有并行的 BLAS/MKL 库,是否有一些我可以遵循的经验法则来猜测 numpy/scipy ufunc 是否将是多线程的?更好的是,有没有地方记录了这一点?

揣摩了这一点,我已经看了:https://scipy.github.io/old-wiki/pages/ParallelProgrammingPython的:如何从多线程停止numpy的?, python/numpy 中的多线程 blas

python multithreading numpy scipy

5
推荐指数
1
解决办法
3771
查看次数

Python池无法在Windows中工作,但可以在Linux中工作

我正在尝试在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

4
推荐指数
1
解决办法
171
查看次数

在默认的conda numpy中禁用/配置多线程

某些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 …

multithreading numpy blas anaconda conda

2
推荐指数
1
解决办法
2144
查看次数