numpy matrix mult 在 HPC 上并行化时不起作用
numpy matrix mult does not work when it is parallized on HPC
我有两个密集矩阵,大小为 (2500, 208) 和 (208, 2500)。我想计算他们的产品。当它是单个进程时,它运行良好且速度很快,但当它处于多处理块中时,进程会在那里停留数小时。我用更大的尺寸做稀疏矩阵乘法,但我没有问题。我的代码如下所示:
with Pool(processes=agents) as pool:
result = pool.starmap(run_func, args)
def run_func(args):
#Do stuff. Including large sparse matrices multiplication.
C = np.matmul(A,B) # or A.dot(B) or even using BLASS library directly dgemm(1, A, B)
#Never go after the line above!
请注意,当函数run_func
在单个进程中执行时,它可以正常工作。当我在本地机器上进行多处理时,它工作正常。当我在 HPC 上进行多处理时,它卡住了。我这样分配我的资源:
srun -v --nodes=1 --time 7-0:0 --cpus-per-task=2 --nodes=1 --mem-per-cpu=20G python3 -u run.py 2
其中最后一个参数是上面代码中agents
的个数。以下是 HPC 支持的 LAPACK 库详细信息(从 numpy 获得):
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['**/include']
blas_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['**/include']
lapack_mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['**/include']
lapack_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['**/include']
与我的本地计算机相比,HPC 上的所有 python 软件包和 python 版本都是相同的。有什么线索吗?
作为解决方法,我尝试了多线程而不是多处理,现在问题已解决。我不确定多处理背后的问题是什么。
使用 multiprocessing
时,变量不会在进程之间共享,因为多个进程不会 运行 在同一内存中 space。但是,当使用 threading
时,同一内存中的线程 运行 space。这就是您的线程解决方案有效的原因。
在这里你需要决定你是需要多处理还是多线程。 threading
将是一个更直接的解决方案,没有其他共享对象的技巧,就像您的第二个解决方案一样。但是,Python 的全局解释器锁 (GIL) 可能是性能瓶颈,因为一次只有一个线程可以占用 Python 解释器。
另一方面,multiprocessing
可以为您提供多个内核和CPU,您还可以避免Python的全局解释器锁(GIL)。如果您选择多处理,我建议使用 multiprocessing
模块中的 Manager
和 Value
类 以及那些 类 您仍然可以在不同进程之间共享对象并解决你的问题。 In this answer 您可以找到关于这些内容的简短摘要 类。
我有两个密集矩阵,大小为 (2500, 208) 和 (208, 2500)。我想计算他们的产品。当它是单个进程时,它运行良好且速度很快,但当它处于多处理块中时,进程会在那里停留数小时。我用更大的尺寸做稀疏矩阵乘法,但我没有问题。我的代码如下所示:
with Pool(processes=agents) as pool:
result = pool.starmap(run_func, args)
def run_func(args):
#Do stuff. Including large sparse matrices multiplication.
C = np.matmul(A,B) # or A.dot(B) or even using BLASS library directly dgemm(1, A, B)
#Never go after the line above!
请注意,当函数run_func
在单个进程中执行时,它可以正常工作。当我在本地机器上进行多处理时,它工作正常。当我在 HPC 上进行多处理时,它卡住了。我这样分配我的资源:
srun -v --nodes=1 --time 7-0:0 --cpus-per-task=2 --nodes=1 --mem-per-cpu=20G python3 -u run.py 2
其中最后一个参数是上面代码中agents
的个数。以下是 HPC 支持的 LAPACK 库详细信息(从 numpy 获得):
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['**/include']
blas_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['**/include']
lapack_mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['**/include']
lapack_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['**/include']
与我的本地计算机相比,HPC 上的所有 python 软件包和 python 版本都是相同的。有什么线索吗?
作为解决方法,我尝试了多线程而不是多处理,现在问题已解决。我不确定多处理背后的问题是什么。
使用 multiprocessing
时,变量不会在进程之间共享,因为多个进程不会 运行 在同一内存中 space。但是,当使用 threading
时,同一内存中的线程 运行 space。这就是您的线程解决方案有效的原因。
在这里你需要决定你是需要多处理还是多线程。 threading
将是一个更直接的解决方案,没有其他共享对象的技巧,就像您的第二个解决方案一样。但是,Python 的全局解释器锁 (GIL) 可能是性能瓶颈,因为一次只有一个线程可以占用 Python 解释器。
另一方面,multiprocessing
可以为您提供多个内核和CPU,您还可以避免Python的全局解释器锁(GIL)。如果您选择多处理,我建议使用 multiprocessing
模块中的 Manager
和 Value
类 以及那些 类 您仍然可以在不同进程之间共享对象并解决你的问题。 In this answer 您可以找到关于这些内容的简短摘要 类。