Google I/O में ट्यूनिंग के लिए धन्यवाद। मांग पर सभी सत्र देखें मांग पर देखें

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

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

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

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

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

TensorFlow ML संचालन, या ops को 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 त्वरण का लाभ उठाने के लिए बनाए गए हैं और संदर्भ और परीक्षण के लिए प्रदान किए गए हैं:

जीपीयू के लिए अनुकूलन

निम्नलिखित तकनीकें 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,8] , लेकिन [B,H,W,4] से काफी खराब है। यदि आप जिस कैमरा हार्डवेयर का उपयोग कर रहे हैं, वह आरजीबीए में इमेज फ्रेम का समर्थन करता है, तो उस 4-चैनल इनपुट को खिलाना काफी तेज है, क्योंकि यह 3-चैनल आरजीबी से 4-चैनल आरजीबीएक्स में मेमोरी कॉपी से बचा जाता है।

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

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

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

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

यह खंड बताता है कि कैसे GPU प्रतिनिधि निम्नलिखित सहित 8-बिट परिमाणित मॉडल को गति देता है:

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

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

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

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

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

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

इस सुविधा को 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 जैसे पुस्तकालयों का उपयोग करके मॉडल डेटा से फिंगरप्रिंट उत्पन्न करके मॉडल टोकन की गणना कर सकते हैं।