作者:手机用户2502898521 | 来源:互联网 | 2022-10-30 18:35
系统信息
我是否编写了自定义代码:修改bazel文件
操作系统平台和发行版:Ubuntu 16.04
TensorFlow的安装来源:
TensorFlow版本:1.13.1从对应的标签下载(https://github.com/tensorflow/tensorflow/archive/v1.13.1.tar.gz)
Python版本:Python 3.5.2
Bazel版本:0.21.0
Protobuf版本:3.7.0(从源代码构建并放置在文件系统中的某个位置)
CUDA / cuDNN版本:10.0 / 7
GPU型号和内存:GeForce GTX 1060 Ti
上下文:默认情况下,tensorflow会构建自己的protobuf代码。尽管protobuf也被其他库使用,但它的导出符号与tensorflow提供的符号冲突。解决该问题的唯一好的方法是对所有库(包括张量流)使用唯一且独立的(即在张量流之外)protobuf版本。所以我基本上需要使用目标安装版本的protobuf构建tensorflow,该版本位于文件系统中的某个位置。
问题:构建tensorflow 1.13.1时,使用protobuf的自定义版本,该版本安装在文件系统中的某个位置(不在默认系统路径中)。更具体地说,我的问题是:需要对tensorflow的bazel文件进行哪些修改才能使其实现。我是bazel的新手,我对如何做感到非常困惑。
这是我所做的:
1)停用protobuf的内部构建,在.tf_configure.bazelrc
我添加的代码行中:
build --action_env TF_SYSTEM_LIBS="protobuf_archive"
这可以按预期工作,除了安装在默认系统路径中的protobuf太旧以至于无法解析proto3文件。无论如何这都不是真正的问题,因为我想使用3.7.0版的自定义protobuf。
2)指定在哪里找到protobuf我通过使用new_local_repository
而不是更改了workspace.bzl文件tf_http_archive
。
如果我的文件系统中安装了protobuf库的路径,则为@ PATH_TO_PROTOBUF @。
new_local_repository(
name = "protobuf_archive",
path = "@PATH_TO_PROTOBUF@",
build_file = clean_dep("//third_party/systemlibs:protobuf.BUILD"),
)
new_local_repository(
name = "com_google_protobuf",
path = "@PATH_TO_PROTOBUF@",
system_build_file = clean_dep("//third_party/systemlibs:protobuf.BUILD"),
system_link_files = {
"//third_party/systemlibs:protobuf.bzl": "protobuf.bzl",
},
)
new_local_repository(
name = "com_google_protobuf_cc",
path = "@PATH_TO_PROTOBUF@",
system_build_file = clean_dep("//third_party/systemlibs:protobuf.BUILD"),
system_link_files = {
"//third_party/systemlibs:protobuf.bzl": "protobuf.bzl",
},
)
3)我通过更改规则使用的二进制文件来更改了位于tensorflow-1.13.1 / third_party / systemlibs中的protobuf.BUILD文件:
cc_library(
name = "protobuf",
hdrs = HEADERS,
linkopts = ["@PATH_TO_PROTOBUF@/lib/libprotobuf.so"],
visibility = ["//visibility:public"],
)
cc_library(
name = "protobuf_headers",
hdrs = HEADERS,
linkopts = ["@PATH_TO_PROTOBUF@/lib/libprotobuf.so"],
visibility = ["//visibility:public"],
)
cc_library(
name = "protoc_lib",
linkopts = ["@PATH_TO_PROTOBUF@/lib/libprotoc.so"],
visibility = ["//visibility:public"],
)
genrule(
name = "protoc",
outs = ["protoc.bin"],
cmd = "ln -s @PATH_TO_PROTOBUF@/bin/protoc $@",
executable = 1,
visibility = ["//visibility:public"],
)
这样,我以为一切都会正常,但是运行构建时:
ERROR: .../tensorflow-1.13.1/tensorflow/core/BUILD:2460:1: ProtoCompile tensorflow/core/lib/core/error_codes.pb.cc failed (Exit 127): protoc.bin failed: error executing command
(cd /home/robin/.cache/bazel/_bazel_robin/c04a70144cd329180403af87e4cbdc44/execroot/org_tensorflow && \
exec env - \
PATH=/bin:/usr/bin \
bazel-out/host/genfiles/external/protobuf_archive/protoc.bin '--cpp_out=bazel-out/host/genfiles/' -I. -Iexternal/protobuf_archive -Ibazel-out/host/genfiles/external/protobuf_archive tensorflow/core/lib/core/error_codes.proto)
Execution platform: @bazel_tools//platforms:host_platform
[32 / 203] 6 actions, 5 running
Executing genrule @protobuf_archive//:link_headers [for host]; 0s local
ProtoCompile .../core/lib/core/error_codes.pb.cc [for host]; 0s local
Compiling tensorflow/core/platform/default/logging.cc [for host]; 0s local
ProtoCompile tensorflow/core/example/example.pb.cc [for host]; 0s local
Executing genrule @local_config_cuda//cuda:cuda-include; 0s local
[-----] Writing file external/llvm/llvm-tblgen-2.params [for host]
bazel-out/host/genfiles/external/protobuf_archive/protoc.bin: error while loading shared libraries: libprotoc.so.18: cannot open shared object file: No such file or directory
显然,protoc失败仅是因为加载器找不到libprotoc。
4)因此,该解决方案对我来说微不足道,只需将LD_LIBRARY_PATH设置为足以自动找到libprotoc.so即可。不幸的是,以下解决方案均无效:
A)直接设置LD_LIBRARY_PATH
export LD_LIBRARY_PATH=@PATH_TO_PROTOBUF@/lib
bazel build //tensorflow:tensorflow_cc.So
B)通过.tf_configure.bazelrc
以下方式设置LD_LIBRARY_PATH :
build --action_env LD_LIBRARY_PATH="@PATH_TO_PROTOBUF@/lib"
输出与以前完全相同,所以我的第一句话是不导出LD_LIBRARY_PATH(据我了解)。可以解释这是因为:
exec env - \
PATH=/bin:/usr/bin \
bazel-out/host/genfiles/external/protobuf_archive/protoc.bin '--cpp_out=bazel-out/host/genfiles/'
不包含类似
LD_LIBRARY_PATH=@PATH_TO_PROTOBUF@/lib/
我在Google上搜索了很长时间,但没有找到解决该问题的任何方法(我测试了很多但没有任何效果)...也许这是我使用的Bazel版本的限制?不幸的是,我不能仅仅因为tensorflow 1.13.1禁止使用更高版本的Bazel。
所以现在我不知道该怎么办...我想解决方案是对tensorflow的bazel项目文件做更多修改...