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

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

Может ли кто-то с большим опытом помочь найти и поделиться руководством по использованию C ++ API tenorflow?

114

Решение

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

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

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

45

Другие решения

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

Требования:

  • Базэл установлены
  • Клон 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.
  • Скомпилированный двоичный файл огромен (103 МБ).

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

23

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

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

Сначала после установки protobuf а также eigenВы хотели бы построить 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
10

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

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

8

Если вы планируете использовать Tensorflow c ++ api в автономном пакете, вам, вероятно, понадобится tenorflow_cc.so (есть также версия c api tenorflow.so) для сборки версии c ++, которую вы можете использовать:

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

Примечание 1: Если вы хотите добавить встроенную поддержку, вы можете добавить следующие флаги: --copt=-msse4.2 --copt=-mavx

Примечание 2: Если вы планируете использовать 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.

Дополнительное примечание: Пути относительно версии тензорного потока 1.5 (возможно, вам потребуется проверить, изменилось ли что-нибудь в вашей версии).

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

7

Если вы не хотите собирать Tensorflow самостоятельно, а ваша операционная система — Debian или Ubuntu, вы можете загрузить готовые пакеты с библиотеками Tensorflow C / C ++. Этот дистрибутив можно использовать для вывода C / C ++ с процессором, поддержка GPU не включена:

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

Есть инструкции, как заморозить контрольную точку в Tensorflow (TFLearn) и загрузить эту модель для вывода с помощью API C / C ++:

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

Осторожно: я разработчик этого проекта на Github.

5

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

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

4
По вопросам рекламы [email protected]