【问题标题】:Failing to Bazel build C++ project with tensorflow as a dependency未能使用 tensorflow 作为依赖项构建 C++ 项目
【发布时间】:2018-11-11 22:55:11
【问题描述】:

我看到很多教程解释了如何在 Tensorflow 的 Bazel WORKSPACE 中构建项目(例如 this one)。但我似乎无法找到一种方法来构建我自己的项目并将 tensorflow 作为依赖项包含在内。我查看了this Bazel 文档,显然有一种方法可以使用外部依赖项进行构建,我尝试自己遵循。 (因为 tf 也是用 bazel 构建的)。

这是我的目录结构:

.
├── perception
│   ├── BUILD
│   └── graph_loader.cc
├── third-party
│   └── tensorflow # I cloned tf repo into this folder
└── WORKSPACE

这是我的perception/BUILD 文件中的内容:

cc_binary(
    name = "graph-loader",
    srcs = [
        "graph_loader.cc",
    ],
    deps = [
        "@tensorflow//tensorflow:libtensorflow.so",
    ]
)

这是我的WORKSPACE 文件中的内容:

local_repository(
    name = "tensorflow",
    path = "path/to/my/project/third-party/tensorflow",
)

这是我的 perception/graph_loader.cc 文件中的内容:

#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"

int main() {
  using namespace tensorflow;
  using namespace tensorflow::ops;
  Scope root = Scope::NewRootScope();
  // Matrix A = [3 2; -1 0]
  auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f} });
  // Vector b = [3 5]
  auto b = Const(root, { {3.f, 5.f} });
  // v = Ab^T
  auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
  std::vector<Tensor> outputs;
  ClientSession session(root);
  // Run and fetch v
  TF_CHECK_OK(session.Run({v}, &outputs));
  // Expect outputs[0] == [19; -3]
  LOG(INFO) << outputs[0].matrix<float>();
  return 0;
}

我使用以下命令运行我的构建:

build //perception:graph-loader

但它失败并显示此消息:

ERROR: path/to/my/project/perception/BUILD:1:1: error loading package '@tensorflow//tensorflow': Extension file not found. Unable to load package for '@local_config_cuda//cuda:build_defs.bzl': The repository could not be resolved and referenced by '//perception:graph-loader'
ERROR: Analysis of target '//perception:graph-loader' failed; build aborted: error loading package '@tensorflow//tensorflow': Extension file not found. Unable to load package for '@local_config_cuda//cuda:build_defs.bzl': The repository could not be resolved
INFO: Elapsed time: 0.037s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (1 packages loaded, 0 targets configured)
    currently loading: @tensorflow//tensorflow

以下是问题:

  1. 我做错了什么导致我的构建不断失败?
  2. 是否有可能做我在这里尝试的事情,即在我的项目中构建 tensorflow?

【问题讨论】:

    标签: c++ tensorflow bazel


    【解决方案1】:

    您收到此错误是因为您没有在 WORKSPACE 中添加所需的存储库规则。 Bazel 目前没有递归工作区,因此您需要手动将所有依赖项的那些存储库复制到主 WORKSPACE

    在您的 WORKSPACE 文件中,复制以下内容:

    local_repository(
        name = "org_tensorflow",
        path = "third-party/tensorflow",
    )
    

    https://github.com/tensorflow/tensorflow/blob/master/WORKSPACE 的所有内容追加到WORKSPACE 文件中。删除workspace(name = "org_tensorflow") 行。

    最后,将WOKRSPACE中的所有//*改成@org_tensorflow//*

    请注意,官方不支持在子文件夹中构建 Tensorflow。

    【讨论】:

    • 哇,你的帮助太棒了。现在一切正常!非常感谢
    【解决方案2】:

    如果您可以使用子文件夹,John London 的回答可能是合理的。

    在某些情况下,您会更喜欢使用外部依赖项,但这仍然有点难以设置。请参阅TensorFlow Serving repo 的设置,以获取设法执行此操作的项目示例。由于 bazel 的限制,您需要将 WORKSPACE 和可能的 .bazelrc 的内容复制到您自己的仓库中。

    这对于某些情况来说就足够了,但不是全部。如果您使用的是在 @org_tensorflow 存储库中定义的规则(例如 tfcompile 的 tf_library()),则这些规则定义的依赖项可能需要在您的存储库的 .bzl 中重新定义,以便在它们前面加上 @org_tensorflow//

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 2012-01-15
      • 1970-01-01
      • 2018-01-23
      • 2012-03-18
      • 1970-01-01
      • 2013-01-25
      相关资源
      最近更新 更多