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

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

स्थानीय स्तर पर निर्माण

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

एक्सकोड स्थापित करें

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

xcode-select --install

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

sudo xcodebuild -license accept

बेज़ेल स्थापित करें

बेज़ल TensorFlow के लिए प्राथमिक निर्माण प्रणाली है। बेज़ेल वेबसाइट पर दिए गए निर्देशों के अनुसार बेज़ेल स्थापित करें। tensorflow रिपॉजिटरी के मूल में configure.py फ़ाइल में _TF_MIN_BAZEL_VERSION और _TF_MAX_BAZEL_VERSION के बीच एक संस्करण चुनना सुनिश्चित करें।

वर्कस्पेस और .bazenrc कॉन्फ़िगर करें

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

एक बार जब बेज़ल iOS समर्थन के साथ ठीक से कॉन्फ़िगर हो जाता है, तो आप निम्न कमांड के साथ TensorFlowLiteC फ्रेमवर्क का निर्माण कर सकते हैं।

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

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

TensorFlowLiteC स्थिर ढाँचा बनाएँ

डिफ़ॉल्ट रूप से, हम केवल कोकोपोड्स के माध्यम से गतिशील ढांचे को वितरित करते हैं। यदि आप इसके बजाय स्थिर ढांचे का उपयोग करना चाहते हैं, तो आप निम्न आदेश के साथ 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 Lite बिल्ट-इन और कस्टम ऑप्स के लिए स्टैटिक फ्रेमवर्क bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip उत्पन्न करेगा; और वैकल्पिक रूप से, यदि आपके मॉडल में सेलेक्ट टेन्सरफ्लो ऑप्स शामिल हैं, तो स्टैटिक फ्रेमवर्क bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip उत्पन्न करता है। ध्यान दें कि --target_archs ध्वज का उपयोग आपके परिनियोजन आर्किटेक्चर को निर्दिष्ट करने के लिए किया जा सकता है।

अपने स्वयं के अनुप्रयोग में उपयोग करें

कोकोपोड्स डेवलपर्स

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

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

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

स्थानीय स्विफ्ट या ऑब्जेक्टिव-सी एपीआई का उपयोग करना

यदि आप CocoaPods का उपयोग कर रहे हैं, और केवल TensorFlow Lite के स्विफ्ट एपीआई या ऑब्जेक्टिव-सी एपीआई में कुछ स्थानीय परिवर्तनों का परीक्षण करना चाहते हैं, तो यहां दिए गए चरणों का पालन करें।

  1. अपने tensorflow चेकआउट में स्विफ्ट या ऑब्जेक्टिव-सी एपीआई में बदलाव करें।

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

  3. अपने iOS प्रोजेक्ट के Podfile में, अपने tensorflow रूट निर्देशिका के स्थानीय पथ को इंगित करने के लिए निर्भरता को निम्नानुसार बदलें।
    स्विफ्ट के लिए:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    उद्देश्य-सी के लिए:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

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

  5. जेनरेट किए गए वर्कस्पेस ( <project>.xcworkspace ) को दोबारा खोलें और Xcode के भीतर अपने ऐप को दोबारा बनाएं।

स्थानीय TensorFlow Lite कोर का उपयोग करना

आप एक निजी CocoaPods स्पेक्स रिपॉजिटरी स्थापित कर सकते हैं, और अपने कस्टम TensorFlowLiteC फ्रेमवर्क को अपने निजी रेपो में प्रकाशित कर सकते हैं। आप इस पॉडस्पेक फ़ाइल को कॉपी कर सकते हैं और कुछ मान संशोधित कर सकते हैं:

  ...
  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 का उपयोग करने के निर्देशों का पालन कर सकते हैं। आप अपने कस्टम TensorFlowLiteC पॉड को इंगित करने के लिए TensorFlowLite(Swift|ObjC).podspec भी संशोधित कर सकते हैं और अपने ऐप प्रोजेक्ट में स्विफ्ट या ऑब्जेक्टिव-सी पॉड का उपयोग कर सकते हैं।

बेज़ेल डेवलपर्स

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

स्विफ्ट के लिए:

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

उद्देश्य-सी के लिए:

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

जब आप अपना ऐप प्रोजेक्ट बनाते हैं, तो TensorFlow Lite लाइब्रेरी में कोई भी बदलाव उठाया जाएगा और आपके ऐप में बनाया जाएगा।

Xcode प्रोजेक्ट सेटिंग्स को सीधे संशोधित करें

अपने प्रोजेक्ट में TensorFlow Lite निर्भरता जोड़ने के लिए कोकोपोड्स या बेज़ेल का उपयोग करने की अत्यधिक अनुशंसा की जाती है। यदि आप अभी भी 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 को आयात और कॉल करने में सक्षम होना चाहिए।