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

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

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

Ответ 1

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

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

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

Ответ 2

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

Требования:

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

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

Ответ 3

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

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

Ответ 4

Во-первых, после установки 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

Ответ 5

Если вы планируете использовать API-интерфейс Tensorflow c++ в автономном пакете, вам, вероятно, понадобится tenorflow_cc.so (также существует версия API-интерфейса acpiorsorflow.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.

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Затем создайте проект С++, как вы привыкли (CMake, Make, Bazel, все, что вам нравится).

И тогда вы готовы просто связать эту библиотеку с тем, чтобы иметь доступ к TF для ваших проектов (и вам также нужно связать с библиотеками python2.7)! В CMake вы, например, просто добавьте target_link_libraries(target _pywrap_tensorflow python2.7).

Файлы заголовков С++ расположены вокруг этой библиотеки, например. в /usr/local/lib/python2.7/dist-packages/tensorflow/include/.

Еще раз: этот способ официально не поддерживается, и вы можете запускать различные проблемы. По-видимому, библиотека статически связана с, например, protobuf, поэтому вы можете запускать нечетные ссылки или время выполнения. Но я могу загрузить сохраненный график, восстановить вес и выполнить вывод, который является IMO наиболее востребованной функциональностью в С++.

Ответ 10

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

Ответ 11

Ответы выше достаточно хороши, чтобы показать, как собрать библиотеку, но как собрать заголовки все еще сложно. здесь я делюсь небольшим сценарием, который я использую для копирования необходимых заголовков.

SOURCE - это первый параметр, который представляет собой источник (сборку) тензорного потока;
DST - это второй параметр, в котором include directory содержит собранные заголовки. (например, в cmake, include_directories(./collected_headers_here)).

#!/bin/bash

SOURCE=$1
DST=$2
echo "-- target dir is $DST"
echo "-- source dir is $SOURCE"

if [[ -e $DST ]];then
    echo "clean $DST"
    rm -rf $DST
    mkdir $DST
fi


# 1. copy the source code c++ api needs
mkdir -p $DST/tensorflow
cp -r $SOURCE/tensorflow/core $DST/tensorflow
cp -r $SOURCE/tensorflow/cc $DST/tensorflow
cp -r $SOURCE/tensorflow/c $DST/tensorflow

# 2. copy the generated code, put them back to
# the right directories along side the source code
if [[ -e $SOURCE/bazel-genfiles/tensorflow ]];then
    prefix="$SOURCE/bazel-genfiles/tensorflow"
    from=$(expr $(echo -n $prefix | wc -m) + 1)

    # eg. compiled protobuf files
    find $SOURCE/bazel-genfiles/tensorflow -type f | while read line;do
        #echo "procese file --> $line"
        line_len=$(echo -n $line | wc -m)
        filename=$(echo $line | rev | cut -d'/' -f1 | rev )
        filename_len=$(echo -n $filename | wc -m)
        to=$(expr $line_len - $filename_len)

        target_dir=$(echo $line | cut -c$from-$to)
        #echo "[$filename] copy $line $DST/tensorflow/$target_dir"
        cp $line $DST/tensorflow/$target_dir
    done
fi


# 3. copy third party files. Why?
# In the tf source code, you can see #include "third_party/...", so you need it
cp -r $SOURCE/third_party $DST

# 4. these headers are enough for me now.
# if your compiler complains missing headers, maybe you can find it in bazel-tensorflow/external
cp -RLf $SOURCE/bazel-tensorflow/external/eigen_archive/Eigen $DST
cp -RLf $SOURCE/bazel-tensorflow/external/eigen_archive/unsupported $DST
cp -RLf $SOURCE/bazel-tensorflow/external/protobuf_archive/src/google $DST
cp -RLf $SOURCE/bazel-tensorflow/external/com_google_absl/absl $DST

Ответ 12

Я написал блог о том, как построить пример тензорного потока C++ без базеля для tenorflow v1.4 здесь и некоторые обновления, если вы хотите, чтобы он хорошо работал с opencv здесь

Возможно, вам придется адаптироваться к новейшей версии tenorflow