Я пытаюсь сделать Stati c модель библиотеки с помощью tfcompile - PullRequest
0 голосов
/ 24 марта 2020

На этой странице https://gist.github.com/carlthome/6ae8a570e21069c60708017e3f96c9fd автор представляет, как создать динамическую c библиотеку моделей (libmodel.so)

Но я хочу сделать оценку c библиотека. Итак, я следил за страницей от начала до создания файла заголовка графа, библиотек графов и файла графика. cc.

load('@org_tensorflow//tensorflow/compiler/aot:tfcompile.bzl', 'tf_library')

tf_library(
    name = 'graph',
    config = 'graph.config.pbtxt',
    cpp_class = 'Graph',
    graph = 'graph.pb',
)
#define EIGEN_USE_THREADS
#define EIGEN_USE_CUSTOM_THREAD_POOL

#include "graph.h"
#include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor"

extern "C" int run(float *input, float *output, int input_size, int output_size) {
  Eigen::ThreadPool tp(std::thread::hardware_concurrency());
  Eigen::ThreadPoolDevice device(&tp, tp.NumThreads());
  Graph graph;
  graph.set_thread_pool(&device);

  std::copy(input, input + input_size, graph.arg0_data());
  auto ok = graph.Run();
  if (not ok) return -1;
  std::copy(graph.result0_data(), graph.result0_data() + output_size, output);
  return 0;
}

Но в этот момент я связываю график. cc, libgraph.a, main. cc вручную, потому что я хочу создать библиотеку моделей stati c.

g++ -g -O2 -I./bazel-bin -I. -I../eigen -static -L./bazel-bin -o static_main main.cc graph.cc -lgraph
 ./dependancy/xla_compiled_cpu_function.pic.o ./dependancy/executable_run_options.pic.o
 ./dependancy/cpu_function_runtime.pic.o ./dependancy/runtime_matmul.pic.o
 ./dependancy/eigen_contraction_kernel.pic.o ./dependancy/libmkldnn.a ./dependancy/libbase.a
 ./dependancy/spinlock_wait.pic.o ./dependancy/runtime_conv2d.pic.o
 ./dependancy/runtime_key_value_sort.pic.o ./dependancy/runtime_single_threaded_conv2d.pic.o
 ./dependancy/runtime_single_threaded_matmul.pic.o -lpthread -lstdc++

Я создал папку зависимостей и для удобства скопировал объектные файлы. Все файлы изначально находятся в подпапках в папке bazel-bin. И я сделал libmkldnn.a и libbase.a, потому что в папке mkldnn и базовой папке было так много объектных файлов.

.. / eigen - это местоположение библиотеки eigen3, которая изначально находится в bazel-tensorflow / внешний / eigen_archive. Я скопировал его.

Итак, я могу получить двоичный файл с помощью вышеуказанной команды, но здесь есть проблема.

Программа получает файл ввода "preprocess.txt", который предварительно обработал данные изображения , затем напечатайте первые 100 значений ввода и напечатайте первые 100 значений вывода после завершения расчета. ожидаемый результат, как показано ниже.

input
57.061 53.221 59.32 51.061 47.221 54.32 50.061 48.221 55.32 54.061 
50.221 57.32 57.061 53.221 60.32 60.061 54.221 62.32 62.061 58.221 
64.32 63.061 59.221 65.32 65.061 60.221 66.32 66.061 62.221 65.32 
68.061 64.221 67.32 69.061 65.221 67.32 69.061 66.221 66.32 69.061 
65.221 67.32 71.061 67.221 69.32 73.061 69.221 71.32 73.061 69.221 
71.32 76.061 72.221 74.32 78.061 74.221 76.32 79.061 75.221 77.32 
79.061 75.221 77.32 80.061 76.221 78.32 80.061 76.221 78.32 80.061 
76.221 78.32 81.061 77.221 79.32 81.061 77.221 79.32 80.061 76.221 
78.32 80.061 76.221 78.32 80.061 76.221 78.32 80.061 76.221 78.32 
80.061 76.221 78.32 82.061 77.221 77.32 84.061 75.221 73.32 80.061
output
4.1425e-07 1.55022e-07 8.01874e-09 1.45833e-07 1.77831e-08 1.10037e-06 2.36442e-09 5.04582e-08 1.6664e-07 1.70662e-08 
8.07342e-06 6.01458e-08 5.35763e-07 8.90603e-08 5.45662e-08 1.75194e-06 2.19858e-07 1.92634e-08 1.94751e-08 1.15723e-08 
2.48155e-07 9.75562e-07 1.29156e-07 5.67433e-08 4.6619e-07 6.54336e-09 7.3373e-08 8.95065e-08 4.33336e-08 1.52503e-07 
1.15388e-07 4.426e-08 1.54333e-07 1.42743e-08 3.63919e-08 1.23383e-07 4.32437e-07 4.85693e-08 8.38929e-07 1.76619e-06 
2.45778e-08 1.22577e-05 2.19633e-07 7.68738e-06 9.81603e-07 7.32886e-08 1.23868e-07 5.94219e-07 1.8229e-08 4.3689e-08 
1.11904e-08 9.58422e-07 1.79332e-07 7.54541e-08 1.98756e-07 2.93947e-08 1.40036e-08 4.83068e-08 2.57597e-08 8.58932e-07 
1.50976e-06 4.60426e-08 3.43865e-07 1.66233e-07 3.0764e-07 2.99035e-08 6.94069e-06 1.92969e-07 9.76553e-07 8.67644e-08 
1.10802e-07 2.26223e-07 2.14976e-07 2.40742e-06 4.00185e-08 3.00438e-08 4.40872e-08 3.06553e-08 3.13193e-07 1.28029e-07 
2.23347e-06 2.46401e-08 3.93279e-06 3.23445e-05 1.71585e-07 6.17229e-08 5.32342e-06 6.12675e-08 1.99601e-07 1.38956e-08 
4.91455e-08 6.72157e-08 4.27405e-08 4.80121e-08 8.08095e-08 2.67113e-07 9.17171e-09 2.89968e-08 2.60192e-07 1.67443e-07

Этот результат получен другим двоичным файлом, который только что создан командой bazel.

Однако мой двоичный файл static_main ....

input
57.061 53.221 59.32 51.061 47.221 54.32 50.061 48.221 55.32 54.061 
50.221 57.32 57.061 53.221 60.32 60.061 54.221 62.32 62.061 58.221 
64.32 63.061 59.221 65.32 65.061 60.221 66.32 66.061 62.221 65.32 
68.061 64.221 67.32 69.061 65.221 67.32 69.061 66.221 66.32 69.061 
65.221 67.32 71.061 67.221 69.32 73.061 69.221 71.32 73.061 69.221 
71.32 76.061 72.221 74.32 78.061 74.221 76.32 79.061 75.221 77.32 
79.061 75.221 77.32 80.061 76.221 78.32 80.061 76.221 78.32 80.061 
76.221 78.32 81.061 77.221 79.32 81.061 77.221 79.32 80.061 76.221 
78.32 80.061 76.221 78.32 80.061 76.221 78.32 80.061 76.221 78.32 
Segmentation fault (core dumped)

Итак, я запускаю GDB.

gdb-peda$ backtrace
#0  0x0000000000000000 in ?? ()
#1  0x0000000000405d36 in __gthread_self () at /usr/include/x86_64-linux-gnu/c++/7/bits/gthr-default.h:686
#2  std::this_thread::get_id () at /usr/include/c++/7/thread:343
#3  Eigen::ThreadPoolTempl<Eigen::StlThreadEnvironment>::GlobalThreadIdHash () at ../eigen/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h:451
#4  Eigen::ThreadPoolTempl<Eigen::StlThreadEnvironment>::WorkerLoop (this=0x7fffffffdd70, thread_id=0x0) at ../eigen/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h:265
#5  0x0000000000a18d1f in execute_native_thread_routine ()
#6  0x00000000009d892b in start_thread (arg=0x7ffff7f3d700) at pthread_create.c:463
#7  0x0000000000af6c1f in clone ()

И, что удивительно, рип равен 0x0. И в стеке говорится, что программа пыталась выполнить std :: this_thread :: get_id ()

Итак ... пожалуйста, кто-нибудь скажет о некоторых подозрительных частях. Я думал, что есть некоторые несвязанные части. Но бинарный файл сделан. А это значит, что разрешение символов успешно выполнено. Все, что я вижу, это просто предупреждение во время выполнения команды g ++.

In file included from ./tensorflow/compiler/tf2xla/xla_compiled_cpu_function.h:22:0,
                 from ./bazel-bin/graph.h:14,
                 from graph.cc:4:
./tensorflow/compiler/xla/cpu_function_runtime.h:133:16: warning: ‘xla::cpu_function_runtime::BufferInfo::kind_’ is too small to hold all values of ‘enum class xla::cpu_function_runtime::BufferInfo::Kind’
   Kind kind_ : 2;
                ^

Итак ... еще раз ... Пожалуйста, расскажите мне о некоторых подозреваемых частях.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...