iOS के लिए TensorFlow Lite बनाएं

इस दस्तावेज़ में, TensorFlow Lite की iOS लाइब्रेरी को खुद से बनाने का तरीका बताया गया है. आम तौर पर, आपको स्थानीय तौर पर TensorFlow Lite iOS लाइब्रेरी बनाने की ज़रूरत नहीं होती. अगर आपको सिर्फ़ इसका इस्तेमाल करना है, तो इसका सबसे आसान तरीका है, पहले से बने स्टेबल या हर रात रिलीज़ होने वाले TensorFlow Lite CocoaPods का. अपने iOS प्रोजेक्ट में इनका इस्तेमाल करने के तरीके के बारे में ज़्यादा जानकारी के लिए, iOS का क्विकस्टार्ट देखें.

स्थानीय रूप से बनाया जा रहा है

कुछ मामलों में, हो सकता है कि आप TensorFlow Lite के लोकल बिल्ड का इस्तेमाल करना चाहें. उदाहरण के लिए, जब आपको TensorFlow Lite में स्थानीय बदलाव करने हों और अपने iOS ऐप्लिकेशन में उन बदलावों की जांच करनी हो या आप हमारे दिए गए डाइनैमिक फ़्रेमवर्क के लिए स्टैटिक फ़्रेमवर्क का इस्तेमाल करना चाहें. TensorFlow Lite के लिए स्थानीय तौर पर यूनिवर्सल iOS फ़्रेमवर्क बनाने के लिए, आपको macOS मशीन पर Bazel का इस्तेमाल करके, इसे बनाना होगा.

Xcode इंस्टॉल करें

अगर आपने अब तक ऐसा नहीं किया है, तो आपको xcode-select का इस्तेमाल करके, Xcode 8 या उसके बाद के वर्शन और टूल इंस्टॉल करने होंगे:

xcode-select --install

अगर यह नया इंस्टॉल है, तो आपको सभी उपयोगकर्ताओं के लिए, लाइसेंस देने के लिए इस कानूनी समझौते को स्वीकार करना होगा. इसके लिए, ये निर्देश दें:

sudo xcodebuild -license accept

Bazel इंस्टॉल करें

Bazel, TensorFlow का मुख्य बिल्ड सिस्टम है. Bazel की वेबसाइट पर दिए गए निर्देशों के हिसाब से, Bazel इंस्टॉल करें. पक्का करें कि tensorflow डेटा स्टोर करने की जगह के रूट में configure.py फ़ाइल में _TF_MIN_BAZEL_VERSION और _TF_MAX_BAZEL_VERSION के बीच का कोई वर्शन चुना गया हो.

Workspace और .bazelrc को कॉन्फ़िगर करें

TensorFlow की रूट चेकआउट डायरेक्ट्री में ./configure स्क्रिप्ट चलाएं. जब स्क्रिप्ट से पूछा जाए कि क्या iOS के साथ TensorFlow बनाना है, तो "हां" में जवाब दें.

Bazel को iOS पर काम करने के साथ सही तरीके से कॉन्फ़िगर करने के बाद, नीचे दिए गए निर्देश की मदद से TensorFlowLiteC फ़्रेमवर्क बनाया जा सकता है.

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_framework

यह निर्देश, TensorFlowLiteC_framework.zip फ़ाइल को bazel-bin/tensorflow/lite/ios/ डायरेक्ट्री में आपकी TensorFlow रूट डायरेक्ट्री में जनरेट करेगा. डिफ़ॉल्ट रूप से, जनरेट किए गए फ़्रेमवर्क में "fat" बाइनरी होती है, जिसमें armv7, arm64, और x86_64 शामिल होते हैं, लेकिन i386 नहीं. --config=ios_fat की जानकारी देते समय इस्तेमाल किए गए बिल्ड फ़्लैग की पूरी सूची देखने के लिए, कृपया .bazelrc फ़ाइल में iOS कॉन्फ़िगरेशन सेक्शन देखें.

TensorFlowLiteC का स्टैटिक फ़्रेमवर्क बनाएं

डिफ़ॉल्ट रूप से, हम सिर्फ़ Cocoapods के ज़रिए डाइनैमिक फ़्रेमवर्क को डिस्ट्रिब्यूट करते हैं. इसके बजाय, अगर आपको स्टैटिक फ़्रेमवर्क का इस्तेमाल करना है, तो इस निर्देश की मदद से TensorFlowLiteC स्टैटिक फ़्रेमवर्क बनाया जा सकता है:

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework

यह निर्देश, आपकी TensorFlow की रूट डायरेक्ट्री में, bazel-bin/tensorflow/lite/ios/ डायरेक्ट्री में TensorFlowLiteC_static_framework.zip नाम की फ़ाइल जनरेट करेगा. इस स्टैटिक फ़्रेमवर्क का इस्तेमाल ठीक उसी तरह किया जाता है जिस तरह डाइनैमिक फ़्रेमवर्क के लिए किया जाता है.

TFLite फ़्रेमवर्क को चुनिंदा तरीके से बनाएं

आपके पास ऐसे छोटे फ़्रेमवर्क बनाने का विकल्प होता है जो चुनिंदा बिल्ड का इस्तेमाल करके, सिर्फ़ मॉडल के सेट को टारगेट करते हैं. इससे आपके मॉडल सेट में, इस्तेमाल नहीं की जाने वाली कार्रवाइयों को छोड़कर, सिर्फ़ उन ऑपरेशन को शामिल किया जा सकेगा जो मॉडल के दिए गए सेट को चलाने के लिए ज़रूरी हैं. निर्देश इस तरह है:

bash tensorflow/lite/ios/build_frameworks.sh \
  --input_models=model1.tflite,model2.tflite \
  --target_archs=x86_64,armv7,arm64

ऊपर दिया गया निर्देश, TensorFlow के बिल्ट-इन और कस्टम ऑपरेशन के लिए bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip स्टैटिक फ़्रेमवर्क जनरेट करेगा. अगर आपके मॉडल में Select TensorFlow ऑपरेशन है, तो स्टैटिक फ़्रेमवर्क जनरेट किया जा सकता है bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip. ध्यान दें कि --target_archs फ़्लैग का इस्तेमाल, डिप्लॉयमेंट आर्किटेक्चर तय करने के लिए किया जा सकता है.

अपने ऐप्लिकेशन में इस्तेमाल करें

कोकोआपॉड डेवलपर

TensorFlow Lite के लिए तीन CocoaPods हैं:

  • TensorFlowLiteSwift: यह TensorFlow Lite के लिए Swift API की सुविधा देता है.
  • TensorFlowLiteObjC: यह TensorFlow Lite के लिए Objective-C API उपलब्ध कराता है.
  • TensorFlowLiteC: कॉमन बेस पॉड, जो TensorFlow Lite के कोर रनटाइम को एम्बेड करता है और ऊपर दिए गए दो पॉड में इस्तेमाल किए गए बेस सी एपीआई को दिखाता है. उपयोगकर्ताओं को सीधे तौर पर इस्तेमाल नहीं करना चाहिए.

डेवलपर के तौर पर, आपको उस भाषा के मुताबिक TensorFlowLiteSwift या TensorFlowLiteObjC पॉड में से किसी एक को चुनना चाहिए जिसमें आपका ऐप्लिकेशन लिखा गया है. TensorFlow Lite के लोकल बिल्ड इस्तेमाल करने के सटीक चरण अलग-अलग होते हैं. यह इस बात पर निर्भर करता है कि आपको कौनसा हिस्सा बनाना है.

लोकल Swift या Objective-C एपीआई इस्तेमाल करना

अगर CocoaPods का इस्तेमाल किया जा रहा है और आपको TensorFlow Lite के Swift API या Objective-C एपीआई में सिर्फ़ कुछ स्थानीय बदलावों को टेस्ट करना है, तो यहां दिया गया तरीका अपनाएं.

  1. tensorflow के चेकआउट पेज पर, Swift या Objective-C एपीआई में बदलाव करें.

  2. TensorFlowLite(Swift|ObjC).podspec फ़ाइल खोलें और इस लाइन को अपडेट करें:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    इसे:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    इससे पक्का किया जाएगा कि आप स्टेबल वर्शन के बजाय TensorFlowLiteC एपीआई के हर रात उपलब्ध होने वाले सबसे नए वर्शन (हर रात 1 से 4 बजे पैसिफ़िक समय के बीच बनाए जाने वाले) से स्विफ़्ट या ऑब्जेक्टिव-सी एपीआई बना रहे हैं. यह आपके स्थानीय tensorflow चेकआउट से पुराना हो सकता है. इसके अलावा, आपके पास TensorFlowLiteC का अपना वर्शन पब्लिश करने और उस वर्शन का इस्तेमाल करने का विकल्प है. इसके लिए, नीचे स्थानीय TensorFlow Lite Core का इस्तेमाल करना सेक्शन देखें.

  3. अपने iOS प्रोजेक्ट के Podfile में, अपनी tensorflow रूट डायरेक्ट्री के लोकल पाथ पर ले जाने के लिए, डिपेंडेंसी इस तरह बदलें.
    Swift के लिए:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    मकसद-C के लिए:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. अपने iOS प्रोजेक्ट की रूट डायरेक्ट्री से, पॉड इंस्टॉलेशन को अपडेट करें.
    $ pod update

  5. जनरेट किए गए फ़ाइल फ़ोल्डर (<project>.xcworkspace) को फिर से खोलें और Xcode में अपना ऐप्लिकेशन फिर से बनाएं.

स्थानीय TensorFlow Lite कोर का इस्तेमाल करना

आपके पास CocoaPods का निजी डेटा स्टोर करने की जगह सेट अप करने का विकल्प होता है. साथ ही, कस्टम TensorFlowLiteC फ़्रेमवर्क को अपने निजी डेटा स्टोर करने की जगह में पब्लिश किया जा सकता है. इस podspec फ़ाइल को कॉपी किया जा सकता है और कुछ वैल्यू में बदलाव किया जा सकता है:

  ...
  s.version      = <your_desired_version_tag>
  ...
  # Note the `///`, two from the `file://` and one from the `/path`.
  s.source       = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
  ...
  s.vendored_frameworks = 'TensorFlowLiteC.framework'
  ...

अपनी TensorFlowLiteC.podspec फ़ाइल बनाने के बाद, निजी CocoaPods का इस्तेमाल करने के निर्देशों का पालन करके इसे अपने प्रोजेक्ट में इस्तेमाल किया जा सकता है. आपके पास TensorFlowLite(Swift|ObjC).podspec में बदलाव करके उसे कस्टम TensorFlowLiteC पॉड की ओर पॉइंट करने का भी विकल्प है. साथ ही, अपने ऐप्लिकेशन प्रोजेक्ट में Swift या Objective-C पॉड का इस्तेमाल भी किया जा सकता है.

Bazel डेवलपर

अगर Bazel का इस्तेमाल मुख्य बिल्ड टूल के तौर पर किया जा रहा है, तो आपको अपनी BUILD फ़ाइल में, टारगेट पर TensorFlowLite डिपेंडेंसी जोड़ना होगा.

Swift के लिए:

swift_library(
  deps = [
      "//tensorflow/lite/swift:TensorFlowLite",
  ],
)

ऑब्जेक्टिव-सी के लिए:

objc_library(
  deps = [
      "//tensorflow/lite/objc:TensorFlowLite",
  ],
)

अपना ऐप्लिकेशन प्रोजेक्ट बनाते समय, TensorFlow Lite लाइब्रेरी में किया जाने वाला कोई भी बदलाव, आपके ऐप्लिकेशन में लागू कर दिया जाएगा.

सीधे Xcode प्रोजेक्ट की सेटिंग बदलना

हमारा सुझाव है कि अपने प्रोजेक्ट में TensorFlow Lite की डिपेंडेंसी जोड़ने के लिए, CocoaPods या Bazel का इस्तेमाल करें. अगर आपको अब भी TensorFlowLiteC फ़्रेमवर्क को मैन्युअल तरीके से जोड़ना है, तो आपको अपने ऐप्लिकेशन प्रोजेक्ट में, एम्बेड किए गए फ़्रेमवर्क के तौर पर TensorFlowLiteC फ़्रेमवर्क को जोड़ना होगा. TensorFlowLiteC.framework डायरेक्ट्री पाने के लिए, ऊपर दिए गए बिल्ड से जनरेट किए गए TensorFlowLiteC_framework.zip को अनज़िप करें. यह डायरेक्ट्री, असल फ़्रेमवर्क है जिसे Xcode समझ सकता है.

TensorFlowLiteC.framework तैयार कर लेने के बाद, सबसे पहले आपको इसे अपने ऐप्लिकेशन टारगेट में एम्बेड की गई बाइनरी के रूप में जोड़ना होगा. इसके लिए सटीक प्रोजेक्ट सेटिंग सेक्शन आपके Xcode वर्शन के आधार पर अलग-अलग हो सकता है.

  • Xcode 11: अपने ऐप्लिकेशन टारगेट के प्रोजेक्ट एडिटर के 'सामान्य' टैब में जाएं और 'फ़्रेमवर्क, लाइब्रेरी, और एम्बेड किए गए कॉन्टेंट' सेक्शन में TensorFlowLiteC.framework जोड़ें.
  • Xcode 10 और इससे पहले के वर्शन: अपने ऐप्लिकेशन टारगेट के लिए प्रोजेक्ट एडिटर के 'सामान्य' टैब पर जाएं और 'एम्बेड किए गए बाइनरी' में TensorFlowLiteC.framework जोड़ें. यह फ़्रेमवर्क 'लिंक किए गए फ़्रेमवर्क और लाइब्रेरी' सेक्शन में भी अपने-आप जुड़ जाना चाहिए.

जब फ़्रेमवर्क को एम्बेड की गई बाइनरी के तौर पर जोड़ा जाता है, तब Xcode आपके फ़्रेमवर्क की पैरंट डायरेक्ट्री को शामिल करने के लिए, 'बिल्ड सेटिंग' टैब में 'फ़्रेमवर्क सर्च पाथ' एंट्री को भी अपडेट करता है. अगर ऐसा अपने-आप नहीं होता है, तो आपको मैन्युअल तरीके से TensorFlowLiteC.framework डायरेक्ट्री की पैरंट डायरेक्ट्री जोड़नी चाहिए.

ये दो सेटिंग पूरी होने के बाद, TensorFlowLiteC.framework/Headers डायरेक्ट्री में हेडर फ़ाइलों से तय किए गए TensorFlow Lite के C API को इंपोर्ट और कॉल किया जा सकता है.