Google TensorFlow C ++ एपीआई का निर्माण और उपयोग कैसे करें


168

मैं C ++ में Google की नई Tensorflow लाइब्रेरी का उपयोग शुरू करने के लिए वास्तव में उत्सुक हूं। प्रोजेक्ट के C ++ API को बनाने के तरीके के बारे में वेबसाइट और डॉक्स वास्तव में स्पष्ट नहीं हैं और मुझे नहीं पता कि कहां से शुरू करना है।

क्या टेंसरफ़्लो के C ++ API का उपयोग करने के लिए एक गाइड को खोजने और साझा करने से अधिक अनुभव वाला कोई व्यक्ति मदद कर सकता है?


4
आपके प्रश्न के लिए +1। विंडोज पर स्थापित / संकलित करने का कोई मौका? वेबसाइट केवल लिनक्स / मैक दिखाती है। बाज़ल चलाने के लिए एक गाइड की जरूरत होती है। यह उदाहरण सीखने के लिए एक अच्छा प्रारंभिक बिंदु हो सकता है: github.com/tensorflow/tensorflow/tree/master/tensorflow/…
alrama

इस सवाल का अभी भी जवाब नहीं है। बस सी ++ टेंसरफ़्लो कैसे स्थापित करें सी ++ एपीआई पुस्तकालयों के पास कोई मार्गदर्शक नहीं है, और स्वीकार किए गए उत्तर इस बात पर कोई संकेत नहीं देते हैं कि कैसे, कई प्रदान किए गए लिंक के माध्यम से भी।
इतनोनुक

विंडोज के लिए, मुझे यह प्रश्न और इसका स्वीकृत उत्तर सबसे अधिक उपयोगी लगा। उदाहरण ट्रेनर परियोजना का निर्माण करके, आप पूरे TensorFlow परियोजना को एक स्थिर पुस्तकालय के रूप में बनाते हैं, फिर उससे लिंक करते हैं। आप अपनी खुद की परियोजनाएं बना सकते हैं और उसी तरह TensorFlow लिंक कर सकते हैं।
ओमाताई

जवाबों:


2

Tensorflow C ++ API का उपयोग करने का एक विकल्प मैंने पाया कि cppflow का उपयोग करना है

यह Tensorflow C API के चारों ओर एक हल्का C ++ आवरण है । आपको बहुत छोटे निष्पादन योग्य मिलते हैं और यह libtensorflow.soपहले से संकलित फ़ाइल के खिलाफ लिंक करता है। उपयोग के उदाहरण भी हैं और आप Bazel के बजाय CMAKE का उपयोग करते हैं।


55

आरंभ करने के लिए, आपको यहां दिए गए निर्देशों का पालन करते हुए , आपको Github से स्रोत कोड डाउनलोड करना चाहिए (आपको Bazel और GCC के हाल के संस्करण की आवश्यकता होगी )।

C ++ API (और सिस्टम का बैकएंड) में है tensorflow/core। अभी, केवल C ++ सत्र इंटरफ़ेस , और C API का समर्थन किया जा रहा है। आप TensorFlow रेखांकन को निष्पादित करने के लिए इनमें से किसी का भी उपयोग कर सकते हैं, जिसे Python API का उपयोग करके बनाया गया है और एक GraphDefप्रोटोकॉल बफर में क्रमांकित है । C ++ में ग्राफ़ बनाने के लिए एक प्रायोगिक विशेषता भी है, लेकिन यह वर्तमान में पायथन एपीआई (वर्तमान में ऑटो-भेदभाव के लिए कोई समर्थन नहीं) के रूप में पूरी तरह से चित्रित नहीं है। आप एक उदाहरण कार्यक्रम देख सकते हैं जो यहां C ++ में एक छोटा सा ग्राफ बनाता है

C ++ API का दूसरा भाग एक नया जोड़ने के लिए API है OpKernel, जो कि CPU और GPU के लिए संख्यात्मक गुठली के कार्यान्वयन वाला वर्ग है। इनको कैसे बनाया जाए, इसके कई उदाहरण हैं tensorflow/core/kernels, साथ ही C ++ में एक नया ऑप जोड़ने के लिए एक ट्यूटोरियल भी है


7
सी ++ के लिए कोई स्थापना के निर्देश दिखाया गया है tensorflow.org/install , लेकिन वहाँ से पता चला उदाहरण कार्यक्रम हैं tensorflow.org/api_guides/cc/guide कि स्पष्ट रूप से सी ++ एपीआई का उपयोग कर रहा है। Tensorflow के लिए आपने C ++ को कैसे स्थापित किया?
user3667089

@ user3667089 इंस्टॉलेशन प्रक्रिया का स्थान अब टेनसोरफ्लो
ड्वाइट

6
@ मैंने उस पृष्ठ को पहले देखा था लेकिन मुझे C ++ के बारे में कोई जानकारी नहीं है
user3667089

2
@ user3667089 हेडर, ऊपर की स्थापना प्रक्रिया के बाद, स्थापना प्रक्रिया के दौरान आपके द्वारा चुने गए अजगर वितरण के डिस्ट-पैकेज फ़ोल्डर के भीतर स्थित होगा (जैसे /usr/local/lib/python2.7-dist-packages)। उस फ़ोल्डर में एक फ़ोल्डर टेंसोफ़्लो / शामिल होगा, जिसमें सभी हेडर होंगे। आपको यह सुनिश्चित करने के लिए थोड़ा काम करना होगा कि आप जो भी निर्माण कर रहे हैं, उसमें यह पथ शामिल है। मैं व्यक्तिगत रूप से CMake उपयोग करते हैं, तो के माध्यम से trudging कर रहा हूँ इस
ड्वाइट

4
यह इस तिथि तक का वास्तविक उत्तर नहीं है। यह "आरंभ करने के लिए" के साथ शुरू होता है और फिर एक जगह में कोई प्रासंगिक जानकारी नहीं जोड़ता है कि यहां मार्गदर्शन करने वाले लोग पहले से ही दिखेंगे। यह तब अगला चरण प्रदान करता है, विषय बदलते हुए।
इतनोनुक

28

@ Mrry की पोस्ट में जोड़ने के लिए, मैंने एक ट्यूटोरियल डाला जिसमें बताया गया है कि C ++ API के साथ TensorFlow ग्राफ को कैसे लोड किया जाए। यह बहुत कम है और आपको यह समझने में मदद करनी चाहिए कि सभी टुकड़े एक साथ कैसे फिट होते हैं। यहाँ इसका मांस है:

आवश्यकताएँ:

फ़ोल्डर संरचना:

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

बिल्ड:

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

दो केवेट जिसके लिए शायद वर्कअराउंड हैं:

  • अभी, TensorFlow repo के भीतर चीजों को बनाने की जरूरत है ।
  • संकलित बाइनरी विशाल (103 एमबी) है।

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


1
नमस्ते जिम। क्या यह ट्यूटोरियल अभी भी TF के साथ c ++ प्रोजेक्ट को संकलित करने का सबसे अच्छा / आसान तरीका है? या क्या अब एक आसान तरीका है जैसा कि आप अपनी पोस्ट के अंत में भविष्यवाणी करते हैं?
सैंडर

3
मेरा मानना ​​है कि अब बिल्ट-इन बिल्ड नियम है। मैंने कुछ समय पहले इसके लिए एक पीआर प्रस्तुत किया था। मुझे कैविटीज के बारे में यकीन नहीं है। मैं उम्मीद करूंगा कि सबसे पहले यह बज़ेल का परिणाम रहेगा, न कि टीएफ। दूसरी संभावना में सुधार किया जा सकता है।
जिम

मैंने उस ट्यूटोरियल का अनुसरण किया, लेकिन दौड़ते समय ./loaderमुझे एक त्रुटि मिली Not found: models/train.pb:।
9 वें आयाम

3
क्या अब आपकी परियोजना TensorFlow स्रोत कोड निर्देशिका के बाहर है?
सीनिइज़

हाँ, यह कैसे आप बेदखल कर दिया है।
Xyz

15

यदि आप बाज़ल के साथ अपनी परियोजनाओं के निर्माण और एक बड़े बाइनरी को उत्पन्न करने से बचना चाहते हैं, तो मैंने एक रिपॉजिटरी को सीमेक के साथ TensorFlow C ++ पुस्तकालय के उपयोग का निर्देश देते हुए इकट्ठा किया है। आप इसे यहाँ पा सकते हैं । सामान्य विचार इस प्रकार हैं:

  • TensorFlow भंडार पर क्लोन करें।
  • एक बिल्ड नियम जोड़ें tensorflow/BUILD(उपलब्ध कराए गए सभी C ++ कार्यक्षमता को शामिल नहीं करते हैं)।
  • TensorFlow साझा पुस्तकालय का निर्माण।
  • Eigen और Protobuf के विशिष्ट संस्करण स्थापित करें, या उन्हें बाहरी निर्भरता के रूप में जोड़ें।
  • TensorFlow लाइब्रेरी का उपयोग करने के लिए अपने CMake प्रोजेक्ट को कॉन्फ़िगर करें।

15

सबसे पहले, स्थापित करने के बाद protobufऔर eigen, आप Tensorflow का निर्माण करना चाहेंगे:

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

इसके बाद निम्नलिखित हेडर और डायनेमिक शेयर्ड लाइब्रेरी को शामिल करें /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

मेरा मानना ​​है कि प्रोटोबोफ़ और ईजन को स्थापित करना आवश्यक नहीं है। Bazel कार्यक्षेत्र कॉन्फ़िगरेशन में उन घटकों को डाउनलोड करने और बनाने के नियम शामिल हैं।
ददन

अंत में, टेंसरफ़्लो . org / install / source पर क्रेजी ऑफ़िसियल बिल्ड गाइड, पाइप मॉड्यूल के निर्माण के लिए है, बिल्ड ऑप्शन "टेंसरफ़्लो: libtensorflow_cc.so" के लिए tks, यह टेंसनफ़्लोअ पर भी प्रलेखित नहीं है।
datdinhquoc

@labidi 'bazel build' कमांड से पहले c ++ निर्भरताएँ क्या होनी चाहिए? मैं इस मुद्दे का सामना कर रहा हूं कि निर्माण एक घंटे के बाद विफल हो जाता है, यह बार-बार निर्माण का परीक्षण करने के लिए कठिन है
डेटडाइनक्वोक

15

यदि आप एक स्टैंडअलोन पैकेज पर टेन्सरफ़्लो c ++ एपीआई का उपयोग करने के बारे में सोच रहे हैं, तो आपको उस c ++ संस्करण का निर्माण करने के लिए टेंसोफ़्लो_सीसी. (वहाँ भी एसी एपीआई संस्करण टेंसोरफ़्लो।एसओ की आवश्यकता होगी) का उपयोग कर सकते हैं:

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

नोट 1: यदि आप आंतरिक समर्थन जोड़ना चाहते हैं तो आप इस झंडे को इस प्रकार जोड़ सकते हैं: --copt=-msse4.2 --copt=-mavx

नोट 2: यदि आप अपने प्रोजेक्ट पर 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 मानकों का उपयोग करने जा रहे हैं।

साइड नोट: टेंसरफ़्लो संस्करण 1.5 के सापेक्ष पथ (आपको अपने संस्करण में कुछ भी बदलने की जाँच करने की आवश्यकता हो सकती है)।

इसके अलावा इस लिंक ने मुझे इस सभी infos: लिंक को खोजने में बहुत मदद की


1
मुझे संस्करण 1.11 के साथ निर्माण के लिए इस अतिरिक्त शामिल पथ की आवश्यकता थी:tensorflow/bazel-tensorflow/external/com_google_absl
Noah_S

8

आप इस शेलस्क्रिप्ट का उपयोग निर्भरता, क्लोन, निर्माण, संकलन और सभी आवश्यक फाइलों को ../src/includesफ़ोल्डर में स्थापित करने के लिए कर सकते हैं (अधिकांश)

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


8

यदि आप CMake का उपयोग करने में कोई आपत्ति नहीं करते हैं, तो आप के लिए TF C ++ API को बनाने और स्थापित करने वाले टेंसरफ़्लो_cc प्रोजेक्ट भी है , साथ ही सुविधाजनक CMake टारगेट के साथ जिन्हें आप लिंक कर सकते हैं। README के ​​प्रोजेक्ट में एक उदाहरण और डॉकफाइल्स शामिल हैं जिनका आप आसानी से अनुसरण कर सकते हैं।


8

यदि आप स्वयं Tensorflow का निर्माण नहीं करना चाहते हैं और आपका ऑपरेटिंग सिस्टम डेबियन या Ubuntu है, तो आप Tensorflow C / C ++ पुस्तकालयों के साथ प्रीबिल्ट पैकेज डाउनलोड कर सकते हैं। इस वितरण को सीपीयू के साथ C / C ++ के लिए इस्तेमाल किया जा सकता है, 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

खबरदार: मैं इस गितुब परियोजना का डेवलपर हूं।


5

मैं पूरे TF लाइब्रेरी के निर्माण से बचने के लिए हैक / वर्कअराउंड का उपयोग करता हूं (जो दोनों समय बचाता है (यह 3 मिनट में सेट होता है), डिस्क स्थान, देव निर्भरता स्थापित करने और परिणामी बाइनरी का आकार)। यह आधिकारिक तौर पर असमर्थित है, लेकिन अच्छी तरह से काम करता है अगर आप जल्दी से अंदर कूदना चाहते हैं।

टीएफ को पाइप ( pip install tensorflowया pip install tensorflow-gpu) के माध्यम से स्थापित करें । फिर इसकी लाइब्रेरी _pywrap_tensorflow.so(TF 0. * - 1.0) या _pywrap_tensorflow_internal.so(TF 1.1+) खोजें। मेरे मामले में (उबंटू) यह स्थित है /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so। फिर इस लाइब्रेरी में एक सिमिलिंक बनाएं, जिसे lib_pywrap_tensorflow.soकहीं न कहीं कहा जाता है, जहां आपका बिल्ड सिस्टम इसे ढूंढता है (जैसे /usr/lib/local)। उपसर्ग libमहत्वपूर्ण है! आप इसे दूसरा lib*.soनाम भी दे सकते हैं - यदि आप इसे कॉल करते हैं libtensorflow.so, तो आपको TF के साथ काम करने के लिए लिखे गए अन्य कार्यक्रमों के साथ बेहतर संगतता मिल सकती है।

फिर एक 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/

एक बार फिर: यह तरीका आधिकारिक रूप से असमर्थित है और आप विभिन्न मुद्दों में भाग सकते हैं। लाइब्रेरी को उदाहरण के तौर पर प्रोटोबॉफ़ के खिलाफ सांख्यिकीय रूप से जोड़ा गया लगता है, इसलिए आप विषम लिंक-टाइम या रन-टाइम समस्याओं में चल सकते हैं। लेकिन मैं एक संग्रहीत ग्राफ को लोड करने, भार को बहाल करने और अनुमान लगाने में सक्षम हूं, जो IMO है जो C ++ में सबसे अधिक वांछित कार्यक्षमता है।


मुझे यह काम नहीं मिला। मुझे अजगर सामान के लिए अपरिभाषित संदर्भों के बारे में लिंक टाइम त्रुटियों का एक गुच्छा मिला:undefined reference to 'PyType_IsSubtype'
0xcaff

ओह, इसे इंगित करने के लिए धन्यवाद ... आपको python2.7लाइब्रेरी के खिलाफ भी लिंक करना होगा ... मैं तदनुसार पोस्ट संपादित करूंगा।
मार्टिन पेका

@MartinPecka मैंने आर्मप्ल 7 (रास्पबेरी पीआई 2) के साथ रास्पियन बस्टर पर यह कोशिश की। नवीनतम पायथन 2.7 और 3.7 उपलब्ध व्हील 1.14.0 के लिए हैं, लेकिन मैं 2.0.0 को लक्षित कर रहा हूं। वैसे भी धन्यवाद, मैंने आपके हैक को बढ़ा दिया।
डाइसुके अरामकी


2

ऊपर दिए गए उत्तर यह दिखाने के लिए पर्याप्त हैं कि पुस्तकालय कैसे बनाया जाए, लेकिन हेडर कैसे एकत्रित किया जाए यह अभी भी मुश्किल है। यहाँ मैं आवश्यक स्क्रिप्ट को कॉपी करने के लिए उपयोग की जाने वाली छोटी स्क्रिप्ट साझा करता हूं।

SOURCEपहला परम है, जो टेंसरफ़्लो स्रोत (बिल्ड) डाइरेकोटी है;
DSTदूसरा परम है, जो include directoryएकत्रित शीर्षकों को धारण करता है। (जैसे। 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

1
यह वास्तव में सहायक स्निपेट था, निर्देशिका बनाते समय एक समस्या थी, इसलिए मुझे mkdir -p $DST/tensorflow$target_dirइससे पहले जोड़ना पड़ाcp $line $DST/tensorflow/$target_dir
user969068

@ ठाकुनामि मैंने इस लिपि से बाहर निकलने का इशारा किया । आप क्या सोचते हैं मुझे बताओ। यदि आप अपना खुद का लिंग बनाना चाहते हैं, तो मैं आपको हटा दूंगा और आपका क्लोन बनाऊंगा।
डाइसुके अरामकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.