首页 文章

如何构建和使用Google TensorFlow C api

提问于
浏览
113

我真的很想在C中开始使用谷歌新的Tensorflow库 . 关于如何构建项目的C API,网站和文档真的不清楚,我不知道从哪里开始 .

通过发现和分享使用tensorflow的C API指南,有经验帮助的人可以提供帮助吗?

9 回答

  • 4

    首先,您应该从following the instructions here下载Github的源代码(您需要Bazel和最新版本的GCC) .

    C API(以及系统的后端)位于 tensorflow/core 中 . 现在,只支持C++ Session interfaceC API . 您可以使用其中任何一个来执行使用Python API构建并序列化为 GraphDef 协议缓冲区的TensorFlow图 . 还有一个用于在C中构建图形的实验性功能,但这目前还不像Python API那样功能齐全(例如目前不支持自动差异化) . 您可以看到builds a small graph in C++ here的示例程序 .

    C API的第二部分是用于添加新 OpKernel 的API,它是包含CPU和GPU的数值内核实现的类 . 有许多如何在 tensorflow/core/kernels 中构建这些的示例,以及tutorial for adding a new op in C++ .

  • 8

    要添加到@ mrry的帖子,我整理了一个教程,解释了如何使用C API加载TensorFlow图 . 它非常小,应该可以帮助您了解所有部件是如何组合在一起的 . 这是它的核心:

    要求:

    • Bazel已安装

    • 克隆TensorFlow回购

    文件夹结构:

    • tensorflow/tensorflow/|project name|/

    • tensorflow/tensorflow/|project name|/|project name|.cc (e.g. 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仓库中进行构建 .

    • 编译的二进制文件很大(103MB) .

    https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f

  • 45

    如果您希望避免使用Bazel构建项目并生成大型二进制文件,我已经组装了一个存储库,指示使用TakeorFlow C库和CMake . 你可以找到here . 一般的想法如下:

    • 克隆TensorFlow存储库 .

    • 将构建规则添加到 tensorflow/BUILD (提供的规则不包括所有C功能) .

    • 构建TensorFlow共享库 .

    • 安装特定版本的Eigen和Protobuf,或将它们添加为外部依赖项 .

    • 配置CMake项目以使用TensorFlow库 .

  • 10

    首先,在安装 protobufeigen 之后,你想构建Tensorflow:

    ./configure
    bazel build //tensorflow:libtensorflow_cc.so
    

    然后将以下包含标头和动态共享库复制到 /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
    
  • 23

    您可以使用此ShellScript安装(大多数)它的依赖项,克隆,构建,编译并将所有必需的文件存入 ../src/includes 文件夹:

    https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh

  • 4

    如果您考虑在独立包上使用Tensorflow c api,您可能需要tensorflow_cc.so(还有一个c api版本tensorflow.so)来构建您可以使用的c版本:

    bazel build -c opt //tensorflow:libtensorflow_cc.so
    

    注意1:如果要添加内在支持,可以将此标志添加为: --copt=-msse4.2 --copt=-mavx

    注意2:如果您正考虑在项目中使用OpenCV,则在同时使用两个库时会出现问题(tensorflow issue),您应该使用 --config=monolithic .

    构建库后,您需要将其添加到项目中 . 为此,您可以包含以下路径:

    tensorflow
    tensorflow/bazel-tensorflow/external/eigen_archive
    tensorflow/bazel-tensorflow/external/protobuf_archive/src
    tensorflow/bazel-genfiles
    

    并将库链接到您的项目:

    tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so (unused if you build with --config=monolithic)
    tensorflow/bazel-bin/tensorflow/libtensorflow_cc.so
    

    在构建项目时,您还应该向编译器指定您将使用c 11标准 .

    侧注:相对于tensorflow版本1.5的路径(您可能需要检查您的版本中是否有任何更改) .

    此链接也帮助我找到了所有这些信息:link

  • 13

    如果您不想自己构建Tensorflow并且您的操作系统是Debian或Ubuntu,则可以使用Tensorflow C / C库下载预构建的软件包 . 此分发可用于CPU的C / C推理,不包括GPU支持:

    https://github.com/kecsap/tensorflow_cpp_packaging/releases

    有关于如何在Tensorflow(TFLearn)中冻结检查点并加载此模型以便使用C / C API进行推断的说明:

    https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md

    注意:我是这个Github项目的开发者 .

  • 7

    我使用黑客/解决方法来避免必须自己构建整个TF库(这节省了时间(它在3分钟内设置),磁盘空间,安装dev依赖项,以及生成的二进制文件的大小) . 它是官方不受支持的,但如果您只想快速进入,效果会很好 .

    通过pip安装TF( pip install tensorflowpip install tensorflow-gpu ) . 然后找到它的库 _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 . 然后在您的构建系统找到它的地方创建一个名为 lib_pywrap_tensorflow.so 的库的符号链接(例如 /usr/lib/local ) . 前缀 lib 很重要!您也可以给它另一个 lib*.so 名称 - 如果您将其命名为 libtensorflow.so ,您可以更好地兼容其他与TF一起编写的程序 .

    然后像你习惯的那样创建一个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,因此您可能会遇到奇怪的链接时间或运行时问题 . 但我能够加载存储的图形,恢复权重和运行推理,这是IMO中C最需要的功能 .

  • 5

    如果您不介意使用CMake,还有tensorflow_cc项目可以为您构建和安装TF C API,以及您可以链接的方便的CMake目标 . 项目自述文件包含一个示例和您可以轻松遵循的Dockerfiles .

相关问题