Cómo crear y usar la api de Google TensorFlow C++


Estoy realmente ansioso por comenzar a usar la nueva biblioteca Tensorflow de Google en C++. El sitio web y los documentos son muy poco claros en términos de cómo construir la API de C++ del proyecto y no se por dónde empezar.

¿Puede alguien con más experiencia ayudar descubriendo y compartiendo una guía para usar la API C++ de tensorflow?

Author: Deduplicator, 2015-11-10

9 answers

Para empezar, debes descargar el código fuente de Github, por siguiendo las instrucciones aquí (necesitarás Bazel y una versión reciente de GCC).

La API de C++ (y el backend del sistema) está en tensorflow/core. En este momento, solo se admiten la interfaz de sesión C++ y la API C . Puede usar cualquiera de estos para ejecutar gráficos de TensorFlow que se han construido utilizando la API de Python y serializados a un búfer de protocolo GraphDef. Hay también es una característica experimental para la construcción de gráficos en C++, pero actualmente no es tan completa como la API de Python (por ejemplo, no hay soporte para la diferenciación automática en la actualidad). Puede ver un programa de ejemplo que construye un pequeño gráfico en C++ aquí.

La segunda parte de la API de C++ es la API para agregar una nueva OpKernel, que es la clase que contiene implementaciones de núcleos numéricos para CPU y GPU. Hay numerosos ejemplos de cómo construir estos en tensorflow/core/kernels, así como un tutorial para agregar un nuevo op en C++.

 44
Author: mrry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-10 03:41:23

Para agregar a la publicación de @mrry, armé un tutorial que explica cómo cargar un gráfico TensorFlow con la API de C++. Es muy mínimo y debería ayudarte a entender cómo encajan todas las piezas. Aquí está la carne de la misma:

Requisitos:

  • Bazel instalado
  • Clone TensorFlow repo

Estructura de carpetas:

  • tensorflow/tensorflow/|project name|/
  • tensorflow/tensorflow/|project name|/|project name|.cc (e.g. https://gist.github.com/jimfleming/4202e529042c401b17b7)
  • tensorflow/tensorflow/|project name|/BUILD

CONSTRUCCIÓN:

cc_binary(
    name = "<project name>",
    srcs = ["<project name>.cc"],
    deps = [
        "//tensorflow/core:tensorflow",
    ]
)

Dos advertencias para las cuales hay son probablemente soluciones alternativas:

  • Ahora mismo, construir cosas tiene que suceder dentro de el repositorio TensorFlow.
  • El binario compilado es enorme (103MB).

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

 23
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 00:38:14

Si desea evitar tanto construir sus proyectos con Bazel como generar un binario grande, he reunido un repositorio que indica el uso de la biblioteca TensorFlow C++ con CMake. Puedes encontrarlo aquí. Las ideas generales son las siguientes:

  • Clona el repositorio TensorFlow.
  • Agregue una regla de compilación a tensorflow/BUILD (las proporcionadas no incluyen toda la funcionalidad de C++).
  • Construya la biblioteca compartida de TensorFlow.
  • Instalar versiones específicas de Eigen y Protobuf, o agregarlos como dependencias externas.
  • Configure su proyecto CMake para usar la biblioteca TensorFlow.
 12
Author: cjweeks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-04 16:15:16

Primero, después de instalar protobuf y eigen, te gustaría compilar Tensorflow:

./configure
bazel build //tensorflow:libtensorflow_cc.so

Luego Copie los siguientes encabezados include y la biblioteca compartida dinámica en /usr/local/lib y /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/

Por último, compilar usando un ejemplo:

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
 9
Author: lababidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-31 19:32:11

Puede usar este ShellScript para instalar (la mayoría) de sus dependencias, clonar, compilar y obtener todos los archivos necesarios en la carpeta ../src/includes:

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

 8
Author: Ivan Seidel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-02 14:21:58

Utilizo un truco/solución para evitar tener que construir toda la biblioteca TF yo mismo (lo que ahorra tiempo (se configura en 3 minutos), espacio en disco, instalación de dependencias de desarrollo y tamaño del binario resultante). Oficialmente no es compatible, pero funciona bien si solo quieres entrar rápidamente.

Instale TF a través de pip (pip install tensorflow o pip install tensorflow-gpu). Luego encuentre su biblioteca _pywrap_tensorflow.so (TF 0.* - 1.0) o _pywrap_tensorflow_internal.so (TF 1.1+). En mi caso (Ubuntu) se encuentra en /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so. A continuación, crear un enlace simbólico a esta biblioteca llamada lib_pywrap_tensorflow.so en algún lugar donde su sistema de compilación lo encuentre (por ejemplo, /usr/lib/local). El prefijo lib es importante! También puede darle otro nombre lib*.so - si lo llama libtensorflow.so, puede obtener una mejor compatibilidad con otros programas escritos para trabajar con TF.

Luego crea un proyecto C++ como estás acostumbrado (CMake, Make, Bazel, lo que quieras).

Y entonces estás listo para enlazar contra esta biblioteca para tener TF disponible para tus proyectos (y también tienes que enlazar contra bibliotecas python2.7)! En CMake, por ejemplo, solo agrega target_link_libraries(target _pywrap_tensorflow python2.7).

Los archivos de cabecera de C++ se encuentran alrededor de esta biblioteca, por ejemplo, en /usr/local/lib/python2.7/dist-packages/tensorflow/include/.

Una vez más: esta forma no es compatible oficialmente y puede ejecutarse en varios problemas. La biblioteca parece estar vinculada estáticamente contra, por ejemplo, protobuf, por lo que puede ejecutarse en problemas de tiempo de enlace o tiempo de ejecución impares. Pero soy capaz de cargar un gráfico almacenado, restaurar los pesos y ejecutar inferencia, que es IMO la funcionalidad más deseada en C++.

 4
Author: Martin Pecka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-02 00:11:42

Si no le importa usar CMake, también hay un proyecto tensorflow_cc que construye e instala la API de TF C++ para usted, junto con objetivos CMake convenientes contra los que puede enlazar. El proyecto README contiene un ejemplo y Dockerfiles que puede seguir fácilmente.

 4
Author: Floop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-19 08:53:21

Si está pensando en usar la api de Tensorflow c++ en un paquete independiente, probablemente necesitará tensorflow_cc.so ( También hay una versión de c api tensorflow.so ) para construir la versión de c++ se puede utilizar:

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

Nota1: Si desea agregar soporte intrínseco, puede agregar estas banderas como: --copt=-msse4.2 --copt=-mavx

Nota2: Si también está pensando en usar OpenCV en su proyecto, hay un problema al usar ambas bibliotecas juntas (tensorflow issue) y debe usar --config=monolithic.

Después de construir la biblioteca, debe agregarla a su proyecto. Para ello puedes incluir estas rutas:

tensorflow
tensorflow/bazel-tensorflow/external/eigen_archive
tensorflow/bazel-tensorflow/external/protobuf_archive/src
tensorflow/bazel-genfiles

Y enlaza la biblioteca con tu proyecto:

tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so (unused if you build with --config=monolithic)
tensorflow/bazel-bin/tensorflow/libtensorflow_cc.so

Y cuando esté construyendo su proyecto, también debe especificar a su compilador que va a usar los estándares de c++11.

Nota al margen: Rutas relativas a tensorflow versión 1.5(Es posible que tenga que comprobar si en su versión algo ha cambiado).

También este enlace me ayudó mucho a encontrar todas estas informaciones: link

 4
Author: Renan Wille,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-11 01:02:14

Si no desea compilar Tensorflow usted mismo y su sistema operativo es Debian o Ubuntu, puede descargar paquetes prediseñados con las bibliotecas Tensorflow C/C++. Esta distribución se puede utilizar para inferencia de C/C++ con CPU, el soporte de GPU no está incluido:

Https://github.com/kecsap/tensorflow_cpp_packaging/releases

Hay instrucciones escritas sobre cómo congelar un punto de control en Tensorflow (TFLearn) y cargar este modelo para inferencia con el C / C++ API:

Https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md

Cuidado: Soy el desarrollador de este proyecto Github.

 3
Author: kecsap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-05 21:56:54