Cara membuat dan menggunakan Google TensorFlow C ++ api

169

Saya benar-benar ingin mulai menggunakan perpustakaan Tensorflow baru Google di C ++. Situs web dan dokumen benar-benar tidak jelas dalam hal bagaimana membangun C ++ API proyek dan saya tidak tahu harus mulai dari mana.

Dapatkah seseorang dengan pengalaman lebih banyak membantu dengan menemukan dan berbagi panduan untuk menggunakan C ++ API tensorflow?

theideasmith
sumber
4
+1 untuk pertanyaan Anda. Adakah peluang untuk menginstal / kompilasi pada Windows? Situs web hanya menampilkan Linux / Mac. Dibutuhkan panduan untuk menjalankan bazel. Contoh ini bisa menjadi titik awal yang baik untuk belajar: github.com/tensorflow/tensorflow/tree/master/tensorflow/…
alrama
Pertanyaan ini masih belum memiliki jawaban. Cara menginstal hanya C ++ tensorflow C ++ API libraries tidak memiliki panduan untuk itu, dan jawaban yang diterima tidak memberikan petunjuk tentang bagaimana untuk itu, bahkan melalui beberapa tautan yang disediakan.
iantonuk
Untuk Windows, saya menemukan pertanyaan ini dan jawaban yang diterima paling membantu. Dengan membangun proyek contoh trainer, Anda membangun seluruh proyek TensorFlow sebagai pustaka statis, lalu menautkannya. Anda dapat membuat proyek sendiri dan menautkan TensorFlow dengan cara yang sama.
omatai

Jawaban:

2

Salah satu alternatif untuk menggunakan Tensorflow C ++ API yang saya temukan adalah menggunakan cppflow .

Ini adalah pembungkus C ++ yang ringan di sekitar Tensorflow C API . Anda mendapatkan executable yang sangat kecil dan tautannya terhadap file yang libtensorflow.sosudah dikompilasi. Ada juga contoh penggunaan dan Anda menggunakan CMAKE bukan Bazel.

Bersan
sumber
55

Untuk memulai, Anda harus mengunduh kode sumber dari Github, dengan mengikuti instruksi di sini (Anda akan memerlukan Bazel dan versi terbaru GCC).

C ++ API (dan bagian belakang sistem) ada di tensorflow/core. Saat ini, hanya antarmuka C ++ Session , dan C API yang didukung. Anda dapat menggunakan salah satu dari ini untuk menjalankan grafik TensorFlow yang telah dibangun menggunakan API Python dan diserialisasi ke GraphDefbuffer protokol. Ada juga fitur eksperimental untuk membuat grafik di C ++, tetapi ini saat ini tidak cukup berfitur lengkap seperti API Python (mis. Tidak ada dukungan untuk diferensiasi otomatis saat ini). Anda dapat melihat contoh program yang membuat grafik kecil dalam C ++ di sini .

Bagian kedua dari C ++ API adalah API untuk menambahkan yang baru OpKernel, yang merupakan kelas yang berisi implementasi kernel numerik untuk CPU dan GPU. Ada banyak contoh bagaimana membangun initensorflow/core/kernels , serta tutorial untuk menambahkan op baru di C ++ .

Pak
sumber
7
Tidak ada instruksi instalasi untuk C ++ yang ditampilkan tensorflow.org/install , tetapi ada contoh program yang ditunjukkan tensorflow.org/api_guides/cc/guide yang jelas menggunakan C ++ api. Bagaimana tepatnya Anda menginstal C ++ untuk Tensorflow?
user3667089
@ user3667089 Lokasi prosedur instalasi sekarang berada di tensorflow.org/install/install_sources
Dwight
6
@Dight Saya melihat halaman itu sebelumnya tetapi saya tidak melihat info tentang C ++
user3667089
2
@ user3667089 Header, setelah prosedur instalasi di atas, akan ditempatkan di dalam folder dist-paket distribusi python yang Anda pilih selama prosedur instalasi (seperti /usr/local/lib/python2.7/dist-packages). Dalam folder itu akan ada folder tensorflow / include, yang akan memiliki semua header. Anda harus melakukan sedikit pekerjaan untuk memastikan apa pun yang Anda sedang membangun memiliki itu pada jalurnya. Saya pribadi menggunakan CMAKE, jadi saya berjalan dengan susah payah melalui ini .
Dwight
4
Ini bukan jawaban nyata hingga saat ini. Ini dimulai dengan "Untuk memulai" dan kemudian menautkan tidak ada info yang relevan di tempat yang orang mencari bimbingan di sini sudah akan mencari. Kemudian gagal memberikan langkah berikutnya, mengubah topik pembicaraan.
iantonuk
28

Untuk menambah posting @ mrry, saya menyusun tutorial yang menjelaskan cara memuat grafik TensorFlow dengan C ++ API. Ini sangat minim dan akan membantu Anda memahami bagaimana semua bagian saling cocok. Inilah dagingnya:

Persyaratan:

  • Bazel diinstal
  • Clone TensorFlow repo

Struktur folder:

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

MEMBANGUN:

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

Dua peringatan yang mungkin ada solusinya:

  • Saat ini, membangun sesuatu harus terjadi di dalam repo TensorFlow.
  • Biner yang dikompilasi sangat besar (103MB).

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

Jim
sumber
1
Halo Jim. apakah tutorial ini masih cara terbaik / termudah untuk mengkompilasi proyek c ++ dengan TF? Atau apakah ada cara yang lebih mudah sekarang saat Anda memprediksi di akhir posting Anda?
Sander
3
Saya percaya sekarang ada aturan built-in build. Saya mengajukan PR untuk itu beberapa waktu lalu. Saya tidak yakin tentang peringatan. Saya harapkan yang pertama tetap karena ini hasil dari Bazel, bukan TF. Yang kedua kemungkinan bisa diperbaiki.
Jim
Aku mengikuti tutorial itu, tapi ketika menjalankan ./loadersaya mendapatkan error: Not found: models/train.pb.
Dimensi 9
3
Apakah sekarang ada cara untuk memiliki proyek Anda di luar direktori kode sumber TensorFlow?
Seanny123
ya, bagaimana membuatnya meskipun Anda telah berbagi. jadi perpustakaan tensorflow?
Xyz
15

Jika Anda ingin menghindari membangun proyek Anda dengan Bazel dan menghasilkan biner besar, saya telah membuat repositori yang menginstruksikan penggunaan perpustakaan TensorFlow C ++ dengan CMake. Anda dapat menemukannya di sini . Gagasan umum adalah sebagai berikut:

  • Klon repositori TensorFlow.
  • Tambahkan aturan build ke tensorflow/BUILD(yang disediakan tidak termasuk semua fungsionalitas C ++).
  • Bangun pustaka bersama TensorFlow.
  • Instal versi spesifik Eigen dan Protobuf, atau tambahkan sebagai dependensi eksternal.
  • Konfigurasikan proyek CMake Anda untuk menggunakan perpustakaan TensorFlow.
cwewe
sumber
15

Pertama, setelah menginstal protobufdan eigen, Anda ingin membangun Tensorflow:

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

Kemudian Salin yang berikut menyertakan tajuk dan pustaka bersama dinamis ke /usr/local/libdan /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/

Terakhir, kompilasi menggunakan contoh:

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
lababidi
sumber
Saya percaya tidak perlu menginstal protobuf dan eigen. Konfigurasi ruang kerja bazel mencakup aturan untuk mengunduh dan membangun komponen-komponen itu.
4dan
akhirnya, panduan build RESMI gila di tensorflow.org/install/source adalah untuk membangun modul pip, tks untuk opsi build "tensorflow: libtensorflow_cc.so", itu bahkan tidak didokumentasikan di tensorflow.org
datdinhquoc
@ lababidi apa c ++ dependensi seharusnya sebelum perintah 'bazel build'? Saya menghadapi masalah bahwa build gagal setelah satu jam, ini sulit untuk menguji build lagi dan lagi
datdinhquoc
15

Jika Anda berpikir untuk menggunakan Tensorflow c ++ api pada paket mandiri Anda mungkin perlu tensorflow_cc.so (Ada juga ac api versi tensorflow.so) untuk membangun versi c ++ yang dapat Anda gunakan:

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

Catatan1: Jika Anda ingin menambahkan dukungan intrinsik, Anda dapat menambahkan flag ini sebagai: --copt=-msse4.2 --copt=-mavx

Note2: Jika Anda berpikir untuk menggunakan OpenCV pada proyek Anda juga, ada masalah ketika menggunakan kedua lib secara bersamaan ( masalah tensorflow ) dan Anda harus menggunakannya --config=monolithic.

Setelah membangun perpustakaan, Anda perlu menambahkannya ke proyek Anda. Untuk melakukan itu Anda bisa memasukkan jalur ini:

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

Dan tautkan perpustakaan ke proyek Anda:

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

Dan ketika Anda sedang membangun proyek Anda, Anda juga harus menentukan untuk kompiler Anda bahwa Anda akan menggunakan standar c ++ 11.

Catatan Sisi: Jalur relatif ke tensorflow versi 1.5 (Anda mungkin perlu memeriksa apakah di versi Anda ada yang berubah).

Juga tautan ini banyak membantu saya dalam menemukan semua info ini: tautan

Renan Wille
sumber
1
Saya membutuhkan tambahan ini termasuk jalur untuk membangun dengan versi 1.11:tensorflow/bazel-tensorflow/external/com_google_absl
Noah_S
8

Jika Anda tidak keberatan menggunakan CMake, ada juga proyek tensorflow_cc yang membuat dan menginstal TF C ++ API untuk Anda, bersama dengan target CMake yang nyaman yang dapat Anda tautkan. Proyek README berisi contoh dan Dockerfiles yang dapat Anda ikuti dengan mudah.

Floop
sumber
8

Jika Anda tidak ingin membuat Tensorflow sendiri dan sistem operasi Anda adalah Debian atau Ubuntu, Anda dapat mengunduh paket prebuilt dengan pustaka Tensorflow C / C ++. Distribusi ini dapat digunakan untuk inferensi C / C ++ dengan CPU, dukungan GPU tidak termasuk:

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

Ada instruksi tertulis bagaimana membekukan sebuah pos pemeriksaan di Tensorflow (TFLearn) dan memuat model ini untuk inferensi dengan API C / C ++:

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

Waspadalah: Saya adalah pengembang proyek Github ini.

kecsap
sumber
5

Saya menggunakan hack / solusi untuk menghindari harus membangun seluruh perpustakaan TF sendiri (yang menghemat waktu (itu diatur dalam 3 menit), ruang disk, menginstal dependensi dev, dan ukuran biner yang dihasilkan). Secara resmi tidak didukung, tetapi berfungsi dengan baik jika Anda hanya ingin melompat dengan cepat.

Instal TF melalui pip ( pip install tensorflowatau pip install tensorflow-gpu). Kemudian temukan perpustakaannya _pywrap_tensorflow.so(TF 0. * - 1.0) atau _pywrap_tensorflow_internal.so(TF 1.1+). Dalam kasus saya (Ubuntu) itu terletak di /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so. Kemudian buat symlink ke pustaka ini yang disebut di lib_pywrap_tensorflow.sosuatu tempat di mana sistem build Anda menemukannya (mis /usr/lib/local.). Awalan libitu penting! Anda juga dapat memberikannya lib*.sonama lain - jika Anda menyebutnyalibtensorflow.so , Anda mungkin mendapatkan kompatibilitas yang lebih baik dengan program lain yang ditulis untuk bekerja dengan TF.

Kemudian buat proyek C ++ seperti yang biasa Anda lakukan (CMake, Make, Bazel, apa pun yang Anda suka).

Dan kemudian Anda siap untuk hanya menautkan ke perpustakaan ini agar TF tersedia untuk proyek Anda (dan Anda juga harus menautkan ke python2.7perpustakaan)! Di CMake, misalnya Anda hanya menambahkan target_link_libraries(target _pywrap_tensorflow python2.7).

File header C ++ terletak di sekitar perpustakaan ini, misalnya di /usr/local/lib/python2.7/dist-packages/tensorflow/include/.

Sekali lagi: cara ini secara resmi tidak didukung dan Anda dapat menjalankan berbagai masalah. Pustaka tampaknya terhubung secara statis dengan mis. Protobuf, sehingga Anda dapat berjalan dalam masalah waktu-tautan atau waktu-berjalan yang aneh. Tetapi saya dapat memuat grafik yang disimpan, mengembalikan bobot dan menjalankan inferensi, yang merupakan IMO fungsi yang paling dicari di C ++.

Martin Pecka
sumber
Saya tidak bisa melakukan ini. Saya mendapat banyak kesalahan waktu tautan tentang referensi yang tidak terdefinisi untuk hal-hal python seperti:undefined reference to 'PyType_IsSubtype'
0xcaff
Oh, terima kasih sudah menunjukkannya ... Anda juga harus menautkan ke python2.7perpustakaan ... Saya akan mengedit posting yang sesuai.
Martin Pecka
@ MartinPecka Saya mencoba ini di Raspbian Buster dengan armv7l (Raspberry PI 2). Roda Python 2.7 dan 3.7 terbaru yang tersedia adalah untuk 1.14.0, tapi saya menargetkan 2.0.0. Bagaimanapun, terima kasih, saya membatalkan hack Anda.
Daisuke Aramaki
2

Tensorflow sendiri hanya menyediakan contoh yang sangat mendasar tentang C ++ APIs.
Berikut ini adalah sumber yang bagus yang mencakup contoh dataset, rnn, lstm, cnn dan lebih banyak
tensorflow c ++ contoh

Rock Zhuang
sumber
2

jawaban di atas cukup baik untuk menunjukkan cara membangun perpustakaan, tetapi cara mengumpulkan header masih sulit. di sini saya membagikan skrip kecil yang saya gunakan untuk menyalin tajuk yang diperlukan.

SOURCEadalah param pertama, yang merupakan direcoty sumber tensorflow (build);
DSTadalah param kedua, yaitu include directorymemegang tajuk yang dikumpulkan. (mis. dalam 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
hakunami
sumber
1
ini potongan yang sangat membantu, ada masalah saat membuat direktori, jadi saya harus menambahkan ini mkdir -p $DST/tensorflow$target_dirsebelumnyacp $line $DST/tensorflow/$target_dir
user969068
@ tsunami Saya membuat intisari dari skrip ini . Biarkan aku tahu apa yang kamu pikirkan. Jika Anda ingin membuat intisari Anda sendiri, saya akan menghapus milik saya dan mengkloning milik Anda.
Daisuke Aramaki