Google TensorFlow C ++ API'si nasıl oluşturulur ve kullanılır?


169

Google'ın C ++ 'daki yeni Tensorflow kütüphanesini kullanmaya başlamak için gerçekten hevesliyim. Web sitesi ve dokümanlar, projenin C ++ API'sinin nasıl oluşturulacağı konusunda gerçekten belirsiz ve nereden başlayacağımı bilmiyorum.

Daha fazla deneyime sahip biri, tensorflow'un C ++ API'sini kullanma kılavuzunu keşfedip paylaşarak yardımcı olabilir mi?


4
Sorunuz için +1. Windows'a yükleme / derleme şansınız var mı? Web sitesi yalnızca Linux / Mac'i gösterir. Bazel çalışması için bir rehber gereklidir. Bu örnek öğrenmek için iyi bir başlangıç ​​noktası olabilir: github.com/tensorflow/tensorflow/tree/master/tensorflow/…
alrama

Bu sorunun hala bir cevabı yok. Sadece C ++ tensorflow nasıl yüklenir C ++ API kütüphaneleri için bir rehber yoktur ve kabul edilen cevap, sağlanan birden fazla bağlantıdan bile olsa, bunun nasıl yapılacağı konusunda herhangi bir rehberlik vermez.
iantonuk

Windows için bu soruyu ve kabul edilen cevabını en yararlı buldum . Örnek eğitmen projesini oluşturarak, tüm TensorFlow projesini statik bir kütüphane olarak inşa edersiniz, sonra buna bağlarsınız. Kendi projelerinizi yapabilir ve TensorFlow'u aynı şekilde bağlayabilirsiniz.
omatai

Yanıtlar:


2

Tensorflow C ++ API buldum kullanmaya Bir alternatif kullanmaktır cppflow .

Tensorflow C API'sı etrafında hafif bir C ++ sarmalayıcısıdır . Çok küçük yürütülebilir dosyalar alırsınız ve libtensorflow.sozaten derlenmiş dosyaya bağlanır. Ayrıca kullanım örnekleri vardır ve Bazel yerine CMAKE kullanırsınız.


55

Başlamak için, buradaki talimatları izleyerek kaynak kodunu Github'dan indirmelisiniz ( Bazel ve GCC'nin son bir sürümüne ihtiyacınız olacak ).

C ++ API'si (ve sistemin arka ucu) içindedir tensorflow/core. Şu anda, yalnızca C ++ Oturum arabirimi ve C API'si desteklenmektedir. Python API'sı kullanılarak oluşturulmuş ve bir GraphDefprotokol arabelleğine serileştirilmiş TensorFlow grafiklerini yürütmek için bunlardan birini kullanabilirsiniz . C ++ 'da grafik oluşturmak için deneysel bir özellik de vardır, ancak bu şu anda Python API kadar tam özellikli değildir (örneğin şu anda otomatik farklılaşma için destek yoktur). Burada C ++ 'da küçük bir grafik oluşturan örnek bir program görebilirsiniz .

C ++ API'sinin ikinci kısmı, OpKernelCPU ve GPU için sayısal çekirdeklerin uygulamalarını içeren sınıf olan yeni bir ekleme API'sıdır. Bunların nasıl oluşturulacağına dair çok sayıda örnek ve C ++ 'da yeni bir op eklemek içintensorflow/core/kernels bir eğitim var .


7
C ++ için hiçbir kurulum talimatı gösterilmemiştir tensorflow.org/install , ancak açıkça C ++ api kullanan tensorflow.org/api_guides/cc/guide gösterilen örnek programlar vardır . Tensorflow için C ++ 'ı tam olarak nasıl kurdunuz?
user3667089

@ user3667089 Kurulum prosedürünün yeri şimdi tensorflow.org/install/install_sources
Dwight

6
@Dwight Daha önce bu sayfayı gördüm ama C ++ hakkında herhangi bir bilgi göremiyorum
user3667089

2
@ user3667089 Yukarıdaki kurulum prosedüründen sonra üstbilgiler, kurulum prosedürü sırasında seçtiğiniz python dağıtımının dist-Packages klasöründe bulunur (/usr/local/lib/python2.7/dist-packages gibi). Bu klasörde tüm başlıkları içeren bir tensorflow / include klasörü olacaktır. Yaptığınız her şeyin içerme yolunda olduğundan emin olmak için biraz iş yapmanız gerekir. Ben şahsen bu kadar trudging ediyorum, CKağıt kullanmak bu .
Dwight

4
Bu, bu tarihe kadar gerçek bir cevap değil. "Başlamak için" ile başlar ve daha sonra, burada rehberlik arayan kişilerin zaten arayacağı bir yerde hiçbir alakalı bilgi ilişkilendirmez. Daha sonra konuyu değiştirerek bir sonraki adımı sağlayamaz.
iantonuk

28

@ Mrry'nin gönderisine eklemek için, C ++ API'sı ile bir TensorFlow grafiğinin nasıl yükleneceğini açıklayan bir öğretici hazırladım. Çok azdır ve tüm parçaların birbirine nasıl uyduğunu anlamanıza yardımcı olmalıdır. İşte eti:

Gereksinimler:

  • Bazel kuruldu
  • Klon Tensörü Akışı repo

Klasör yapısı:

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

İNŞA ETMEK:

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

Muhtemelen geçici çözümlerin bulunduğu iki uyarı:

  • Şu anda, bir şeyler bina olması gereken dahilinde TensorFlow repo.
  • Derlenen ikili dosya çok büyük (103 MB).

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


1
Merhaba Jim. Bu öğretici hala bir c ++ proje TF ile derlemek için en iyi / en kolay yolu nedir? Yoksa yayınınızın sonunda tahmin ettiğiniz gibi daha kolay bir yol var mı?
Sander

3
Şimdi yerleşik bir inşa kuralı olduğuna inanıyorum. Ben bir süre önce bunun için bir PR sundu. Uyarılardan emin değilim. İlkinin TF değil Bazel'den kaynaklandığını düşünürdüm. İkincisi muhtemelen geliştirilebilir.
Jim

O öğretici izledi ancak çalıştırırken ./loaderbir hata alıyorum: Not found: models/train.pb.
9 Boyut

3
Projenizi TensorFlow kaynak kodu dizininin dışında tutmanın bir yolu var mı?
Seanny123

Evet, tensorflow kütüphanesini paylaştığınız için nasıl oustide olunur?
Xyz

15

Hem projelerinizi Bazel ile inşa etmek hem de büyük bir ikili dosya oluşturmaktan kaçınmak istiyorsanız, CMake ile TensorFlow C ++ kütüphanesinin kullanımını talimat eden bir depo oluşturdum. Burada bulabilirsiniz . Genel fikirler aşağıdaki gibidir:

  • TensorFlow deposunu klonlayın.
  • Oluşturma kuralı ekleyin tensorflow/BUILD(sağlananlar tüm C ++ işlevlerini içermez).
  • TensorFlow paylaşılan kütüphanesini oluşturun.
  • Eigen ve Protobuf'un belirli sürümlerini yükleyin veya harici bağımlılıklar olarak ekleyin.
  • CMake projenizi TensorFlow kitaplığını kullanacak şekilde yapılandırın.

15

İlk olarak, yükledikten sonra protobufve eigenTensorflow'u oluşturmak istersiniz:

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

Sonra oluşturulan aşağıdaki başlıkları ve dinamik paylaşımlı kütüphane yer Kopyalama /usr/local/libve /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/

Son olarak, bir örnek kullanarak derleyin:

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

Protobuf ve öz kurmanın gerekli olmadığına inanıyorum. Bazel çalışma alanı yapılandırması, bu bileşenleri indirmek ve oluşturmak için kurallar içerir.
4dan

nihayet, tensorflow.org/install/source adresindeki çılgın RESMİ inşa rehberi, "tensorflow: libtensorflow_cc.so" inşa seçeneği için tksorflow.org adresinde hazırlanmıştır
daensin

@lababidi 'bazel build' komutundan önce hangi c ++ bağımlılıkları olmalı? Yapı bir saat sonra başarısız olursa sorun
yaşıyorum

15

Bağımsız bir paket üzerinde Tensorflow c ++ api kullanmayı düşünüyorsanız, kullanabileceğiniz c ++ sürümünü oluşturmak için muhtemelen tensorflow_cc.so'ya (ac api sürümü tensorflow.so da ihtiyacınız olacaktır) ihtiyacınız olacaktır:

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

Not1: İç destek eklemek istiyorsanız, bu bayrakları şu şekilde ekleyebilirsiniz: --copt=-msse4.2 --copt=-mavx

Not2: Projenizde de OpenCV kullanmayı düşünüyorsanız, her iki kütüphaneyi birlikte kullanırken ( tensorflow sorunu ) bir sorun vardır ve kullanmalısınız --config=monolithic.

Kütüphaneyi oluşturduktan sonra projenize eklemeniz gerekir. Bunu yapmak için şu yolları ekleyebilirsiniz:

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

Ve kütüphaneyi projenize bağlayın:

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

Projenizi oluştururken derleyicinize c ++ 11 standartlarını kullanacağınızı da belirtmelisiniz.

Yan Not: tensorflow sürüm 1.5'e göre yollar (Sürümünüzde bir şeyin değişip değişmediğini kontrol etmeniz gerekebilir).

Ayrıca bu bağlantı tüm bu bilgileri bulmamda bana çok yardımcı oldu: link


1
Sürüm 1.11 ile inşa etmek için bu ek dahil yolu gerekli:tensorflow/bazel-tensorflow/external/com_google_absl
Noah_S


8

CMake'i kullanmanın sakıncası yoksa, sizin için TF C ++ API'yi oluşturan ve yükleyebileceğiniz uygun CMake hedefleriyle birlikte tensorflow_cc projesi de vardır . README projesi, kolayca takip edebileceğiniz bir örnek ve Dockerfiles içerir.


8

Tensorflow'u kendiniz oluşturmak istemiyorsanız ve işletim sisteminiz Debian veya Ubuntu ise, önceden oluşturulmuş paketleri Tensorflow C / C ++ kütüphaneleri ile indirebilirsiniz. Bu dağıtım CPU ile C / C ++ çıkarımında kullanılabilir, GPU desteği dahil değildir:

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

Tensorflow'da (TFLearn) bir kontrol noktasının nasıl dondurulacağı ve C / C ++ API'sı ile sonuç çıkarmak için bu modeli nasıl yükleyeceğiniz yazılı talimatlar vardır:

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

Dikkat: Bu Github projesinin geliştiricisiyim.


5

Tüm TF kütüphanesini kendim (her iki zamandan da tasarruf eder (3 dakika içinde kurulur), disk alanı, dev bağımlılıkları yükleme ve sonuçta ortaya çıkan ikili dosya boyutunu oluşturmak zorunda kalmamak için kesmek / geçici bir çözüm kullanıyorum. Resmi olarak desteklenmiyor, ancak hızlı bir şekilde atlamak istiyorsanız iyi çalışıyor.

TF'yi boru ( pip install tensorflowveya pip install tensorflow-gpu) üzerinden takın . Ardından kitaplığını _pywrap_tensorflow.so(TF 0. * - 1.0) veya _pywrap_tensorflow_internal.so(TF 1.1+) bulun. Benim durumumda (Ubuntu) yer almaktadır /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so. Ardından, bu kütüphaneye lib_pywrap_tensorflow.soderleme sisteminizin bulduğu bir yerde (örneğin /usr/lib/local) bir sembolik bağlantı oluşturun . Ön ek libönemlidir! Başka bir lib*.soad da verebilirsiniz - eğer ararsanız libtensorflow.so, TF ile çalışmak için yazılmış diğer programlarla daha iyi uyumluluk elde edebilirsiniz.

Sonra alıştığınız gibi bir C ++ projesi oluşturun (CMake, Make, Bazel, ne isterseniz).

Daha sonra projeleriniz için TF'nin kullanılabilir olması için bu kütüphaneye bağlanmaya hazırsınız (ve ayrıca python2.7kütüphanelere de bağlanmanız gerekiyor)! CMake'de, örneğin sadece ekleyin target_link_libraries(target _pywrap_tensorflow python2.7).

C ++ başlık dosyaları bu kitaplığın etrafında bulunur, örn /usr/local/lib/python2.7/dist-packages/tensorflow/include/.

Bir kez daha: bu yol resmi olarak desteklenmiyor ve çeşitli sorunlarla karşılaşabilirsiniz. Kütüphane, örneğin protobuf'a karşı statik olarak bağlanmış gibi görünüyor, bu nedenle tek bağlantı zamanı veya çalışma zamanı sorunları ile karşılaşabilirsiniz. Ama depolanmış bir grafik yükleyebilir, ağırlıkları geri yükleyebilir ve IMO C ++ 'da en çok aranan işlevsellik olan çıkarım çalıştırın.


Bunu çalıştıramadım. Python şeyler için tanımlanmamış referanslar hakkında bir sürü bağlantı süresi hataları var:undefined reference to 'PyType_IsSubtype'
0xcaff

Oh, işaret ettiğin için teşekkürler ... Ayrıca python2.7kütüphaneye de bağlanmalısın ... Gönderiyi buna göre düzenleyeceğim.
Martin Pecka

@MartinPecka Bunu armv7l (Raspberry PI 2) ile Raspbian Buster'da denedim. Mevcut en son Python 2.7 ve 3.7 tekerlekler 1.14.0 içindir, ancak 2.0.0'ı hedefliyorum. Her neyse, hackini iptal ettim.
Daisuke Aramaki


2

yukarıdaki cevaplar kütüphanenin nasıl oluşturulacağını gösterecek kadar iyidir, ancak başlıkların nasıl toplanacağı hala zordur. burada gerekli başlıkları kopyalamak için kullandığım küçük komut dosyasını paylaşıyorum.

SOURCEtensorflow kaynağı (yapı) direcoty olan ilk param; toplanan üstbilgileri tutan
DSTikinci parametredir include directory. (örneğin, cmake'de 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

1
Bu gerçekten yararlı bir snippet, bir dizin oluşturulurken bir sorun vardı, bu yüzden daha mkdir -p $DST/tensorflow$target_dirönce eklemek zorundacp $line $DST/tensorflow/$target_dir
user969068

@hakunami Bu senaryodan bir özet çıkardım . Ne düşündüğü söyle. Kendi özünü yapmak istiyorsan, benimkini çıkaracağım ve seninkini klonlayacağım.
Daisuke Aramaki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.