2017-10-18 46 views
2

我搜索了这样做的最佳方式,但我无法找到明确的答案。使用cmake构建tensorflow服务客户端

是否有人能够使用cmake构建tensorflow服务客户端?

我从proto生成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文件,它们包括从文件夹tensorflow.proto文件。

这是否是正确的选择?

任何帮助/建议将不胜感激。

回答

0

我能够在CMakeLists.txt文件放在与serving存储库here相同的位置的布局中工作。您也需要安装Tensorflow(使用tensorflow_cc)。

但是,你可能不想与官方tensorflow/serving仓库的一个分支渣土,所以我去了一步,移动的CMakeLists.txt,所以你可以只是辅助模块中的官方资料库。我举了一个例子here

的要点是,protobuf CMake子模块期望原始文件被放置在它调用的same directory中。我对子模块进行了一些修改,让我们从serving以上的级别调用它,并确保它以正确的顺序调用包含路径的编译器,以支持serving/tensorflow_serving/apis/*中的原始文件的嵌套结构(并将其相应地放置在指定的建立目录)

希望有更好的专业知识的其他人可以做得更好!

+0

我放弃了。我能够发现的是,CMake命令(GENERATE_CPP)仅在其构建树中生成.pb文件。 我所做的是将所有需要的proto文件复制到一个单独的文件夹(保留目录结构)并通过调用protoc shell命令显式生成.pb文件。然后用cmake建立了一个独立的prrotobuf库。 – Maja

+0

我用[this](https://github.com/philosophus/tf-serving-demo)作为参考。更详细的解释[这里](http://fdahms.com/2017/03/05/tensorflow-serving-jvm-client/)由弗洛里安达姆斯 – Maja