热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何使用自定义protobuf构建tensorflow1.13.1?

如何解决《如何使用自定义protobuf构建tensorflow1.13.1?》经验,谁能帮忙解答一下?

系统信息

我是否编写了自定义代码:修改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项目文件做更多修改...


推荐阅读
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 我正在尝试将一些索引和浮点值保存到tfrecords,并使用tf.data ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • https:github.comprotocolbuffersprotobufreleases报错:Pleasespecifyeither:•ago_packag ... [详细]
  • Google ProtoBuf的使用
    Google的protobuf太好用了,又小,读写又快跑步快慢受鞋的影响太大了,但是造鞋的工具研究起来还是很有难度的,百度 ... [详细]
  • 谷歌宣布在 Kotlin 中支持 Protocol Buffers 数据格式
    谷,歌,宣布,在,kotlin,中,支持,protocol,buf ... [详细]
  • Go实战--golang中使用gRPC和Protobuf实现高性能api(golangprotobuf、google.golang.orggrpc),Go语言社区,Golang程序 ... [详细]
  • 体量|更多_初识protobuf ... [详细]
author-avatar
手机用户2502898521
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有