簡體   English   中英

Bazel 無法使用 tensorflow 作為依賴項構建 C++ 項目

[英]Failing to Bazel build C++ project with tensorflow as a dependency

我看到很多教程解釋了如何在 Tensorflow 的 Bazel WORKSPACE 中構建項目(就像這個)。 但是我似乎無法找到一種方法來構建我自己的項目並將 tensorflow 作為依賴項包含在內。 我查看了這個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 嗎?

您收到此錯誤是因為您尚未在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所有//* WOKRSPACE@org_tensorflow//*

請注意,不正式支持在子文件夾中構建Tensorflow。

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

在某些情況下,您會更喜歡使用外部依賴項,這仍然有點難以設置。 請參閱TensorFlow Serving repo的設置,以獲取設法執行此操作的項目示例。 由於 bazel 限制,您需要將WORKSPACE的內容以及可能的.bazelrc到您自己的存儲庫中。

這對於某些情況就足夠了,但不是全部。 如果您使用在 @org_tensorflow 存儲庫中定義的規則(例如 tfcompile 的tf_library() ),則這些規則定義的依賴項可能需要在您的存儲庫的 .bzl 中重新定義,以便在它們前面放置@org_tensorflow//

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM