numpy/pandas矩阵乘法的多线程?

Posted

技术标签:

【中文标题】numpy/pandas矩阵乘法的多线程?【英文标题】:Multithreading on numpy/pandas matrix multiplication? 【发布时间】:2014-05-16 02:48:31 【问题描述】:

我真的很想知道如何在 numpy/pandas 上利用多核处理进行矩阵乘法。

我正在尝试的是:

M = pd.DataFrame(...) # super high dimensional square matrix.
A = M.T.dot(M) 

这需要大量的处理时间,因为有很多乘积,而且我认为使用多线程来进行巨大的矩阵乘法是很简单的。所以,我在仔细搜索,但在 numpy/pandas 上找不到如何做到这一点。我需要用一些python内置的线程库手动编写多线程代码吗?

【问题讨论】:

不要在 pandas 中执行此操作(如果是矩阵操作),请留在 numpy.这个函数lambda x: x.T.dot(x) 有另一个名字吗(它可能已经有一个 numpy 函数,你可以用 numba 或其他东西调用它)... 在我的 fedora 20 python/numpy 安装中,我看到在大型 x.T.dot(x) calc 上使用了多个内核。整个脚本(包括创建矩阵)的 CPU 百分比为 282%。在这种情况下,多核支持是 numpy 链接到什么库的函数吗? 您必须使用 Intel 的 MKL 库编译您的 numpy。您可以通过import numpy as np; np.show_config()查看 谢谢你们。很抱歉我没有告诉我的环境,Mac OSX。我尝试了 MKL 库(anaconda 包),但它似乎没有使用多核(只是 cpu 100%)。我想只有 linux 用户才能享受 MKL 的多核功能,因为this benchmark 将 OSX 视为单核。 @Martin 除了 MKL 之外,还有更多的多线程 BLAS 实现——我强烈推荐OpenBLAS,它是开源的,性能与专有的 MKL 库相当。 ATLAS 是另一种选择,尽管我的经验是编译起来更慢而且更痛苦。 【参考方案1】:

在 NumPy 中,多线程矩阵乘法可以通过 BLAS(基本线性代数子程序)的多线程实现来实现。您需要:

    有这样的BLAS实现; OpenBLAS、ATLAS 和 MKL 都包含多线程矩阵乘法。 编译一个 NumPy 以使用这样的实现。 确保您相乘的矩阵都具有dtypefloat32float64(并满足某些对齐限制;我建议使用NumPy 1.7.1 或更高版本,这些已放宽)。李>

有一些注意事项:

旧版本的 OpenBLAS 在使用 GCC 编译时,在使用 multiprocessing 的程序中会遇到问题,其中包括大多数使用 joblib 的应用程序。特别是,他们会挂起。原因是 GCC 中的错误(或缺少功能)。 patch 已提交,但尚未包含在主线源中。 您在典型 Linux 发行版中找到的 ATLAS 包可能会或可能不会被编译为使用多线程。

至于 Pandas:我不确定它是如何做点积的。转换为 NumPy 数组并返回以确保。

【讨论】:

【参考方案2】:

首先,我还建议转换为颠簸数组并使用 numpys dot 函数。如果您可以访问目前或多或少是最快实现的 MKL 构建,您应该尝试设置环境变量 OMP_NUM_THREADS。这应该会激活系统的其他核心。在我的 MAC 上,它似乎工作正常。另外我会尝试使用np.einsum,这似乎比np.dot更快

但请注意!如果您编译了一个使用 OpenMP 进行并行化的多线程库(如 MKL),您必须考虑,所有苹果系统上的“默认 gcc”不是 gcc,它是 Clang/LLVM 并且 Clang 无法构建目前支持 OpenMP,除非您使用仍处于试验阶段的 OpenMP 主干。所以你必须安装英特尔编译器或任何其他支持 OpenMP 的工具

【讨论】:

以上是关于numpy/pandas矩阵乘法的多线程?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的多线程矩阵乘法

使用win32线程的矩阵乘法

python 多线程稀疏矩阵乘法

使用 CUDA 进行矩阵乘法:2D 块与 1D 块

OpenMP 矩阵向量乘法仅在一个线程上执行

在矩阵乘法中使用 C++2011 线程而不是 OpenMP 时出现异常加速