Не удается найти динамическую библиотеку при запуске скрипта 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
  • protobuf - 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 с поддержкой GPU и установить ее по адресу: 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

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

ОБНОВИТЬ

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

3 ответа

Решение

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

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

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

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

Проблема действительно 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

Использование

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

Другие вопросы по тегам