【问题标题】:Cannot find dynamic library when running a Python script from Bazel从 Bazel 运行 Python 脚本时找不到动态库
【发布时间】:2017-02-27 13:44:55
【问题描述】:

我正在尝试在 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
  • 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 不同的解决方法?

【问题讨论】:

    标签: python macos tensorflow bazel


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      使用

      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的更多信息,请参阅此答案

      【讨论】:

      • 必须是lib64目录吗?我的 CUDA 只带有一个 lib 目录。我试图重命名它并导出 LD_LIBRARY_PATH,但没有运气。同样,如果我运行 python somefile.py 一切都很好,但是如果我执行 bazel //directory:target_with_the_same_file 它就坏了。所以我认为我缺少一些 Bazel 选项,我的环境设置很好。
      • 不,是lib64还是lib都没有关系,但它必须匹配路径。你在 macOS 上吗? mac 上的 LD_LIBRARY_PATH 不同。是 DYLD_LIBRARY_PATH
      • 感谢您的建议。我实际上设置了 LD_LIBRARY_PATH 和 DYLD_LIBRARY_PATH 只是为了确定。从我目前运行的测试来看,Python 似乎能够选择其中任何一个,而 Bazel 只是在执行期间将它们都清除了。
      • 请看我这里的回答。 stackoverflow.com/a/41073045/1831325
      【解决方案3】:

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

      【讨论】:

      • 感谢您的回答。构建自己的 TensorFlow 无疑是一种选择。但是我记得在所有依赖项的兼容性方面存在一些问题,所以我最终使用了预构建的。
      猜你喜欢
      • 2018-03-31
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2018-03-01
      • 2020-11-04
      • 2021-11-04
      相关资源
      最近更新 更多