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 以使用这样的实现。
确保您相乘的矩阵都具有
dtype
或float32
或float64
(并满足某些对齐限制;我建议使用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矩阵乘法的多线程?的主要内容,如果未能解决你的问题,请参考以下文章