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