运行 来自 Bazel 的 Python 脚本时找不到动态库
Cannot find dynamic library when running a Python script from Bazel
我正在尝试在 OSx 10.11.6
上设置支持 CUDA 的 Python 和 TensorFlow 环境
一切都很顺利。首先我安装了以下内容:
- CUDA-7.5
- cuDNN - 5.1
我通过将以下内容添加到我的 ~/.bash_profile 文件中来确保 LD_LIBRARY_PATH 和 CUDA_HOME 设置正确:
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 安装了以下内容:
- python - 2.7.12_2
- 巴泽尔 - 0.3.2
- protobuf - 3.1.0
然后我使用 Pip 安装 CPU 只有 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/...
而且都通过了。
到目前为止一切顺利。所以我决定试一试支持 GPU 的 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 库。
我确实在没有 Bazel 的情况下从 Python 尝试了 运行ning GPU 计算,一切似乎都很好。
我也确实创建了一个测试脚本并使用 Bazel 运行 它似乎可以访问包含 libcudart.7.5.dylib 库的目录,但是 LD_LIBRARY_PATH 不是设置。
我搜索了文档并找到了 --action_env 和 --test_env 标志,但其中 none 实际上似乎为执行设置了 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 的解决方法?
使用
export LD_LIBRARY_PATH=/usr/local/cuda/lib64/
在启动 bazel 之前。仔细检查上面的目录是否有这样的文件。
ls /usr/local/cuda/lib64/libcudart.7.5.dylib
请注意,在 Macosx 中名称不同:
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib/
有关 SuperUser
的更多信息,请参阅此答案
看起来像SIP affects the behavior of how the DYLD_LIBRARY_PATH gets propagated to the child processes. I found a similar problem and another similar problem。
我不想关闭 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
我正在尝试在 OSx 10.11.6
上设置支持 CUDA 的 Python 和 TensorFlow 环境一切都很顺利。首先我安装了以下内容:
- CUDA-7.5
- cuDNN - 5.1
我通过将以下内容添加到我的 ~/.bash_profile 文件中来确保 LD_LIBRARY_PATH 和 CUDA_HOME 设置正确:
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 安装了以下内容:
- python - 2.7.12_2
- 巴泽尔 - 0.3.2
- protobuf - 3.1.0
然后我使用 Pip 安装 CPU 只有 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/...
而且都通过了。
到目前为止一切顺利。所以我决定试一试支持 GPU 的 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 库。
我确实在没有 Bazel 的情况下从 Python 尝试了 运行ning GPU 计算,一切似乎都很好。
我也确实创建了一个测试脚本并使用 Bazel 运行 它似乎可以访问包含 libcudart.7.5.dylib 库的目录,但是 LD_LIBRARY_PATH 不是设置。
我搜索了文档并找到了 --action_env 和 --test_env 标志,但其中 none 实际上似乎为执行设置了 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 的解决方法?
使用
export LD_LIBRARY_PATH=/usr/local/cuda/lib64/
在启动 bazel 之前。仔细检查上面的目录是否有这样的文件。
ls /usr/local/cuda/lib64/libcudart.7.5.dylib
请注意,在 Macosx 中名称不同:
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib/
有关 SuperUser
的更多信息,请参阅此答案看起来像SIP affects the behavior of how the DYLD_LIBRARY_PATH gets propagated to the child processes. I found a similar problem and another similar problem。
我不想关闭 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