Numpy multiarray.so: 未定义符号: cblas_sgemm
Numpy multiarray.so: undefined symbol: cblas_sgemm
我正在尝试在基于 opensuse
的服务器上安装 numpy==1.10.2
、scipy
和 matplotlib
。
我已经从源代码安装 numpy
in virtualenv
(我也尝试过 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.
正如您在上面的评论中提到的,您从 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 等效项)的二进制文件,并将 numpy 获取到 link 通过修改 numpy 源目录中的 site.cfg
文件来反对它。
- 另一种选择是 build ATLAS from source,但根据我的经验,这是一个漫长而痛苦的过程。
- 我个人的建议是构建 OpenBLAS,如我之前的回答 here 中所述。它更容易编译,并且在我目前遇到的每个基准测试中都有更好的性能。
我正在尝试在基于 opensuse
的服务器上安装 numpy==1.10.2
、scipy
和 matplotlib
。
我已经从源代码安装 numpy
in virtualenv
(我也尝试过 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.
正如您在上面的评论中提到的,您从 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 等效项)的二进制文件,并将 numpy 获取到 link 通过修改 numpy 源目录中的site.cfg
文件来反对它。 - 另一种选择是 build ATLAS from source,但根据我的经验,这是一个漫长而痛苦的过程。
- 我个人的建议是构建 OpenBLAS,如我之前的回答 here 中所述。它更容易编译,并且在我目前遇到的每个基准测试中都有更好的性能。