Не удается найти динамическую библиотеку при запуске скрипта Python из Bazel

Я пытаюсь настроить среду Python и TensorFlow с поддержкой CUDA на OSx 10.11.6.

Все прошло довольно гладко. Сначала я установил следующее:

  • CUDA-7.5
  • cuDNN — 5.1

Я убедился, что LD_LIBRARY_PATH и CUDA_HOME установлены правильно, добавив следующее в мой файл ~/.bash_profile:

export CUDA_HOME=/usr/local/cuda 
export DYLD_LIBRARY_PATH="$CUDA_HOME/lib:$DYLD_LIBRARY_PATH"
export LD_LIBRARY_PATH="$CUDA_HOME/lib:$LD_LIBRARY_PATH"
export PATH="$CUDA_HOME/bin:$PATH"

Затем я использовал Brew для установки следующего:

  • питон — 2.7.12_2
  • базель - 0,3,2
  • протобуф - 3.1.0

Затем я использовал Pip для установки только ЦП TensorFlow из: https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.11.0rc0-py2-none-any.whl

Я проверил проект Magenta с: https://github.com/tensorflow/magenta и запустил все протестировать с помощью:

bazel test //magenta/...

И все они прошли.

Все идет нормально. Поэтому я решил попробовать версию TensorFlow с поддержкой графического процессора и установил ее из: https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow-0.11.0rc0-py2-none-any..whl

Теперь все тесты завершаются со следующей ошибкой:

import tensorflow as tf
  File "/usr/local/lib/python2.7/site-packages/tensorflow/__init__.py", line 23, in <module>
    from tensorflow.python import *
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/__init__.py", line 49, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so, 10): Library not loaded: @rpath/libcudart.7.5.dylib
  Referenced from: /usr/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so
  Reason: image not found

Таким образом, очевидно, что скрипт, запущенный из Bazel, не может найти библиотеку libcudart.7.5.dylib.

Я попытался запустить вычисления на GPU из Python без Bazel, и все вроде бы в порядке.

Я также создал тестовый сценарий и запустил его с помощью Bazel, и кажется, что каталог, содержащий библиотеку libcudart.7.5.dylib, доступен, однако LD_LIBRARY_PATH не установлен.

Я просмотрел документацию и нашел флаги --action_env и --test_env, но ни один из них на самом деле не устанавливает LD_LIBRARY_PATH для выполнения.

Это параметры, загруженные из файлов .bazelrc.

Inherited 'common' options: --isatty=1 --terminal_columns=80
Inherited 'build' options: --define=allow_oversize_protos=true --copt -funsigned-char -c opt --spawn_strategy=standalone
'run' options: --spawn_strategy=standalone

Как правильно сообщить Bazel о зависимостях времени выполнения?

ОБНОВЛЕНИЕ

Проблема, по-видимому, вызвана тем фактом, что команда «env» является частью цепочки выполнения и, похоже, очищает переменные окружения LD_LIBRARY_PATH и DYLD_LIBRARY_PATH. Есть ли обходной путь, отличный от отключения SIP?


person Binus    schedule 18.10.2016    source источник


Ответы (3)


Похоже, SIP влияет на то, как DYLD_LIBRARY_PATH передается дочернему процессы. Я обнаружил похожую проблему и еще одну похожая проблема.

Я не хотел отключать SIP, поэтому просто создал символические ссылки для библиотеки CUDA в стандартном месте.

ln -s /usr/local/cuda/lib/* /usr/local/lib

Не уверен, что это лучшее решение, но оно работает и не требует отключения SIP.

person Binus    schedule 27.10.2016

Использовать

export LD_LIBRARY_PATH=/usr/local/cuda/lib64/

перед запуском Базеля. Дважды проверьте в каталоге выше, есть ли такой файл.

ls /usr/local/cuda/lib64/libcudart.7.5.dylib 

Обратите внимание, что в Macosx имя другое:

export DYLD_LIBRARY_PATH=/usr/local/cuda/lib/

См. этот ответ для получения дополнительной информации о SuperUser

person fabrizioM    schedule 18.10.2016
comment
Это должен быть каталог lib64? Мой CUDA поставляется только с каталогом lib. Я попытался переименовать его и экспортировать LD_LIBRARY_PATH, но безуспешно. Опять же, если я запускаю python somefile.py, все в порядке, но если я запускаю bazel //directory:target_with_the_same_file, он не работает. Поэтому я думаю, что мне не хватает некоторых параметров Bazel, и моя настройка среды в порядке. - person Binus; 18.10.2016
comment
нет, неважно, lib64 или lib, но путь должен совпадать. Вы на макосксе? LD_LIBRARY_PATH на Mac отличается. это DYLD_LIBRARY_PATH - person fabrizioM; 18.10.2016
comment
Спасибо за предложения. На самом деле я установил как LD_LIBRARY_PATH, так и DYLD_LIBRARY_PATH, просто чтобы быть уверенным. Из тестов, которые я запускал до сих пор, кажется, что Python может выбрать любой из них, тогда как Bazel просто очищает их оба во время выполнения. - person Binus; 18.10.2016
comment
Пожалуйста, взгляните на мой ответ здесь. stackoverflow.com/a/41073045/1831325 - person norman_h; 10.12.2016

Проблема действительно в SIP, и решение состоит в том, чтобы передать --action_env DYLD_LIBRARY_PATH=$CUDA_HOME/lib команде bazel, например:

bazel build -c opt --config=cuda --action_env DYLD_LIBRARY_PATH=$CUDA_HOME/lib //tensorflow/tools/pip_package:build_pip_package

person Roee Shenberg    schedule 10.01.2017
comment
Спасибо за ответ. Создание собственного TensorFlow, безусловно, вариант. Однако я помню, что у меня были некоторые проблемы с совместимостью всех зависимостей, поэтому в итоге я использовал предварительную сборку. - person Binus; 15.01.2017