Numpy multiarray.so:未定义符号:cblas_sgemm

Posted

技术标签:

【中文标题】Numpy multiarray.so:未定义符号:cblas_sgemm【英文标题】:Numpy multiarray.so: undefined symbol: cblas_sgemm 【发布时间】:2016-01-05 19:28:58 【问题描述】:

我正在尝试在基于opensuse 的服务器上安装numpy==1.10.2scipymatplotlib。 我已经从源代码在virtualenv 中安装了numpy(我也尝试过pip - 当然结果相同)。现在,当我尝试在 python 控制台中导入 numpy 时,我收到以下错误:

ImportError: /home/user/.virtualenvs/project/lib/python2.7/site-packages/numpy/core/multiarray.so: undefined symbol: cblas_sgemm

注意:我不是此服务器的超级用户。

编辑:

ldd /home/user/.virtualenvs/project/lib/python2.7/site-packages/numpy/core/multiarray.so`
linux-vdso.so.1 (0x00007fffa0d69000)
libtatlas.so.3 => /home/user/.local/usr/lib64/atlas/libtatlas.so.3 (0x00007fe366d66000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe366a50000)
libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007fe3666b2000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe366496000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe3660f0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe367a15000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe365eec000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fe365ce9000)

libtatlas.so.3 => /home/user/.local/usr/lib64/atlas/libtatlas.so.3 - 由于 libatlas 的其他问题,我将其链接: ImportError: /usr/lib64/atlas/libtatlas.so.3: undefined symbol: clapack_ilaenv

解决方案

问题出在 ATLAS 库上。根据@ali_m 的建议,我使用OpenBLAS 而不是ATLAS 从源代码安装了numpy。 Here link to instruction how to install numpy with BLAS.

【问题讨论】:

您链接的 BLAS 库是什么?你能显示$ ldd /home/user/.virtualenvs/project/lib/python2.7/site-packages/numpy/core/multiarray.so的输出吗? 我用 ldd 的输出编辑了原始帖子 嗯...您自己编译了那个 ATLAS 库吗? IIRC,构建 ATLAS 是一个相当繁琐的过程,所以我想可能出了点问题。我建议改用 OpenBLAS - 它更容易编译,并且在我迄今为止遇到的每个基准测试中都比 ATLAS 更快。 好的。 ATLAS 编译看起来相当困难。我应该如何将 BLAS 与 numpy 一起使用?我对这个库一无所知... 我从 rpm 包中解压了这个库...一个小解决方法。明天我会尝试编译它。非常感谢您的帮助:) 【参考方案1】:

正如您在上面的 cmets 中提到的,您从 RPM 包中提取了 libtatlas.so.3 并将其复制到本地目录中,而不是从源代码构建它或通过包管理器安装它。我确定这是问题的原因。

尤其是clapack_*cblas_* 符号似乎没有在libtatlas.so.3 中定义。在我的 Ubuntu 机器上,如果我 sudo apt-get install libatlas-base-dev 我得到两个不同的共享库:

~$ ldconfig -p | grep atlas
        liblapack_atlas.so.3 (libc6,x86-64) => /usr/lib/liblapack_atlas.so.3
        liblapack_atlas.so (libc6,x86-64) => /usr/lib/liblapack_atlas.so
        libatlas.so.3 (libc6,x86-64) => /usr/lib/libatlas.so.3
        libatlas.so (libc6,x86-64) => /usr/lib/libatlas.so

clapack_*cgemm_* 符号在 liblapack_atlas.so.3 中定义,而不是在 libatlas_so.3 中定义:

~$ nm -D /usr/lib/libatlas.so.3 | grep clapack_ilaenv

~$ nm -D /usr/lib/libatlas.so.3 | grep cblas_sgemm

~$ nm -D /usr/lib/liblapack_atlas.so.3 | grep clapack_ilaenv
0000000000041d90 T clapack_ilaenv

~$ nm -D /usr/lib/liblapack_atlas.so.3 | grep cblas_sgemm
                 U cblas_sgemm

鉴于您没有管理员权限,因此无法通过正常的系统包管理器安装 ATLAS,以下是三种可能的解决方案:

可能可以从不同的 RPM 包中提取 liblapack_atlas.so.3(或任何 OpenSUSE 等价物)的二进制文件,并通过修改 site.cfg 文件让 numpy 链接到它在 numpy 源目录中。 另一个选择是build ATLAS from source,但根据我的经验,这是一个漫长而痛苦的过程。 我个人的建议是构建 OpenBLAS,如我之前的回答 here 中所述。它更容易编译,并且在我迄今为止遇到的每个基准测试中都有更好的性能。

【讨论】:

以上是关于Numpy multiarray.so:未定义符号:cblas_sgemm的主要内容,如果未能解决你的问题,请参考以下文章

使用 numpy 和 gdal 的 Python C 扩展在运行时给出未定义的符号

未定义符号:ATL_chemv

多处理 numpy 未定义错误

在 C++ 中使用 numpy 数组的“未定义引用”错误

未定义符号 体系结构 x86_64 的未定义符号:“_kCFAllocatorDefault”

Firebase 未定义符号