Come creare e utilizzare Google TensorFlow C ++ api

Sono davvero desideroso di iniziare a utilizzare la nuova libreria Tensorflow di Google in C ++. Il sito Web e i documenti sono davvero poco chiari in termini di come build l’API C ++ del progetto e non so da dove iniziare.

Qualcuno con più esperienza può aiutare scoprendo e condividendo una guida sull’uso dell’API C ++ di tensorflow?

Per iniziare, devi scaricare il codice sorgente da Github, seguendo le istruzioni qui (avrai bisogno di Bazel e una versione recente di GCC).

L’API C ++ (e il backend del sistema) è in tensorflow/core . Al momento, solo l’ interfaccia C ++ Session e l’ API C sono supportati. È ansible utilizzare uno di questi per eseguire grafici TensorFlow creati utilizzando l’API Python e serializzati su un buffer del protocollo GraphDef . Esiste anche una funzionalità sperimentale per la creazione di grafici in C ++, ma al momento non è così piena di funzionalità come l’API Python (ad esempio, al momento non esiste alcun supporto per l’auto-differenziazione). Puoi vedere un programma di esempio che costruisce un piccolo grafico in C ++ qui .

La seconda parte dell’API C ++ è l’API per aggiungere un nuovo OpKernel , che è la class contenente le implementazioni dei kernel numerici per CPU e GPU. Ci sono numerosi esempi su come costruirli in tensorflow/core/kernels , nonché un tutorial per aggiungere un nuovo operando in C ++ .

Per aggiungere al post di @ mrry, ho messo insieme un tutorial che spiega come caricare un grafico TensorFlow con l’API C ++. È molto minimale e dovrebbe aiutarti a capire come tutti i pezzi combaciano. Ecco la carne di questo:

Requisiti:

  • Bazel installato
  • Clone TensorFlow repo

Struttura delle cartelle:

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

COSTRUIRE:

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

Due caveat per cui ci sono probabilmente soluzioni alternative:

  • In questo momento, la creazione di cose deve avvenire all’interno del repository TensorFlow.
  • Il binario compilato è enorme (103 MB).

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

Se si desidera evitare entrambi di build i propri progetti con Bazel e di generare un binario di grandi dimensioni, ho assemblato un repository per istruire l’utilizzo della libreria TensorFlow C ++ con CMake. Puoi trovarlo qui . Le idee generali sono le seguenti:

  • Clona il repository TensorFlow.
  • Aggiungi una regola di costruzione a tensorflow/BUILD (quelle fornite non includono tutte le funzionalità di C ++).
  • Costruisci la libreria condivisa di TensorFlow.
  • Installa versioni specifiche di Eigen e Protobuf o aggiungili come dipendenze esterne.
  • Configura il tuo progetto CMake per utilizzare la libreria TensorFlow.

Innanzitutto, dopo aver installato protobuf ed eigen , ti piacerebbe build Tensorflow:

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

Quindi copia le seguenti intestazioni di inclusione e libreria dynamic condivisa in /usr/local/lib e /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/ 

Infine, compila usando un esempio:

 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 

Puoi usare questo ShellScript per installare (la maggior parte) delle sue dipendenze, clonare, compilare, compilare e ottenere tutti i file necessari nella cartella ../src/includes :

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

Uso un hack / workaround per evitare di dover build da solo l’intera libreria TF (che consente di risparmiare tempo (è impostato in 3 minuti), spazio su disco, installazione delle dipendenze di sviluppo e dimensione del file binario risultante). È ufficialmente non supportato, ma funziona bene se vuoi semplicemente entrare rapidamente.

Installare TF attraverso pip ( pip install tensorflow o pip install tensorflow-gpu ). Quindi trova la sua libreria _pywrap_tensorflow.so (TF 0. * – 1.0) o _pywrap_tensorflow_internal.so (TF 1.1+). Nel mio caso (Ubuntu) si trova in /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so . Quindi crea un lib_pywrap_tensorflow.so simbolico a questa libreria chiamata lib_pywrap_tensorflow.so da qualche parte dove il tuo sistema di build lo trova (es. /usr/lib/local ). Il prefisso lib è importante! Puoi anche dargli un altro nome di lib*.so – se lo chiami libtensorflow.so , potresti ottenere una migliore compatibilità con altri programmi scritti per funzionare con TF.

Quindi crea un progetto C ++ come sei abituato (CMake, Make, Bazel, qualunque cosa tu voglia).

E poi sei pronto a collegarti a questa libreria per avere TF disponibile per i tuoi progetti (e devi anche collegarti alle librerie python2.7 )! In CMake, ad esempio, aggiungi semplicemente target_link_libraries(target _pywrap_tensorflow python2.7) .

I file di intestazione C ++ si trovano attorno a questa libreria, ad es. In /usr/local/lib/python2.7/dist-packages/tensorflow/include/ .

Ancora una volta: in questo modo non è ufficialmente supportato e puoi correre in vari problemi. La libreria sembra essere collegata staticamente ad es. Protobuf, quindi è ansible che si verifichino problemi di link-time o run-time. Ma sono in grado di caricare un grafico memorizzato, ripristinare i pesi e eseguire l’inferenza, che è IMO la funzionalità più ricercata in C ++.

Se non ti dispiace usare CMake, c’è anche il progetto tensorflow_cc che costruisce e installa l’API TF C ++ per te, insieme ai comodi target di CMake a cui puoi collegarti. Il progetto README contiene un esempio e file Docker che puoi seguire facilmente.

Se stai pensando di usare Tensorflow c ++ api su un pacchetto standalone probabilmente avrai bisogno di tensorflow_cc.so (c’è anche la versione ac api di tensorflow.so) per build la versione c ++ che puoi usare:

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

Nota 1: se si desidera aggiungere il supporto intrinseche, è ansible aggiungere questi flag come: --copt=-msse4.2 --copt=-mavx

Nota 2: Se stai pensando di usare OpenCV anche nel tuo progetto, c’è un problema quando usi entrambe le librerie insieme ( problema di tensorflow ) e dovresti usare --config=monolithic .

Dopo aver costruito la libreria devi aggiungerla al tuo progetto. Per farlo puoi includere questo percorso:

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

E collega la biblioteca al tuo progetto:

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

E quando stai costruendo il tuo progetto dovresti anche specificare sul tuo compilatore che userete gli standard c ++ 11.

Nota a margine: percorsi relativi alla versione 1.5 di tensorflow (potrebbe essere necessario verificare se nella versione è cambiato qualcosa).

Anche questo link mi ha aiutato molto a trovare tutte queste informazioni: link

Se non si desidera build Tensorflow autonomamente e il proprio sistema operativo è Debian o Ubuntu, è ansible scaricare pacchetti precompilati con le librerie Tensorflow C / C ++. Questa distribuzione può essere utilizzata per l’inferenza C / C ++ con CPU, il supporto GPU non è incluso:

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

Sono state scritte istruzioni su come bloccare un checkpoint in Tensorflow (TFLearn) e caricare questo modello per l’inferenza con l’API C / C ++:

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

Attenzione: sono lo sviluppatore di questo progetto Github.