Сбой Theano из-за смешения NumPy Fortran под Ubuntu

Я установил Theano на свой компьютер, но тесты Nose не работают с сообщением об ошибке, связанным с 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).

Но:

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
  • Убунту 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)


person Framester    schedule 16.08.2012    source источник


Ответы (4)


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

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

[blas]
ldflags = -lblas -lgfortran

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

person Alex Eftimiades    schedule 14.08.2013

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

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

[ИЗМЕНИТЬ]

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

person Pierre GM    schedule 27.08.2012
comment
@Framester, как сказано, если вы только что установили python-numpy, у вас нет файлов для его сборки. Вам потребуется apt-get source...+ apt-get build-dep..., затем скомпилировать и установить. Чтобы сделать его на 100% чистым с Ubuntu, вы можете собрать пакет, хотя для этого не нужно делать никаких идей. - person seberg; 27.08.2012
comment
Я все еще пытаюсь установить numpy вручную. К сожалению, scipy.org/Installing_SciPy/Linux находится в автономном режиме. - person Framester; 03.09.2012
comment
Еще раз спасибо за ваши советы. Я пытался следовать им, но все равно получаю ту же ошибку. Смотрите обновление. (уже +1 за оба) - person Framester; 03.09.2012
comment
О, я только что увидел, что пропустил исходный код apt-get ...+ версию apt-get build-dep. Я пробую это прямо сейчас. - person Framester; 03.09.2012

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

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')
person user212658    schedule 27.11.2012
comment
Спасибо! К сожалению, я не могу проверить это, так как я переустановил все, чтобы заставить его работать. +1 в любом случае - person Framester; 27.11.2012

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

person nouiz    schedule 14.08.2013