parallel-processing - 是 python的多处理模块是加速大数值计算的正确方法?

  显示原文与译文双语对照的内容
0 0

我在数值compuation中使用了FORTRAN和并行并行化,我发现很容易在许多问题上使用它。 我切换到 python,因为它更有趣的( 至少对于我来说) 开发,但nummeric任务的并行性看起来更加繁琐。 我常常感兴趣加载大型( of GB ) 数据集并并行操作,同时只包含主存储器中的数据副本。 我开始使用 python 模块多处理器,并提出了这一通用示例:

#test cases 
#python parallel_python_example.py 1000 1000
#python parallel_python_example.py 10000 50
import sys
import numpy as np
import time
import multiprocessing
import operator
n_dim = int(sys.argv[1])
n_vec = int(sys.argv[2])
#class which contains large dataset and computationally heavy routine
class compute:
 def __init__(self,n_dim,n_vec):
 self.large_matrix=np.random.rand(n_dim,n_dim)#define large random matrix
 self.many_vectors=np.random.rand(n_vec,n_dim)#define many random vectors which are organized in a matrix
 def dot(self,a,b):#dont use numpy to run on single core only!!
 return sum(p*q for p,q in zip(a,b))
 def __call__(self,ii):# use __call__ as computation such that it can be handled by multiprocessing (pickle)
 vector = self.dot(self.large_matrix,self.many_vectors[ii,:])#compute product of one of the vectors and the matrix
 return self.dot(vector,vector)# return"length" of the result vector
#initialize data
comp = compute(n_dim,n_vec)
#single core
tt=time.time()
result = [comp(ii) for ii in range(n_vec)]
time_single = time.time()-tt
print"Time:",time_single
#multi core
for prc in [1,2,4,10]:#the 20 case is there to check that the large_matrix is only once in the main memory
 tt=time.time()
 pool = multiprocessing.Pool(processes=prc)
 result = pool.map(comp,range(n_vec))
 pool.terminate()
 time_multi = time.time()-tt 
print"Time using %2i processes. Time: %10.5f, Speedup:%10.5f" % (prc,time_multi,time_single/time_multi)

我在机器( 64bit Linux使用 18 ) 上运行了两个测试用例,结果如下:

andre@lot:python>python parallel_python_example.py 10000 50
Time: 10.3667809963
Time using 1 processes. Time: 15.75869, Speedup: 0.65785
Time using 2 processes. Time: 11.62338, Speedup: 0.89189
Time using 4 processes. Time: 15.13109, Speedup: 0.68513
Time using 10 processes. Time: 31.31193, Speedup: 0.33108
andre@lot:python>python parallel_python_example.py 1000 1000
Time: 4.9363951683
Time using 1 processes. Time: 5.14456, Speedup: 0.95954
Time using 2 processes. Time: 2.81755, Speedup: 1.75201
Time using 4 processes. Time: 1.64475, Speedup: 3.00131
Time using 10 processes. Time: 1.60147, Speedup: 3.08242

我的问题是,我是否滥用了多处理模块? 还是 python的方式( 例如 ) 。 不要在 python 中并行化,而是完全依赖于numpy的优化?

时间:原作者:8个回答

0 0

虽然对你的问题没有一般的答案,但我认为,仅仅说不是关键的关键,因为它是在 python 中的大量性能的关键。

然而,在原理上,python ( + 3rd 参与方模块) 对于数字处理。 找到合适的工具,你会大吃一惊的。 大多数时候,我相当确定,在编写( 多) 代码的过程中,编写代码的代码更少。 你只需要使用正确的工具和方法。 这是一个广泛的主题。 一些可能引起你兴趣的随机事情:

  • 你可以使用 scipy MKL和 OpenMP ( 或者你的设施中的系统管理员已经这么做了) 自己编译numpy和。 这样,许多线性代数操作将自动使用多个线程,并从你的机器中获得最好的。 这很简单,可能已经被低估了。 掌握一个正确编译过的numpy和 scipy !

  • multiprocessing 应该被理解为管理多个或者多个独立进程的有用工具。 这些进程之间的通信必须显式编程。 通信主要通过管道进行。 对彼此进行大量交谈的进程会花费大量的时间来交谈,而不是。 因此,在输入和输出数据的传输时间比计算时间小的情况下,最好使用 multiprocessing 。 还有一些技巧,比如在多个 multiprocessing 进程之间使用 Linux'fork() 行为和共享大量内存( 只读),而不用通过管道传递这些数据。 你可能想看看 http://stackoverflow.com/a/17786444/145400

  • Cython已经经提到,你可以以在特殊情况下使用它,并将性能关键代码部分替换为编译代码。

因为我对你的代码不太了解,所以我认为它不是很容易读的,所以( b ) 我认为它是关于正确解决问题的问题的。 你已经在基准测试中观察到我上面概述的内容: 在 multiprocessing的上下文中,密切关注通信开销是特别重要的。

一般而言,你应该总是尝试从 python 中找到一种方法来控制编译的代码,为你做繁重的工作。 Numpy和 scipy 提供了出色的接口。

原作者:
0 0

使用 python 进行数字处理。你可能应该了解 Cython 。 它是 python 和C 之间的中间语言。 它与numpy紧密结合,并支持使用openMP作为后端的paralellization 。

原作者:
0 0

从你提供的测试结果来看,你已经在两个核心机器上运行了测试。 我有其中一个并且运行了你的测试代码得到类似的结果。 这些结果显示,运行更多的流程比用于并行计算的数字应用程序的内核少。

在我的两个核心机器上,大约有 20%个CPU只是在保持我的环境 going,所以当我看到两个进程运行时,我确信所有的可用周期都在使用我的工作。 基本上,对于并行数字工作更好的内核,因为这提高了可以用的计算机的百分比。

它的他海报是完全正确的指向你,scipy,Cython 等等,首先需要使你的计算尽可以能多地使用多处理。

原作者:
...