При использовании bazel для построения модели вызовов TensorFlow C ++ файл .so не работает - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу использовать API TensorFlow C ++ для вызова модели и прогнозирования ответов.Сначала я клонирую репозиторий тензорного потока

git clone --recursive https://github.com/tensorflow/tensorflow

Затем я пишу код C ++, как показано ниже:

Onecode - это класс для вызова API TensorFlow, заголовочный файл выглядит так:

#ifndef _DEEPMODEL_H_
#define _DEEPMODEL_H_

#include <iostream>
#include <string>
#include <vector>
#include "tensorflow/core/public/session.h"
#include "tensorflow/core/protobuf/meta_graph.pb.h"
#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"

using namespace std;
using namespace tensorflow;

class DeepModel{
public:
    DeepModel(const string graph_path, const string checkpoint_path);
    virtual ~DeepModel();

    bool onInit();
    void unInit();
    vector<float> predict(vector<vector<float>>& x, string input_name, string output_name);
private:
    string graph_path;
    string checkpoint_path;
    MetaGraphDef graph_def;
    Session* my_sess;
};

#endif

После этого я пишу простой код инкапсуляции.Я хочу скомпилировать .so и в будущем использовать .so без тензорного исходного кода.И мой код инкапсуляции выглядит следующим образом:

#ifndef _MODEL_HELPER_H_
#define _MODEL_HELPER_H_

#include <vector>
#include <string>

using namespace std;

class ModelHelper{
public:
    ModelHelper(const string graph_path, const string checkpoint_path);
    virtual ~ModelHelper();

    vector<float> predict(vector<vector<float> >& x, string input_name, string output_name);
private:
    string graph_path;
    string checkpoint_path;
};

#endif

У меня есть код для проверки кода выше, он работает хорошо.Затем я хочу скомпилировать .so, используя bazel.

Мой файл BUILD выглядит следующим образом:

load("//tensorflow:tensorflow.bzl", "tf_cc_binary")

tf_cc_binary(
    name = "my_helper.so",
    srcs = ["model_helper.cc", "model_helper.h", "deepmodel.cc", "deepmodel.h"],
    linkshared = 1,
    deps = [
        "//tensorflow/cc:cc_ops",
        "//tensorflow/cc:client_session",
        "//tensorflow/core:tensorflow"
        ],
)

, затем я переименовываю model_helper.so в libmodel_helper.so и пишу код cpp для проверки.so файл.И я хочу скомпилировать код, команда выглядит так:

g++ -std=c++11 test_so.cpp -L./ -lmy_helper -I./ -o my_helper

Тогда я встречаю ошибку:

.//libmy_helper.so: undefined reference to `stream_executor::cuda::ScopedActivateExecutorContext::~ScopedActivateExecutorContext()'
.//libmy_helper.so: undefined reference to `stream_executor::cuda::ScopedActivateExecutorContext::ScopedActivateExecutorContext(stream_executor::StreamExecutor*)'
.//libmy_helper.so: undefined reference to `tensorflow::DeviceName<Eigen::GpuDevice>::value[abi:cxx11]'
collect2: error: ld returned 1 exit status

Я действительно не знаю, почему.Я не могу использовать .so один?

1 Ответ

0 голосов
/ 08 января 2019

Вы должны ссылаться на libtensorflow_frameowork.so в вашем make-файле.Как и в приведенном ниже коде:

g++ -std=c++11 test_so.cpp -L./ -lmy_helper -ltensorflow_framework -I./ -o my_helper

Я полагаю, что Базель пропускает некоторый исходный код в тензорном потоке в .so при компиляции моего кода.

...