Построение tenorflow, обслуживающего клиента, с помощью cmake

Я искал лучший способ сделать это, но не смог найти четкого ответа.

Мог ли кто-нибудь создать клиент, обслуживающий тензорный поток, с помощью cmake?

У меня возникают трудности с созданием файлов CPP из прототипа, поскольку они необходимы для службы прогнозирования. Эти прото-файлы также включают прото-файлы из tensorflow.

до сих пор я придумал это:

project(serving C CXX)
find_package(Protobuf REQUIRED)

file(GLOB_RECURSE proto_files RELATIVE ${serving_SOURCE_DIR}/tensorflow/
    "${serving_SOURCE_DIR}/tensorflow/*.proto")

set(PROTOBUF_GENERATE_CPP_APPEND_PATH OFF)
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${proto_files})

add_library(tf_protos ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(tf_protos PUBLIC ${PROTOBUF_LIBRARIES})

Cmake собирается успешно, но команда make выдает ошибку:

No rule to make target '../tensorflow/tools/proto_text/test.proto', needed by 'tensorflow/tools/proto_text/test.pb.cc'.  Stop.

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

set(PROTOBUF_GENERATE_CPP_APPEND_PATH OFF)

который был объяснен здесь: https://groups.google.com/forum/#!topic/protobuf/eow2fNDUHvc

Моя текущая структура папок

serving/
    CmakeLists.txt
    tensorflow/
    tensorflow_serving/
        apis/

Папка apis содержит .proto файлов, необходимых для реализации клиента, и они включают .proto файлы из папки tensorflow.

Это вообще правильный путь?

Любая помощь / совет будут очень благодарны.


person Maja    schedule 18.10.2017    source источник


Ответы (2)


Мне удалось заставить его работать в вашем макете, где файл CMakeLists.txt находится на том же уровне, что и репозиторий serving здесь. Однако вам также потребуется установить Tensorflow (используя tensorflow_cc).

Однако вы, вероятно, не захотите использовать форк официального репозитория tensorflow/serving, поэтому я пошел дальше и переместил файл CMakeLists.txt, чтобы вы могли просто создать подмодуль официального репозитория. Я сделал пример здесь

Суть в том, что подмодуль protobuf CMake ожидает, что прото-файлы будут размещены в том же каталоге, из которого он называется. Я внес некоторые изменения в подмодули, чтобы мы могли вызывать его с уровня выше serving и гарантировать, что он вызывает компилятор с путями включения в правильном порядке для поддержки вложенной структуры файлов прототипа в serving/tensorflow_serving/apis/* (и помещая его соответственно в указанный каталог сборки)

Надеюсь, кто-то другой, обладающий лучшими ноу-хау, сможет сделать это лучше!

person Eddie Ng    schedule 04.12.2017
comment
Я сдался. Что мне удалось обнаружить, так это то, что команда CMake (GENERATE_CPP) генерирует только файлы .pb в своем дереве сборки. Я скопировал все необходимые файлы proto в отдельную папку (сохранив структуру каталогов) и явно сгенерировал файлы .pb, вызвав команду оболочки protoc. А затем построил отдельную библиотеку prrotobuf с cmake. - person Maja; 13.12.2017
comment
Я использовал this как ссылку. Более подробно объяснено здесь Флорианом Дамсом - person Maja; 20.12.2017

Это сработало для меня.

https://github.com/wardsng/inception_cmake

https://github.com/FloopCZ/tensorflow_cc

Вы можете выбрать частный установочный каталог вместо каталога по умолчанию, например / usr / local / ...

cmake -DCMAKE_INSTALL_PREFIX = ..

person B Abali    schedule 17.02.2019