从Bazel

时间:2016-10-18 10:20:51

标签: python macos tensorflow bazel

我正在尝试设置启用CUDA的Python& OSx 10.11.6上的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
  • bazel - 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运行GPU计算,一切似乎都很好。

我也创建了一个测试脚本并使用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不同?

3 个答案:

答案 0 :(得分:1)

看起来SIP会影响DYLD_LIBRARY_PATH如何传播到子进程的行为。我找到了similar problem和另一个similar problem

我不想关闭SIP,所以我只是将CUDA库的符号链接创建到标准位置。

ID|PartNumber|PartPrice|DateEffective
1 | AA001    |$0.10    |1/1/2016
2 | AA002    |$0.20    |1/1/2016
3 | AA003    |$0.30    |1/1/2016
4 | AA001    |$0.15    |10/20/2016

不确定这是否是最佳解决方案,但它确实有效,并且不需要禁用SIP。

答案 1 :(得分:0)

使用

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

的更多信息,请参阅此答案

答案 2 :(得分:0)

问题确实是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