अपने मशीन लर्निंग (एमएल) मॉडल को चलाने के लिए ग्राफ़िक प्रोसेसिंग यूनिट (जीपीयू) का इस्तेमाल करने से, मॉडल की परफ़ॉर्मेंस और मशीन लर्निंग की सुविधा वाले ऐप्लिकेशन का उपयोगकर्ता अनुभव आकर्षक रूप से बेहतर हो सकता है. TensorFlow Lite, हार्डवेयर ड्राइवर की मदद से जीपीयू और दूसरे खास प्रोसेसर का इस्तेमाल करता है, जिन्हें डेलिगेट कहा जाता है. अपने TensorFlow Lite ML ऐप्लिकेशन के साथ जीपीयू का इस्तेमाल चालू करने के ये फ़ायदे हैं:
- स्पीड - जीपीयू को एक साथ कई काम करने की रफ़्तार बढ़ाने के लिए बनाया गया है. इस डिज़ाइन की मदद से, डीप न्यूरल नेट पर बहुत काम किया जाता है. इस नेट में बड़ी संख्या में ऑपरेटर होते हैं. हर तरह के ऑपरेटर इनपुट टेंसर पर काम करते हैं, जिन्हें साथ-साथ प्रोसेस किया जा सकता है. इससे आम तौर पर, इंतज़ार का समय कम हो जाता है. सबसे सही स्थिति में, अपने मॉडल को जीपीयू पर चलाया जा सकता है. इससे ऐसे रीयल-टाइम ऐप्लिकेशन चालू हो सकते हैं जो पहले मुमकिन नहीं थे.
- ऊर्जा दक्षता - जीपीयू बहुत असरदार और ऑप्टिमाइज़ किए गए तरीके से मशीन लर्निंग (एमएल) कंप्यूटेशन करते हैं. आम तौर पर, सीपीयू पर चलाए जाने वाले टास्क की तुलना में, ये कम ऊर्जा खर्च करते हैं और कम ऊर्जा का इस्तेमाल करते हैं.
इस दस्तावेज़ में, TensorFlow Lite में जीपीयू से जुड़ी सहायता के बारे में खास जानकारी दी गई है. साथ ही, जीपीयू प्रोसेसर के लिए बेहतर इस्तेमाल के कुछ उदाहरण दिए गए हैं. खास प्लैटफ़ॉर्म पर जीपीयू सहायता लागू करने के बारे में ज़्यादा खास जानकारी के लिए, यहां दी गई गाइड देखें:
जीपीयू एमएल ऑपरेशन से जुड़ी सहायता
TensorFlow ML जीपीयू का इस्तेमाल करके, TensorFlow ML के काम करने या ops से जुड़ी कुछ सीमाएं तय की जा सकती हैं. डेलिगेट, 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.
जीपीयू से जुड़ी सहायता में आने वाली समस्याएं हल करना
अगर कुछ ऑपरेशन जीपीयू डेलिगेट के साथ काम नहीं करते हैं, तो फ़्रेमवर्क ग्राफ़ के एक हिस्से को सिर्फ़ जीपीयू पर और बाकी हिस्से को सीपीयू पर चलाएगा. सीपीयू/जीपीयू सिंक करने की लागत ज़्यादा होने की वजह से, इस तरह के स्प्लिट एक्ज़ीक्यूशन मोड की परफ़ॉर्मेंस अक्सर, पूरे नेटवर्क को सीपीयू पर चलने की तुलना में धीमी रफ़्तार से मिलती है. इस स्थिति में, ऐप्लिकेशन चेतावनी जनरेट करता है, जैसे:
WARNING: op code #42 cannot be handled by this delegate.
इस प्रकार की विफलताओं के लिए कोई कॉलबैक नहीं है, क्योंकि यह एक वास्तविक रन-टाइम विफलता नहीं है. जीपीयू डेलिगेट के साथ अपने मॉडल को टेस्ट करते समय, आपको इन चेतावनियों के बारे में सूचना होनी चाहिए. ज़्यादा संख्या में चेतावनियों से यह पता चल सकता है कि जीपीयू से तेज़ी से काम करने के लिए, आपका मॉडल सबसे सही नहीं है. साथ ही, हो सकता है कि मॉडल को फिर से बनाने की ज़रूरत हो.
मॉडल के उदाहरण
नीचे दिए गए मॉडल, TensorFlow Lite की मदद से जीपीयू से तेज़ी से आगे बढ़ने के लिए बनाए गए हैं. इन्हें रेफ़रंस और जांच करने के लिए उपलब्ध कराया गया है:
- MobileNet v1 (224x224) इमेज क्लासिफ़िकेशन - यह इमेज क्लासिफ़िकेशन मॉडल है, जिसे मोबाइल और एम्बेड किए गए विज़न ऐप्लिकेशन के लिए डिज़ाइन किया गया है. (model)
- DeepLab सेगमेंटेशन (257x257) - इमेज सेगमेंटेशन मॉडल, जो इनपुट इमेज के हर पिक्सल को सिमैंटिक लेबल असाइन करता है. जैसे, कुत्ता, बिल्ली, कार वगैरह. (model)
- MobileNet एसएसडी ऑब्जेक्ट की पहचान - इमेज क्लासिफ़िकेशन मॉडल, जो बाउंडिंग बॉक्स वाले कई ऑब्जेक्ट की पहचान करता है. (model)
- पोज़ अनुमान के लिए PoseNet - यह एक ऐसा विज़न मॉडल है जो किसी इमेज या वीडियो में दिख रहे लोगों के पोज़ का अनुमान लगाता है. (model)
जीपीयू के लिए ऑप्टिमाइज़ किया जा रहा है
TensorFlow Lite जीपीयू डेलिगेट का इस्तेमाल करके, जीपीयू हार्डवेयर पर मॉडल चलाते समय इन तकनीकों की मदद से बेहतर परफ़ॉर्मेंस हासिल की जा सकती है:
आकार बदलने की कार्रवाइयां - कुछ कार्रवाइयां जो सीपीयू पर तेज़ होती हैं, हो सकता है कि मोबाइल डिवाइस पर जीपीयू के लिए ज़्यादा खर्च हो. रीसाइज़ वाली कार्रवाइयों को चलाना खास तौर पर महंगा होता है. इनमें
BATCH_TO_SPACE
,SPACE_TO_BATCH
,SPACE_TO_DEPTH
वगैरह भी शामिल हैं. आपको डेटा के आकार में बदलाव करने के तरीकों के इस्तेमाल की बारीकी से जांच करनी चाहिए. साथ ही, इस बात का ध्यान रखना चाहिए कि यह नियम सिर्फ़ डेटा एक्सप्लोर करने या मॉडल की शुरुआती अवस्था में बदलाव करने के लिए लागू किया गया हो. इन्हें हटाने से परफ़ॉर्मेंस बेहतर हो सकती है.इमेज डेटा चैनल - जीपीयू पर, टेन्सर डेटा को चार चैनलों में बांटा जाता है. इससे
[B,H,W,5]
आकार वाले टेंसर पर कंप्यूटेशन, आकार[B,H,W,8]
के टेंसर जैसा ही होता है, लेकिन यह[B,H,W,4]
से काफ़ी खराब होता है. अगर आपकी तरफ़ से इस्तेमाल किया जाने वाला कैमरा हार्डवेयर, आरजीबीए में इमेज फ़्रेम की सुविधा देता है, तो चार चैनल वाले इनपुट को तेज़ी से फ़ीड किया जा सकता है. ऐसा इसलिए, क्योंकि इससे तीन चैनल आरजीबी से 4 चैनल वाले आरजीबीएक्स में, मेमोरी कॉपी की ज़रूरत नहीं पड़ती.मोबाइल के लिए सही मॉडल - सबसे अच्छी परफ़ॉर्मेंस के लिए, आपको मोबाइल के लिए सही नेटवर्क आर्किटेक्चर की मदद से, कैटगरी तय करने वाले टूल को फिर से ट्रेनिंग देनी चाहिए. मोबाइल हार्डवेयर सुविधाओं का इस्तेमाल करके, ऑन-डिवाइस अनुमान के ऑप्टिमाइज़ेशन से इंतज़ार के समय और बिजली की खपत को बहुत कम किया जा सकता है.
जीपीयू से जुड़ी बेहतर सुविधा
अपने मॉडल के लिए बेहतर परफ़ॉर्मेंस पाने के लिए, जीपीयू प्रोसेसिंग के साथ अतिरिक्त और बेहतर तकनीकों का इस्तेमाल किया जा सकता है. इनमें क्वांटाइज़ेशन और सीरियलाइज़ेशन जैसी सुविधाएं भी शामिल हैं. इन सेक्शन में, इन तकनीकों के बारे में ज़्यादा जानकारी दी गई है.
क्वांटाइज़्ड मॉडल का इस्तेमाल करना
इस सेक्शन में बताया गया है कि जीपीयू डेलिगेट, 8-बिट संख्या वाले मॉडल को तेज़ी से कैसे बेहतर बनाता है. इनमें ये शामिल हैं:
- क्वांटाइज़ेशन-अवेयर ट्रेनिंग की मदद से ट्रेनिंग दिए गए मॉडल
- ट्रेनिंग के बाद डाइनैमिक-रेंज संख्या का अनुमान लगाना
- ट्रेनिंग के बाद फ़ुल-इंटीजर क्वांटाइज़ेशन
परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, ऐसे मॉडल इस्तेमाल करें जिनमें फ़्लोटिंग-पॉइंट इनपुट और आउटपुट टेंसर, दोनों मौजूद हों.
यह कैसे काम करता है?
जीपीयू बैकएंड सिर्फ़ फ़्लोटिंग-पॉइंट एक्ज़ीक्यूशन के साथ काम करता है, इसलिए हम इसे ओरिजनल मॉडल का 'फ़्लोटिंग-पॉइंट व्यू' देकर संख्या वाले मॉडल चलाते हैं. बड़े लेवल पर, इसके लिए इन चरणों को पूरा करना ज़रूरी है:
कॉन्सटेंट टेंसर (जैसे कि वेट/बायस) को जीपीयू मेमोरी में एक बार डी-क्वांटेशन से हटा दिया जाता है. यह कार्रवाई तब होती है, जब TensorFlow Lite के लिए डेलिगेट को चालू किया गया हो.
अगर 8-बिट की संख्या मापी जाती है, तो जीपीयू प्रोग्राम के लिए इनपुट और आउटपुट हर अनुमान के लिए डी-क्वांटेड और संख्या के मुताबिक होते हैं. यह प्रोसेस, TensorFlow Lite के ऑप्टिमाइज़ किए गए कर्नेल का इस्तेमाल करके, सीपीयू पर की जाती है.
संख्या के मुताबिक दिखने वाले व्यवहार की नकल करने के लिए, क्वांटाइज़ेशन सिम्युलेटर को ऑपरेशन के बीच डाला जाता है. यह तरीका उन मॉडल के लिए ज़रूरी है जहां ऑपरेटर, क्वांटाइज़ेशन के दौरान सीखी गई सीमाओं का पालन करने के लिए चालू होने की उम्मीद करते हैं.
जीपीयू प्रतिनिधि के ज़रिए इस सुविधा को चालू करने के बारे में जानकारी के लिए, यहां दी गई चीज़ें देखें:
- Android पर जीपीयू के साथ, संख्या के हिसाब से बनाए गए मॉडल इस्तेमाल करना
- iOS पर जीपीयू के साथ संख्या वाले मॉडल इस्तेमाल करना
सीरियलाइज़ेशन की मदद से, शुरू करने में लगने वाले समय को कम करना
जीपीयू डेलिगेट की सुविधा से, पहले से कंपाइल किए गए कर्नेल कोड और मॉडल के डेटा को क्रम से लोड किया जा सकता है. साथ ही, पिछली बार चलाए गए डेटा को डिस्क पर सेव किया जा सकता है. यह तरीका फिर से कंपाइल करने से बचता है और स्टार्टअप में लगने वाले समय को 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
जैसी लाइब्रेरी का इस्तेमाल करना होगा.