[英]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
以下是問題:
您收到此錯誤是因為您尚未在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.