13

我在我的机器上安装了Theano,但鼻子测试因 Numpy/Fortran 相关的错误消息而中断。对我来说,看起来 Numpy 是用与 Theano 不同的 Fortran 版本编译的。我已经重新安装了 Theano ( sudo pip uninstall theano+ sudo pip install --upgrade --no-deps theano) 和 Numpy / Scipy ( apt-get install --reinstall python-numpy python-scipy),但这并没有帮助。

你会推荐什么步骤?

完整的错误信息:

ImportError: ('/home/Nick/.theano/compiledir_Linux-2.6.35-31-generic-x86_64-with-Ubuntu-10.10-maverick--2.6.6/tmpIhWJaI/0c99c52c82f7ddc775109a06ca04b360.so: undefined symbol: _gfortran_st_write_done'

我的研究:

有关错误的安装 SciPy / BuildingGeneral页面undefined symbol: _gfortran_st_write_done'

如果您看到错误消息

ImportError: /usr/lib/atlas/libblas.so.3gf: undefined symbol: _gfortran_st_write_done

在构建 SciPy 时,这意味着 NumPy 在构建过程中选择了错误的 Fortran 编译器(例如 ifort)。

使用以下命令重新编译 NumPy:

python setup.py build --fcompiler=gnu95

或任何合适的(见python setup.py build --help-fcompiler)。

但:

Nick@some-serv2:/usr/local/lib/python2.6/dist-packages/numpy$ python setup.py build --help-fcompiler
This is the wrong setup.py file to run

使用的软件版本:

  • scipy 0.10.1(scipy.test() 有效)
  • NumPy 1.6.2(numpy.test() 有效)
  • theano 0.5.0(几个测试失败undefined symbol: _gfortran_st_write_done'
  • 蟒蛇2.6.6
  • Ubuntu 10.10

[更新]

apt-get remove所以我用剩下的东西从我的系统中删除了 numpy 和 scipy find -name XXX -delete

比我用sudo python setpy.py install.

后来我又进去sudo pip uninstall theanosudo pip install --upgrade --no-deps theano

错误仍然存​​在:/

我也尝试了apt-get source... +apt-get build-dep ...方法,但是对于我的旧 Ubuntu (10.10),它为 theano 安装了太旧版本的 numpy 和 scipy:ValueError: numpy >= 1.4 is required (detected 1.3.0 from /usr/local/lib/python2.6/dist-packages/numpy/__init__.pyc)

4

4 回答 4

11

我遇到了同样的问题,在查看源代码后,user212658 的答案似乎可行(我没有尝试过)。然后,我寻找一种方法来部署 user212658 的 hack,而无需修改源代码。

将这些行放在您的theanorc文件中:

[blas]
ldflags = -lblas -lgfortran

这对我有用。

于 2013-08-14T17:48:02.127 回答
2

您是否尝试过从源代码重新编译 NumPy?

我不熟悉 Ubuntu 软件包系统,所以我无法检查您的dist-packages/numpy. 使用干净的NumPy源存档,您应该具有setup.py与目录相同的级别numpytools并且benchmarks(以及其他)。我很确定这是您要用于python setup.py build.

[编辑]

既然您已经numpy使用正确的选项重新编译,--fcompiler也许您可​​以尝试对. 您应该以这种方式更好地控制构建过程,这将使调试/尝试找到解决方案更容易。Theanoapt-getpip

于 2012-08-27T13:06:16.947 回答
1

我有同样的问题。我找到的解决方案是在 theano/gof/cmodule.py 中添加一个 hack,以在库中有“blas”时链接到 gfortran。那解决了它。

class GCC_compiler(object):
   ...
    @staticmethod
    def compile_str(module_name, src_code, location=None,
                    include_dirs=None, lib_dirs=None, libs=None,
                    preargs=None):
        ...
        cmd.extend(['-l%s' % l for l in libs])
        if 'blas' in libs:
            cmd.append('-lgfortran')
于 2012-11-27T07:34:10.480 回答
0

更好的解决方法是删除 atlas 并安装 openblas。openblas 比 atlas 更快。此外,openblas 不请求 gfortran,并且是与 numpy 相关联的一个。所以它会开箱即用。

于 2013-08-14T20:03:51.183 回答