Як створити та використовувати Google TensorFlow C ++ api


168

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

Чи може допомогти хтось із більшим досвідом, виявивши та поділившись посібником із використання C ++ API tensorflow?


4
+1 для вашого запитання. Будь-який шанс встановити / компілювати в Windows? Веб-сайт показує лише Linux / Mac. Потрібен путівник по запуску базелі. Цей приклад може стати гарною відправною точкою для вивчення: github.com/tensorflow/tensorflow/tree/master/tensorflow/…
alrama

На це запитання досі немає відповіді. Як встановити лише бібліотеки API C ++ tensorflow C ++, довідник не має, і прийнята відповідь не дає ніяких гарантій щодо цього, навіть через будь-яке із декількох наданих посилань.
iantonuk

Для Windows я знайшов це питання та його прийняту відповідь найбільш корисною. Створюючи приклад тренерського проекту, ви будуєте весь проект TensorFlow як статичну бібліотеку, після чого посилаєтесь на нього. Ви можете робити власні проекти та зв’язувати TensorFlow тим же способом.
оматай

Відповіді:


2

Однією з альтернатив використання API Tensorflow C ++, який я знайшов, є використання cppflow .

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


55

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

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

Друга частина API C ++ - це API для додавання нового OpKernel, що є класом, що містить реалізацію чисельних ядер для процесора та GPU. Існує численні приклади, як їх створити tensorflow/core/kernels, а також навчальний посібник для додавання нової опції в C ++ .


7
Інструкції по встановленню для C ++ не показані tensorflow.org/install , але є приклади програм, показаних tensorflow.org/api_guides/cc/guide, які чітко використовують C ++ api. Як саме ви встановили C ++ для Tensorflow?
user3667089

@ user3667089 Місце розташування процедури встановлення зараз знаходиться за адресою tensorflow.org/install/install_sources
Дуайт

6
@Dwight Я бачив цю сторінку раніше, але я не бачу жодної інформації про C ++
user3667089

2
@ user3667089 Заголовки, після встановленої вище процедури встановлення, будуть розміщені в папці dist-пакети розподілу python, яку ви обрали під час процедури встановлення (наприклад, /usr/local/lib/python2.7/dist-packages). У цій папці буде папка tensorflow / include, яка матиме всі заголовки. Вам потрібно буде трохи попрацювати, щоб переконатися, що все, що ви будуєте, має на цьому включити шлях. Я особисто використовую CMAKE, тому переживаю це .
Дуайт

4
На сьогодні це не справжня відповідь. Він починається з "Початок роботи", а потім посилається на відсутність відповідної інформації в тому місці, на яке люди, які шукають тут інструкції, уже шукали б. Потім він не забезпечує наступний крок, змінюючи тему.
iantonuk

28

Щоб додати до публікації @ mrry, я склав підручник, який пояснює, як завантажити графік TensorFlow за допомогою API C ++. Це дуже мінімально і повинно допомогти вам зрозуміти, як всі шматки поєднуються разом. Ось м'ясо його:

Вимоги:

  • Базель встановлений
  • Клон 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

ПОБУДОВА:

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

Я пішов за що підручник, але при запуску ./loaderя отримую повідомлення про помилку: Not found: models/train.pb.
9-й вимір

3
Чи є зараз спосіб мати ваш проект поза каталогом вихідного коду TensorFlow?
Seanny123

так, як зробити це оустидом, якщо ви поділилися.
Xyz

15

Якщо ви хочете уникнути створення своїх проектів із Bazel та створення великого бінарного файлу, я зібрав сховище, яке інструктує використання бібліотеки TensorFlow C ++ з CMake. Ви можете знайти його тут . Загальні ідеї такі:

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

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

Я вважаю, що не потрібно встановлювати protobuf та eigen. Конфігурація робочої області Bazel включає правила завантаження та складання цих компонентів.
4дан

нарешті, шалений ОФІЦІЙНИЙ посібник зі збірки на tensorflow.org/install/source призначений для побудови модуля pip, tks для опції збірки "tensorflow: libtensorflow_cc.so", це навіть не зафіксовано на tensorflow.org
datdinhquoc

@lababidi, які залежності від c ++ повинні бути перед командою "bazel build"? Я зіткнувся з питанням, що збірка не справляється через годину, це важко перевірити збірку знову і знову
datdinhquoc

15

Якщо ви думаєте використовувати Tensorflow c ++ api в окремому пакеті, можливо, вам знадобиться tensorflow_cc.so (Є також версія AC api tensorflow.so) для створення версії c ++, яку ви можете використовувати:

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

Примітка1: Якщо ви хочете додати внутрішню підтримку, ви можете додати ці прапори як: --copt=-msse4.2 --copt=-mavx

Примітка2: Якщо ви також думаєте використовувати OpenCV у вашому проекті, виникає проблема при використанні обох контурів разом ( проблема tensorflow ), і вам слід скористатися --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 tensorflow (Можливо, вам потрібно буде перевірити, чи змінилось у вашій версії).

Також ця посилання мені дуже допомогла знайти всі ці відомості: посилання


1
Мені знадобився цей додатковий включити шлях для створення з версією 1.11:tensorflow/bazel-tensorflow/external/com_google_absl
Noah_S


8

Якщо ви не заперечуєте проти використання CMake, існує також проект tensorflow_cc, який створює та встановлює для вас API TF C ++, а також зручні цілі CMake, з якими ви можете зв’язатись. Проект README містить приклад та Dockerfiles, за якими ви можете легко наслідувати.


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.


5

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

Встановіть 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.

Потім створіть проект 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/ .

Ще раз: цей спосіб офіційно не підтримується, і ви можете працювати з різними випусками. Здається, що бібліотека статично пов'язана, наприклад, з протобуфами, тому ви можете запускатись у непарних проблемах з часом зв’язку або під час виконання. Але я в змозі завантажити збережений графік, відновити ваги і виконати умовивід, що є 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

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

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

1
це було дуже корисним фрагментом, під час створення каталогу виникла проблема, тому я повинен був додати це mkdir -p $DST/tensorflow$target_dirранішеcp $line $DST/tensorflow/$target_dir
user969068

@hakunami Я написав суть цього сценарію . Дайте мені знати, що ви думаєте. Якщо ви хочете зробити власну суть, я знімаю мою і клоную вашу.
Дайсуке
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.