Как построить и использовать Google TensorFlow C++ api
Я очень хочу начать использовать новую библиотеку Tensorflow от Google на C++. Веб-сайт и документы просто очень неясны с точки зрения того, как построить API c++ проекта, и я не знаю, с чего начать.
может ли кто-то с большим опытом помочь, обнаружив и поделившись руководством по использованию API c++ tensorflow?
9 ответов:
чтобы начать работу, вы должны загрузить исходный код из Github, по следуя инструкциям здесь (вам понадобится Базел и недавняя версия GCC).
API C++ (и серверная часть системы) находится в
tensorflow/core
. Прямо сейчас, только интерфейс сеанса C++ и C API поддерживаются. Вы можете использовать любой из них для выполнения графиков TensorFlow, которые были построены с использованием API Python и сериализованы в aGraphDef
буфера протокола. Существует также экспериментальная функция для построения графиков в C++, но в настоящее время она не столь полнофункциональна, как API Python (например, в настоящее время нет поддержки автоматической дифференциации). Вы можете увидеть пример программы, которая строит небольшой график в C++ здесь.вторая часть C++ API-это API для добавления нового
OpKernel
, который является классом, содержащим реализации числовых ядер для CPU и GPU. Есть множество примеров о том, как построить их вtensorflow/core/kernels
, а также учебник для добавления нового op в C++.
чтобы добавить к сообщению @mrry, я собрал учебник, в котором объясняется, как загрузить график тензорного потока с помощью API C++. Это очень минимально и должно помочь вам понять, как все части подходят друг к другу. Вот его мясо:
требования:
структура:
- Базел установлен
- clone 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
BUILD:
cc_binary( name = "<project name>", srcs = ["<project name>.cc"], deps = [ "//tensorflow/core:tensorflow", ] )
два предостережения, для которых, вероятно, есть обходные пути:
- прямо сейчас, строительство вещи должны произойти внутри РЕПО тензорного потока.
- скомпилированный двоичный файл огромный (103MB).
https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f
Если вы хотите избежать как построения своих проектов с Bazel, так и генерации большого двоичного файла, я собрал репозиторий, инструктирующий использование библиотеки TensorFlow C++ с CMake. Вы можете найти его здесь. Общие идеи таковы:
- клонировать репозиторий TensorFlow.
- Добавить правило сборки в
tensorflow/BUILD
(предоставленные не включают все функции C++).- построить общий тензорный поток библиотека.
- установите определенные версии Eigen и Protobuf или добавьте их в качестве внешних зависимостей.
- настройте свой проект CMake для использования библиотеки TensorFlow.
во-первых, после установки
protobuf
иeigen
, вы хотели бы построить Tensorflow:./configure bazel build //tensorflow:libtensorflow_cc.so
затем скопируйте следующие заголовки include и динамическую общую библиотеку в
/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
вы можете использовать этот ShellScript для установки (большинства) его зависимостей, клонирования, сборки, компиляции и получения всех необходимых файлов в :
https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
я использую hack / обходной путь, чтобы избежать необходимости самостоятельно создавать всю библиотеку 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
, вы можете получить лучшую совместимость с другими программами, написанными для работы с ТФ.затем создайте проект 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++.
Если вы не возражаете использовать CMake, есть также tensorflow_cc проект, который строит и устанавливает TF C++ API для вас, а также удобные цели CMake, с которыми вы можете связать. Проект README содержит пример и Dockerfiles вы можете легко следовать.
если вы думаете об использовании TensorFlow C++ api в автономном пакете, вам, вероятно, понадобится tensorflow_cc.so ( существует также версия C api tensorflow.so ) для построения версии c++ вы можете использовать:
bazel build -c opt //tensorflow:libtensorflow_cc.so
Примечание 1: Если вы хотите добавить встроенную поддержку, вы можете добавить эти флаги как:
--copt=-msse4.2 --copt=-mavx
Note2: если вы думаете об использовании 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.
боковое Примечание: пути относительно tensorflow версии 1.5 (возможно, Вам потребуется проверить, есть ли в вашей версии что-нибудь измененный.)
также эта ссылка очень помогла мне найти всю эту информацию:ссылке
Если вы не хотите создавать Tensorflow самостоятельно и ваша операционная система Debian или Ubuntu, вы можете скачать готовые пакеты с библиотеками Tensorflow C/C++. Этот дистрибутив можно использовать для вывода C/C++ с CPU, поддержка GPU не включена:
https://github.com/kecsap/tensorflow_cpp_packaging/releases
есть инструкции, написанные как заморозить контрольную точку в Tensorflow (TFLearn) и загрузить эту модель для вывода с помощью C / C++ API:
https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md
будьте осторожны: я разработчик этого проекта Github.