Как создать и использовать 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