dyld: 库未加载: @rpath/libcudart.8.0.dylib,在 Mac OSX 上构建 TensorFlow 时。

13

我正在我的Mac上(一个黑苹果,所以我有一个GPU,并且已经安装了CUDA8.0。它在构建caffe时可以正常工作,所以我确信它是有效的)。 我已经按照以下方式设置了环境变量(我将这些放在.zshrc.bash_profile.bashrc中):

export CUDA_HOME=/usr/local/cuda
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$CUDA_HOME/lib"
export PATH="$CUDA_HOME/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$CUDA_HOME/lib:$CUDA_HOME/extras/CUPTI/lib"

./configure 命令正常运行。然后我使用命令 bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package 来进行构建。 然后出现了以下错误:

    ERROR: /Development/tensorflow/tensorflow/python/BUILD:572:1: Executing genrule //tensorflow/python:array_ops_pygenrule failed: bash failed: error executing command /bin/bash -c ... (remaining 1 argument(s) skipped): com.google.devtools.build.lib.shell.AbnormalTerminationException: Process terminated by signal 5.
dyld: Library not loaded: @rpath/libcudart.8.0.dylib
  Referenced from: /private/var/tmp/_bazel_zarzen/bdf1cb43f3ff02468b610730bd03f348/execroot/tensorflow/bazel-out/host/bin/tensorflow/python/gen_array_ops_py_wrappers_cc
  Reason: image not found
/bin/bash: line 1: 92702 Trace/BPT trap: 5       bazel-out/host/bin/tensorflow/python/gen_array_ops_py_wrappers_cc @tensorflow/python/ops/hidden_ops.txt 1 > bazel-out/local_darwin-opt/genfiles/tensorflow/python/ops/gen_array_ops.py
Target //tensorflow/tools/pip_package:build_pip_package failed to build

我可以确保缺失的库已经存在。我还尝试安装预构建的二进制文件(我知道它仅支持CUDA7.5,因此我设置了PATH来指向CUDA7.5,但是没有成功。当我尝试 import tensorflow 时,出现类似的错误 Library not loaded: @rpath/libcudart.7.5.dylib,只有版本号不同)。

我不知道为什么无法找到 lib。有人能帮忙吗?或者有什么建议吗?


我曾经看到SIP干扰了rpath dyld加载,如果你使用的是El Capitan(系统完整性保护),你可以尝试禁用它。 - Yaroslav Bulatov
你解决了吗?我这里也出现了同样的错误。 - Stefan
不,但是按照Vijay的指示操作可以帮助您通过构建阶段。然而,在“import”阶段仍然找不到“dylib”。 - Zen
禁用SIP需要帮助! - Zen
您可以在此 GitHub 线程上找到有关在 macOS 上构建 TensorFlow 的教程以及更多讨论:https://github.com/tensorflow/tensorflow/issues/9072#issue - Ericvulpi
2个回答

9
以下内容可以解决这个错误。
找到文件“genrule-setup.sh”。该文件应该在
<tensorflow source dir>/bazel-tensorflow/external/bazel_tools/tools/genrule/

如果这个文件的时间戳改变了,那么 Bazel 构建将失败,并显示该文件已损坏。因此,在修改此文件之前,请记录时间戳。
stat genrule-setup.sh

您应该得到如下输出:
16777220 25929227 -rwxr-xr-x 1 user wheel 0 242 "Oct 12 23:46:28 2016" "Oct 10 21:49:39 2026" "Oct 12 21:49:39 2016" "Oct 12 21:49:38 2016" 4096 8 0 genrule-setup.sh

请记录上面输出中的第二个时间戳"Oct 10 21:49:39 2026"

编辑genrule-setup.sh文件

nano genrule-setup.sh

将环境配置添加到文件末尾。
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib

保存并关闭编辑器。

然后将时间戳更改为原始时间戳。

touch -t YYYYMMDDhhmm.SS genrule-setup.sh

例如,
touch -t 202610102149.39 genrule-setup.sh

最后,创建一个符号链接以避免“Segmentation fault: 11”错误。
ln -sf /usr/local/cuda/lib/libcuda.dylib /usr/local/cuda/lib/libcuda.1.dylib

现在重新启动构建。
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

2
现在我可以构建了。但是在构建和安装之后,我尝试再次导入tensorflow,又出现了“找不到图像”的错误。``` - Zen
你是否正在使用Tensorflow运行某些第三方库或应用程序?要检查Tensorflow是否已正确安装,请运行python -c“import tensorflow as f”并查看是否没有错误消息。 - Vijay
出现错误 ImportError: dlopen(/usr/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so, 10): Library not loaded: @rpath/libcudart.8.0.dylib Referenced from: /usr/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so Reason: image not found。导入tensorflow时出错。除非您正在使用bazel,否则不应尝试从源目录导入tensorflow;请退出tensorflow源树,并重新启动您的python解释器。我没有第三方库,我只想运行tensoflow GPU版本。 - Zen
你是在什么时候遇到这个错误的?我的意思是,你正在运行哪个程序或代码来测试tensorflow GPU? - Vijay
我只想在Python REPL下导入TensorFlow,请提供翻译后的文本。 - Zen
显示剩余7条评论

0
在运行./configure时,请确保指定正确的cuda版本。您可以通过运行以下命令来查找此信息:
/usr/local/cuda/bin/nvcc --version

你可以使用 action_env 标志在构建期间向 bazel 传递环境变量。

bazel build -c opt --config=cuda \
    --action_env=DYLD_LIBRARY_PATH=/usr/local/cuda/lib \
    //tensorflow/tools/pip_package:build_pip_package

https://bazel.build/designs/2016/06/21/environment.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接