如何构build和使用Google TensorFlow C ++ api
我真的很想开始在C ++中使用Google的新Tensorflow库。 网站和文档只是不清楚如何build立项目的C + + API,我不知道从哪里开始。
有更多经验的人可以通过发现和共享使用tensorflow的C ++ API的指导来帮助吗?
要开始,你应该从Github下载源代码, 按照这里的指示 (你需要Bazel和最新版本的GCC)。
C ++ API(和系统的后端)在tensorflow/core
。 目前,只支持C ++ Session接口和C API 。 您可以使用其中任何一个来执行使用Python API构build的TensorFlowgraphics,并将其序列化为GraphDef
协议缓冲区。 C ++中还有一个用于构buildgraphics的实验性function,但是目前这种function不如Python API那么全function(例如,目前不支持自动分化)。 你可以在这里看到一个用C ++build立一个小图的例子程序。
C ++ API的第二部分是用于添加新的OpKernel
的API,该OpKernel
是包含用于CPU和GPU的数字内核的实现的类。 有很多关于如何在tensorflow/core/kernels
构build这些tensorflow/core/kernels
例子,以及在C ++中添加一个新操作的教程 。
要添加到@ mrry的文章,我将编写一个教程,介绍如何使用C ++ API加载TensorFlow图表。 这是非常小的,应该帮助你理解所有的部分如何组合在一起。 这是它的肉:
要求:
- Bazel安装
- 克隆TensorFlow回购
文件夹结构:
-
tensorflow/tensorflow/|project name|/
-
tensorflow/tensorflow/|project name|/|project name|.cc (eg https://gist.github.com/jimfleming/4202e529042c401b17b7)
-
tensorflow/tensorflow/|project name|/BUILD
build立:
cc_binary( name = "<project name>", srcs = ["<project name>.cc"], deps = [ "//tensorflow/core:tensorflow", ] )
两个警告可能是解决方法:
- 现在, 在 TensorFlow回购中需要进行构build。
- 编译后的二进制文件很大(103MB)。
https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f
如果您希望避免使用Bazel构build项目并生成大的二进制文件,我已经组装了一个存储库,指示使用CMake的TensorFlow C ++库。 你可以在这里find它。 总体思路如下:
- 克隆TensorFlow存储库。
- 将构build规则添加到
tensorflow/BUILD
(所提供的不包括所有C ++function)。 - build立TensorFlow共享库。
- 安装Eigen和Protobuf的特定版本,或将它们添加为外部依赖项。
- configuration您的CMake项目使用TensorFlow库。
你可以使用这个ShellScript来安装(大部分)它的依赖关系,克隆,构build,编译和获取所有必要的文件到../src/includes
文件夹中:
https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
首先,在安装protobuf
和eigen
,你想build立Tensorflow:
./configure bazel build //tensorflow:libtensorflow_cc.so
然后将以下包含头文件和dynamic共享库复制到/usr/local/lib
和/usr/local/include
:
mkdir /usr/local/include/tf cp -r bazel-genfiles/ /usr/local/include/tf/ cp -r tensorflow /usr/local/include/tf/ cp -r third_party /usr/local/include/tf/ cp -r bazel-bin/libtensorflow_cc.so /usr/local/lib/
最后,用一个例子来编译:
g++ -std=c++11 -o tf_example \ -I/usr/local/include/tf \ -I/usr/local/include/eigen3 \ -g -Wall -D_DEBUG -Wshadow -Wno-sign-compare -w \ -L/usr/local/lib/libtensorflow_cc \ `pkg-config --cflags --libs protobuf` -ltensorflow_cc tf_example.cpp
我使用黑客/解决方法来避免自己构build整个TF库(同时节省时间(3分钟内设置),磁盘空间,安装dev依赖项和生成的二进制文件的大小)。 它的官方不受支持,但如果你只是想快速跳入,
通过pip安装TF( pip install tensorflow
或pip install tensorflow-gpu
)。 然后find它的库_pywrap_tensorflow.so
(TF 0. * – 1.0)或_pywrap_tensorflow_internal.so
(TF 1.1+)。 在我的情况下(Ubuntu)它位于/usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so
。 然后创build一个符号链接到这个名为lib_pywrap_tensorflow.so
库中,在这个库中你的lib_pywrap_tensorflow.so
系统find它(例如/usr/lib/local
)。 前缀lib
很重要! 你也可以给它另外一个lib*.so
名字 – 如果你把它libtensorflow.so
,你可能会得到与其他编写与TF一起工作的程序的更好的兼容性。
然后像你习惯的那样创build一个C ++项目(CMake,Make,Bazel,无论你喜欢什么)。
然后你就可以直接链接到这个库,使TF可用于你的项目(你也必须链接到python2.7
库)! 在CMake中,例如,只需添加target_link_libraries(target _pywrap_tensorflow python2.7)
。
C ++头文件位于这个库的周围,例如在/usr/local/lib/python2.7/dist-packages/tensorflow/include/
。
再一次:这种方式是官方不受支持,你可能会遇到各种问题。 图书馆似乎是静态链接,例如protobuf,所以你可能会运行奇怪的链接时间或运行时问题。 但是我能够加载存储的graphics,恢复权重并运行推理,这是C ++中最需要的function。
如果你不介意使用CMake,还有tensorflow_cc项目,为你build立和安装TF C ++ API,以及你可以链接的方便的CMake目标。 该项目的自述文件包含一个示例和Dockerfiles,你可以轻松地遵循。