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

169

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

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

theideasmith
источник
4
+1 за твой вопрос. Есть ли шанс установить / скомпилировать в Windows? Сайт показывает только Linux / Mac. Требуется руководство, чтобы запустить Bazel. Этот пример может быть хорошей отправной точкой для изучения: github.com/tensorflow/tensorflow/tree/master/tensorflow/…
alrama
На этот вопрос до сих пор нет ответа. Как установить только C ++ tenorflow C ++ API библиотеки не имеют к этому никакого руководства, и принятый ответ не дает никаких указаний относительно того, как это сделать, даже через любую из нескольких предоставленных ссылок.
iantonuk
Для Windows я нашел этот вопрос и его принятый ответ наиболее полезным. Создав пример учебного проекта, вы строите весь проект TensorFlow как статическую библиотеку, а затем ссылаетесь на нее. Вы можете сделать свои собственные проекты и связать TensorFlow таким же образом.
omatai

Ответы:

2

Я обнаружил, что одной из альтернатив использования Tensorflow C ++ API является использование cppflow .

Это облегченная оболочка C ++ для Tensorflow C API . Вы получаете очень маленькие исполняемые файлы, и они ссылаются на libtensorflow.soуже скомпилированный файл. Есть также примеры использования, и вы используете CMAKE вместо Bazel.

Bersan
источник
55

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

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

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

mrry
источник
7
Никаких инструкций по установке для C ++ не показано на tenorflow.org/install , но есть примеры программ, показанных на tenorflow.org/api_guides/cc/guide, которые явно используют C ++ api. Как именно вы установили C ++ для Tensorflow?
user3667089
@ user3667089 Расположение процедуры установки теперь находится по адресу tenorflow.org/install/install_sources
Дуайт,
6
@Dwight Я видел эту страницу раньше, но не вижу никакой информации о C ++
user3667089
2
@ user3667089 Заголовки после описанной выше процедуры установки будут расположены в папке dist-packages дистрибутива python, который вы выбрали во время процедуры установки (например, /usr/local/lib/python2.7/dist-packages). В этой папке будет папка тензор потока / включения, в которой будут все заголовки. Вам нужно будет проделать небольшую работу, чтобы убедиться, что все, что вы строите, имеет это на пути включения. Я лично использую CMAKE, так что брожу через это .
Дуайт
4
Это не настоящий ответ до этой даты. Он начинается с «Для начала», а затем не связывает релевантную информацию в месте, которое люди, ищущие руководство, уже искали. Затем он не может обеспечить следующий шаг, меняя тему.
iantonuk
28

Чтобы добавить к сообщению @ 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

Джим
источник
1
Привет Джим. это руководство все еще лучший / самый простой способ компилировать проект C ++ с TF? Или есть более простой способ, как вы предсказываете в конце своего поста?
Сандер
3
Я считаю, что теперь есть встроенное правило сборки. Я представил PR для этого некоторое время назад. Я не уверен насчет предостережений. Я ожидаю, что первым останется, потому что это результат Базеля, а не TF. Второй может быть улучшен.
Джим
Я последовал за что учебник, но при запуске ./loaderя получаю сообщение об ошибке: Not found: models/train.pb.
9-е измерение
3
Есть ли теперь способ, чтобы ваш проект был вне директории с исходным кодом TensorFlow?
Seanny123
да, как сделать это, если вы поделились .so библиотека tenorflow?
Xyz
15

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

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

Во-первых, после установки 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
lababidi
источник
Я считаю, что нет необходимости устанавливать protobuf и Eigen. Конфигурация рабочей области Bazel включает в себя правила для загрузки и сборки этих компонентов.
4
наконец, сумасшедшее ОФИЦИАЛЬНОЕ руководство по сборке по адресу tenorflow.org/install/source предназначено для сборки модуля pip, tks для опции сборки "tennflowflow: libtensorflow_cc.so", оно даже не задокументировано на tenorflow.org
datdinhquoc
@lababidi, какие зависимости c ++ должны быть перед командой 'bazel build'? я сталкиваюсь с проблемой, что сборка завершается неудачей через час, это сложно проверить снова и снова
datdinhquoc
15

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

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

Ренан Вилле
источник
1
Мне понадобился этот дополнительный путь включения для сборки с версией 1.11:tensorflow/bazel-tensorflow/external/com_google_absl
Noah_S
8

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

Floop
источник
8

Если вы не хотите собирать 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.

kecsap
источник
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 ++.

Мартин Пека
источник
Я не мог заставить это работать. Я получил кучу ошибок времени ссылки о неопределенных ссылках на вещи Python, такие как:undefined reference to 'PyType_IsSubtype'
0xcaff
О, спасибо, что указал на это ... Вы также должны ссылаться на python2.7библиотеку ... Я отредактирую сообщение соответственно.
Мартин
@MartinPecka Я попробовал это на Raspbian Buster с помощью armv7l (Raspberry PI 2). Последние доступные колеса Python 2.7 и 3.7 для 1.14.0, но я нацеливаюсь на 2.0.0. В любом случае, спасибо, я проголосовал за твой взлом.
Дайсуке Арамаки
2

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

Рок Чжуан
источник
2

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

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
hakunami
источник
1
это был действительно полезный фрагмент, возникла проблема при создании каталога, поэтому мне пришлось добавить это mkdir -p $DST/tensorflow$target_dirраньшеcp $line $DST/tensorflow/$target_dir
user969068
@hakunami Я сделал суть из этого сценария . Дайте мне знать, что вы думаете. Если ты хочешь сделать свой собственный гист, я уберу свой и клонирую твой.
Дайсуке Арамаки