LiteRT के लिए, जीपीयू डेलिगेट

मशीन लर्निंग (एमएल) मॉडल को चलाने के लिए, ग्राफ़िक प्रोसेसिंग यूनिट (जीपीयू) का इस्तेमाल करना आपके मॉडल की परफ़ॉर्मेंस और उपयोगकर्ता अनुभव को बेहतर बना सकता है मशीन लर्निंग का इस्तेमाल करने की सुविधा वाले ऐप्लिकेशन की सूची में शामिल करता है. LiteRT की मदद से, जीपीयू का इस्तेमाल किया जा सकता है और अन्य विशेष प्रोसेसर को हार्डवेयर ड्राइवर के माध्यम से कहा जाता है ऐक्सेस देना. अपने LiteRT ML के साथ जीपीयू के इस्तेमाल की सुविधा चालू करना ऐप्लिकेशन से ये फ़ायदे मिल सकते हैं:

  • स्पीड - जीपीयू कई अन्य चीज़ों के साथ काम करने के लिए बनाए जाते हैं वर्कलोड. यह डिज़ाइन उन्हें डीप न्यूरल नेट के लिए ज़्यादा कारगर बनाता है. इसमें बहुत सारे ऑपरेटर होते हैं, जो इनपुट टेंसर पर काम करते हैं साथ-साथ प्रोसेस की जा सकती है, जिसकी वजह से इंतज़ार का समय कम हो जाता है. तय सीमा में सबसे सही तरीका यह है कि जीपीयू पर मॉडल को तेज़ी से चलाया जा सके. जो पहले संभव नहीं थे.
  • ऊर्जा की बचत - जीपीयू बहुत ही कम तरीके से एमएल कंप्यूटेशन की सेवा देते हैं इससे आम तौर पर, कम बिजली की खपत होती है और बिजली पैदा होती है. सीपीयू पर चल रहे टास्क से ज़्यादा गर्म हो जाता है.

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

जीपीयू एमएल ऑपरेशंस से जुड़ी सहायता

TensorFlow के ML ऑपरेशन या ops की कुछ सीमाएं हो सकती हैं LiteRT जीपीयू डेलिगेट की मदद से, तेज़ी से कार्रवाई की गई. प्रतिनिधि 16-बिट और 32-बिट फ़्लोट सटीक में निम्न ops:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • LOGICAL_AND
  • LOGISTIC
  • LSTM v2 (Basic LSTM only)
  • MAX_POOL_2D
  • MAXIMUM
  • MINIMUM
  • MUL
  • PAD
  • PRELU
  • RELU
  • RELU6
  • RESHAPE
  • RESIZE_BILINEAR v1-3
  • SOFTMAX
  • STRIDED_SLICE
  • SUB
  • TRANSPOSE_CONV

डिफ़ॉल्ट रूप से, सभी ऑपरेशन सिर्फ़ वर्शन 1 पर काम करते हैं. क्वांटाइज़ेशन की सुविधा इस्तेमाल करना support पर जाकर सही वर्शन का इस्तेमाल किया जा सकता है. उदाहरण के लिए, ADD वर्शन 2.

जीपीयू से जुड़ी सहायता से जुड़ी समस्याएं हल करना

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

WARNING: op code #42 cannot be handled by this delegate.

इस तरह की गड़बड़ी के लिए कोई कॉलबैक नहीं होता, क्योंकि यह असल में नहीं होता रनटाइम में गड़बड़ी हुई. जीपीयू डेलिगेट के साथ अपने मॉडल के एक्ज़ीक्यूशन की जांच करते समय, आपको इन चेतावनियों के बारे में सावधान रहना चाहिए. इन चेतावनियों की संख्या ज़्यादा होने पर यह बताएं कि आपका मॉडल, जीपीयू से तेज़ी लाने के लिए इस्तेमाल के लिए सही नहीं है और मॉडल की रीफ़ैक्टरिंग की ज़रूरत पड़ सकती है.

मॉडल के उदाहरण

नीचे दिए गए मॉडल, जीपीयू से तेज़ी से जुड़ने में मदद करने के लिए बनाए गए हैं LiteRT और इन्हें रेफ़रंस और टेस्टिंग के लिए उपलब्ध कराया जाता है:

जीपीयू के लिए ऑप्टिमाइज़ करना

मॉडल रन करते समय बेहतर परफ़ॉर्मेंस पाने के लिए, नीचे दी गई तकनीकों का इस्तेमाल किया जा सकता है LiteRT जीपीयू डेलिगेट का इस्तेमाल करने वाले जीपीयू हार्डवेयर पर:

  • कार्रवाइयां बदलने की सुविधा - सीपीयू पर तेज़ी से काम करने वाली कुछ कार्रवाइयों में ज़्यादा कीमत चुकानी होती है. आकार बदलने की कार्रवाइयां खास तौर पर चलाना महंगा है. इसमें BATCH_TO_SPACE, SPACE_TO_BATCH, SPACE_TO_DEPTH वगैरह. आपको आकार बदलने के इस्तेमाल की बारीकी से जांच करनी चाहिए और यह मान लिया है कि शायद उनका इस्तेमाल सिर्फ़ डेटा का पता लगाने के लिए किया गया है या आपके मॉडल की शुरुआती ज़रूरतों के लिए. उन्हें हटाने से काफ़ी हद तक परफ़ॉर्मेंस बेहतर बनाने के लिए किया जा सकता है.

  • इमेज डेटा चैनल - जीपीयू पर, टेंसर डेटा को चार चैनलों में बांटा जाता है और इस तरह से [B,H,W,5] आकार वाले टेंसर पर की गई गणना आकार [B,H,W,8] के टेंसर पर समान, लेकिन इससे काफ़ी खराब [B,H,W,4]. अगर आपका इस्तेमाल किया जा रहा कैमरा हार्डवेयर आरजीबीए के तहत, चार चैनलों वाले इनपुट को फ़ीड करने की प्रोसेस काफ़ी तेज़ है, क्योंकि इससे यह काम नहीं करता 3-चैनल RGB से 4-चैनल RGBX में मेमोरी कॉपी.

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

जीपीयू के लिए बेहतर सहायता

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

क्वांटाइज़्ड मॉडल का इस्तेमाल करना

इस सेक्शन में बताया गया है कि जीपीयू डेलिगेट किस तरह 8-बिट वाले क्वांटाइज़्ड मॉडल की स्पीड को बढ़ाता है, इसमें ये शामिल हैं:

परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, ऐसे मॉडल का इस्तेमाल करें जिनमें फ़्लोटिंग-पॉइंट इनपुट और आउटपुट टेंसर.

यह कैसे काम करता है?

जीपीयू बैकएंड सिर्फ़ फ़्लोटिंग-पॉइंट एक्ज़ीक्यूशन के साथ काम करता है, इसलिए हम क्वांटाइज़्ड रन करते हैं मॉडल को ओरिजनल मॉडल का 'फ़्लोटिंग-पॉइंट व्यू' देकर मॉडल के लिए इस्तेमाल किया जा सकता है. एटी हाई-लेवल पर साइन इन करते समय, इन चरणों को पूरा करना होगा:

  • कॉन्सटेंट टेंसर (जैसे कि वज़न/बायस) की मात्रा को, जीपीयू मेमोरी. यह कार्रवाई तब होती है, जब LiteRT.

  • जीपीयू प्रोग्राम के लिए, इनपुट और आउटपुट, अगर 8-बिट की मात्रा वाले होते हैं, तो ये हर अनुमान के लिए, डेटा को कम या ज़्यादा किया जाता है. यह कार्रवाई सीपीयू पर, LiteRT के ऑप्टिमाइज़ किए गए कर्नेल का इस्तेमाल करके काम करता है.

  • क्वांटाइज़ेशन सिम्युलेटर को अलग-अलग कार्रवाइयों के बीच में, क्वांटाइज़ किए गए क्वांटाइज़ करने के लिए डाला जाता है व्यवहार. यह तरीका उन मॉडल के लिए ज़रूरी है जहां ऑपरेशन के चालू होने की उम्मीद होती है आकलन के दौरान सीखी गई सीमाओं का पालन करें.

जीपीयू डेलिगेट की मदद से, इस सुविधा को चालू करने के बारे में जानकारी पाने के लिए, फ़ॉलो किया जा रहा है:

क्रम से लगाने की सुविधा की मदद से, शुरू करने में लगने वाले समय को कम करना

जीपीयू डेलिगेट की सुविधा से, पहले से कंपाइल किए गए कर्नेल कोड से लोड करने और मॉडल डेटा को क्रम से लगाया गया है और पिछले डेटा को डिस्क में सेव किया गया है. इस तरीके से, फिर से कंपाइल करता है और स्टार्टअप समय को 90% तक कम कर सकता है. इस सुधार का असर समय बचाने के लिए डिस्क के स्टोरेज का इस्तेमाल करके हासिल किया जाता है. इस सुविधा को चालू किया जा सकता है कुछ कॉन्फ़िगरेशन विकल्पों के साथ, जैसा कि नीचे दिए गए कोड उदाहरणों में दिखाया गया है:

C++

    TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
    options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION;
    options.serialization_dir = kTmpDir;
    options.model_token = kModelToken;

    auto* delegate = TfLiteGpuDelegateV2Create(options);
    if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Java

    GpuDelegate delegate = new GpuDelegate(
      new GpuDelegate.Options().setSerializationParams(
        /* serializationDir= */ serializationDir,
        /* modelToken= */ modelToken));

    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

क्रम से लगाने की सुविधा का इस्तेमाल करते समय, पक्का करें कि आपका कोड इनका पालन करता हो लागू करने के नियम:

  • क्रम से लगाए जाने वाले डेटा को ऐसी डायरेक्ट्री में सेव करें जो अन्य लोग ऐक्सेस न कर पाएं दिखाई देता है. Android डिवाइसों पर, इसका इस्तेमाल करें getCodeCacheDir() जो ऐसी जगह के बारे में बताता है जो मौजूदा ऐप्लिकेशन के लिए निजी है.
  • किसी मॉडल के लिए, डिवाइस का मॉडल टोकन यूनीक होना चाहिए. आप मॉडल डेटा से फ़िंगरप्रिंट जनरेट करके, मॉडल टोकन जनरेट करें. इसके लिए, लाइब्रेरी जैसे कि farmhash::Fingerprint64.