Как построить и использовать Google TensorFlow C++ api


Я очень хочу начать использовать новую библиотеку Tensorflow от Google на C++. Веб-сайт и документы просто очень неясны с точки зрения того, как построить API c++ проекта, и я не знаю, с чего начать.

может ли кто-то с большим опытом помочь, обнаружив и поделившись руководством по использованию API c++ tensorflow?

9 106

9 ответов:

чтобы начать работу, вы должны загрузить исходный код из Github, по следуя инструкциям здесь (вам понадобится Базел и недавняя версия GCC).

API C++ (и серверная часть системы) находится в tensorflow/core. Прямо сейчас, только интерфейс сеанса C++ и C API поддерживаются. Вы можете использовать любой из них для выполнения графиков TensorFlow, которые были построены с использованием API Python и сериализованы в a GraphDef буфера протокола. Существует также экспериментальная функция для построения графиков в C++, но в настоящее время она не столь полнофункциональна, как API Python (например, в настоящее время нет поддержки автоматической дифференциации). Вы можете увидеть пример программы, которая строит небольшой график в C++ здесь.

вторая часть C++ API-это API для добавления нового OpKernel, который является классом, содержащим реализации числовых ядер для CPU и GPU. Есть множество примеров о том, как построить их в tensorflow/core/kernels, а также учебник для добавления нового op в C++.

чтобы добавить к сообщению @mrry, я собрал учебник, в котором объясняется, как загрузить график тензорного потока с помощью API C++. Это очень минимально и должно помочь вам понять, как все части подходят друг к другу. Вот его мясо:

требования:

  • Базел установлен
  • clone TensorFlow repo
структура:
  • 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",
    ]
)

два предостережения, для которых, вероятно, есть обходные пути:

  • прямо сейчас, строительство вещи должны произойти внутри РЕПО тензорного потока.
  • скомпилированный двоичный файл огромный (103MB).

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

Если вы хотите избежать как построения своих проектов с Bazel, так и генерации большого двоичного файла, я собрал репозиторий, инструктирующий использование библиотеки TensorFlow C++ с CMake. Вы можете найти его здесь. Общие идеи таковы:

  • клонировать репозиторий TensorFlow.
  • Добавить правило сборки в tensorflow/BUILD (предоставленные не включают все функции C++).
  • построить общий тензорный поток библиотека.
  • установите определенные версии Eigen и Protobuf или добавьте их в качестве внешних зависимостей.
  • настройте свой проект CMake для использования библиотеки TensorFlow.

во-первых, после установки protobuf и eigen, вы хотели бы построить Tensorflow:

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

затем скопируйте следующие заголовки include и динамическую общую библиотеку в /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

вы можете использовать этот ShellScript для установки (большинства) его зависимостей, клонирования, сборки, компиляции и получения всех необходимых файлов в :

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

я использую hack / обходной путь, чтобы избежать необходимости самостоятельно создавать всю библиотеку TF (что экономит время (оно настроено за 3 минуты), дисковое пространство, установку зависимостей dev и размер результирующего двоичного файла). Он официально не поддерживается, но хорошо работает, если вы просто хотите быстро прыгнуть.

установите TF через pip (pip install tensorflow или pip 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, вы можете получить лучшую совместимость с другими программами, написанными для работы с ТФ.

затем создайте проект 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++.

Если вы не возражаете использовать CMake, есть также tensorflow_cc проект, который строит и устанавливает TF C++ API для вас, а также удобные цели CMake, с которыми вы можете связать. Проект README содержит пример и Dockerfiles вы можете легко следовать.

если вы думаете об использовании 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

Note2: если вы думаете об использовании OpenCV в своем проекте, есть проблема при использовании обеих библиотек вместе ( проблема тензорного потока) а вы следует использовать --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 (возможно, Вам потребуется проверить, есть ли в вашей версии что-нибудь измененный.)

также эта ссылка очень помогла мне найти всю эту информацию:ссылке

Если вы не хотите создавать Tensorflow самостоятельно и ваша операционная система Debian или Ubuntu, вы можете скачать готовые пакеты с библиотеками Tensorflow C/C++. Этот дистрибутив можно использовать для вывода C/C++ с CPU, поддержка 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.