Подтвердить что ты не робот

Theano терпит неудачу из-за микширования NumPy Fortran под Ubuntu

Я установил Theano на моем компьютере, но носитеты ломаются с сообщением об ошибке, связанным с Numpy/Fortran. Для меня это похоже, что Numpy был скомпилирован с другой версией Fortran, чем Theano. Я уже переустановил 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).

Но:

[email protected]:/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')
  • python 2.6.6
  • Ubuntu 10.10

[ОБНОВЛЕНИЕ]

Итак, я удалил numpy и scipy из своей системы с помощью apt-get remove и используя find -name XXX -delete того, что осталось.

Чем я установил numpy и scipy из источников github с помощью sudo python setpy.py install.

Затем я снова ввела sudo pip uninstall theano и sudo pip install --upgrade --no-deps theano.

Ошибка сохраняется:/

Я также пробовал подход apt-get source... + apt-get build-dep ..., но для моего старого Ubuntu (10.10) он устанавливает слишком старую версию numpy и scipy для theano: ValueError: numpy >= 1.4 is required (detected 1.3.0 from /usr/local/lib/python2.6/dist-packages/numpy/__init__.pyc)

4b9b3361

Ответ 1

У меня была та же проблема, и после просмотра исходного кода ответ user212658 выглядел так, как будто это сработает (я не пробовал). Затем я искал способ развертывания взлома user212658 без изменения исходного кода.

Поместите эти строки в файл theanorc:

[blas]
ldflags = -lblas -lgfortran

Это сработало для меня.

Ответ 2

Вы пытались перекомпилировать NumPy из источников?

Я не знаком с системой пакетов Ubuntu, поэтому я не могу проверить, что в вашем dist-packages/numpy. С чистым архивом источников NumPy вы должны иметь setup.py на том же уровне, что и каталоги NumPy, tools и benchmarks (среди прочих). Я уверен, что тот, который вы хотите использовать для python setup.py build.

[EDIT]

Теперь, когда вы перекомпилировали NumPy с помощью правильной опции --fcompiler, возможно, вы могли бы попытаться сделать то же самое с Theano, то есть компилировать непосредственно из источников, не полагаясь на apt-get или даже pip. У вас должен быть лучший контроль над процессом сборки таким образом, что облегчит отладку/попытку найти решение.

Ответ 3

У меня была та же проблема. Решение, которое я нашел, заключается в том, чтобы добавить хак в anano/gof/cmodule.py, чтобы связать его с gfortran, когда "blas" находится в lib. Это исправило это.

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')

Ответ 4

Лучшее решение - удалить атлас и установить openblas. openblas быстрее атласа. Кроме того, openblas не запрашивает gfortran и связан с одним numpy. Поэтому он будет работать из коробки.