从Baz运行Python脚本时找不到动态库

2024-04-25 03:50:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在OSx 10.11.6上设置支持CUDA的Python和TensorFlow环境

一切都很顺利。首先,我安装了以下内容:

  • 库达-7.5
  • 铜-5.1

我通过将以下内容添加到我的~/.bash_配置文件中,确保正确设置了LD_LIBRARY_路径和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

我从:https://github.com/tensorflow/magenta签出了洋红项目 并使用以下方法运行所有测试:

^{pr2}$

他们都过去了。在

到目前为止还不错。所以我决定尝试一下支持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_路径没有设置。在

我搜索了文档,找到了--action\u env和--test_env标志,但它们实际上似乎都没有为执行设置LD_LIBRARY_路径。在

这些是从.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的解决方法?在


Tags: pathimporthomelibpackagesusrlocaltensorflow
3条回答

使用

export LD_LIBRARY_PATH=/usr/local/cuda/lib64/

在发射bazel之前。如果有这样的文件,请仔细检查上面的目录。在

^{pr2}$

请注意,在Macosx中,名称是不同的:

export DYLD_LIBRARY_PATH=/usr/local/cuda/lib/

有关SuperUser的详细信息,请参阅此答案

看起来SIP影响DYLD_库路径如何传播到子进程的行为。我找到了一个similar problem和另一个{a3}。在

我不想关闭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

相关问题 更多 >