TensorFlow Lite के लिए GPU प्रतिनिधि

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

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

यह दस्तावेज़ TensorFlow Lite में GPU समर्थन का अवलोकन और GPU प्रोसेसर के लिए कुछ उन्नत उपयोग प्रदान करता है। विशिष्ट प्लेटफ़ॉर्म पर GPU समर्थन लागू करने के बारे में अधिक विशिष्ट जानकारी के लिए, निम्नलिखित मार्गदर्शिकाएँ देखें:

जीपीयू एमएल संचालन समर्थन

TensorFlow ML संचालन, या ऑप्स , को TensorFlow Lite GPU प्रतिनिधि द्वारा त्वरित किया जा सकता है, इसकी कुछ सीमाएँ हैं। प्रतिनिधि 16-बिट और 32-बिट फ्लोट परिशुद्धता में निम्नलिखित ऑप्स का समर्थन करता है:

  • 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 पर समर्थित हैं । परिमाणीकरण समर्थन को सक्षम करने से उपयुक्त संस्करण सक्षम हो जाते हैं, उदाहरण के लिए, ADD v2।

GPU समर्थन का समस्या निवारण

यदि कुछ ऑप्स GPU प्रतिनिधि द्वारा समर्थित नहीं हैं, तो फ्रेमवर्क ग्राफ़ का केवल एक भाग GPU पर और शेष भाग CPU पर चलाएगा। सीपीयू/जीपीयू सिंक्रोनाइज़ेशन की उच्च लागत के कारण, इस तरह के स्प्लिट निष्पादन मोड का परिणाम अक्सर उस समय की तुलना में धीमा होता है जब पूरा नेटवर्क अकेले सीपीयू पर चलता है। इस मामले में, एप्लिकेशन चेतावनी उत्पन्न करता है, जैसे:

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

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

उदाहरण मॉडल

निम्नलिखित उदाहरण मॉडल TensorFlow Lite के साथ GPU त्वरण का लाभ उठाने के लिए बनाए गए हैं और संदर्भ और परीक्षण के लिए प्रदान किए गए हैं:

GPU के लिए अनुकूलन

TensorFlow Lite GPU प्रतिनिधि का उपयोग करके GPU हार्डवेयर पर मॉडल चलाते समय निम्नलिखित तकनीकें आपको बेहतर प्रदर्शन प्राप्त करने में मदद कर सकती हैं:

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

  • छवि डेटा चैनल - जीपीयू पर, टेंसर डेटा को 4-चैनलों में विभाजित किया जाता है, और इसलिए आकार [B,H,W,5] के साथ टेंसर पर एक गणना आकार के टेंसर पर लगभग समान प्रदर्शन करती है [B,H,W,8] , लेकिन [B,H,W,4] से काफी खराब। यदि आप जिस कैमरा हार्डवेयर का उपयोग कर रहे हैं वह आरजीबीए में छवि फ्रेम का समर्थन करता है, तो उस 4-चैनल इनपुट को फीड करना काफी तेज है, क्योंकि यह 3-चैनल आरजीबी से 4-चैनल आरजीबीएक्स में मेमोरी कॉपी से बचाता है।

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

उन्नत जीपीयू समर्थन

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

परिमाणित मॉडलों का उपयोग करना

यह अनुभाग बताता है कि GPU प्रतिनिधि 8-बिट क्वांटाइज़्ड मॉडल को कैसे गति देता है, जिसमें निम्नलिखित शामिल हैं:

प्रदर्शन को अनुकूलित करने के लिए, ऐसे मॉडल का उपयोग करें जिनमें फ़्लोटिंग-पॉइंट इनपुट और आउटपुट टेंसर दोनों हों।

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

चूँकि GPU बैकएंड केवल फ़्लोटिंग-पॉइंट निष्पादन का समर्थन करता है, हम इसे मूल मॉडल का 'फ़्लोटिंग-पॉइंट व्यू' देकर क्वांटाइज़्ड मॉडल चलाते हैं। उच्च स्तर पर, इसमें निम्नलिखित चरण शामिल हैं:

  • लगातार टेंसर (जैसे वजन/पूर्वाग्रह) को जीपीयू मेमोरी में एक बार डी-क्वांटाइज़ किया जाता है। यह ऑपरेशन तब होता है जब प्रतिनिधि TensorFlow Lite के लिए सक्षम होता है।

  • GPU प्रोग्राम में इनपुट और आउटपुट , यदि 8-बिट परिमाणित हैं, तो प्रत्येक अनुमान के लिए डी-क्वांटाइज़्ड और परिमाणित (क्रमशः) किए जाते हैं। यह ऑपरेशन CPU पर TensorFlow Lite के अनुकूलित कर्नेल का उपयोग करके किया जाता है।

  • परिमाणीकरण सिमुलेटर को परिमाणित व्यवहार की नकल करने के लिए ऑपरेशनों के बीच डाला जाता है। यह दृष्टिकोण उन मॉडलों के लिए आवश्यक है जहां ऑप्स सक्रियता से परिमाणीकरण के दौरान सीखी गई सीमाओं का पालन करने की अपेक्षा करते हैं।

GPU प्रतिनिधि के साथ इस सुविधा को सक्षम करने के बारे में जानकारी के लिए, निम्नलिखित देखें:

क्रमबद्धता के साथ आरंभीकरण समय को कम करना

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

सी++

    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;
      

जावा

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

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

क्रमांकन सुविधा का उपयोग करते समय, सुनिश्चित करें कि आपका कोड इन कार्यान्वयन नियमों का अनुपालन करता है:

  • क्रमांकन डेटा को ऐसी निर्देशिका में संग्रहीत करें जो अन्य ऐप्स के लिए पहुंच योग्य न हो। एंड्रॉइड डिवाइस पर, getCodeCacheDir() का उपयोग करें जो उस स्थान को इंगित करता है जो वर्तमान एप्लिकेशन के लिए निजी है।
  • विशिष्ट मॉडल के लिए मॉडल टोकन डिवाइस के लिए अद्वितीय होना चाहिए। आप farmhash::Fingerprint64 जैसी लाइब्रेरी का उपयोग करके मॉडल डेटा से फिंगरप्रिंट उत्पन्न करके मॉडल टोकन की गणना कर सकते हैं।