numpy矩阵mult在HPC上并行时不起作用

2024-06-13 16:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个稠密矩阵,大小分别是(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版本都是相同的。有什么线索吗


Tags: runnonelibrariesinclude进程liblibraryscipy
2条回答

作为一种解决方法,我尝试了多线程而不是多处理,现在问题已经解决了。但我不确定多重处理背后的问题是什么

使用multiprocessing时,变量不会在进程之间共享,因为多个进程不会在同一内存空间中运行。但是,当使用threading时,线程在相同的内存空间中运行。这就是为什么线程解决方案有效的原因

在这里,您需要决定是需要多处理还是线程threading将是一个更直截了当的解决方案,与您的第二个解决方案一样,不需要额外的技巧来共享对象。然而,Python的全局解释器锁(GIL)可能是一个性能瓶颈,因为一次只有一个线程可以控制Python解释器

另一方面,multiprocessing可以为您提供多核和CPU,还可以避免Python的全局解释器锁(GIL)。如果您选择多处理,我建议您使用multiprocessing模块中的ManagerValue类,通过这些类,您仍然可以在不同的进程之间共享对象并解决您的问题In this answer您可以找到这些类的简要摘要

相关问题 更多 >