प्रशिक्षण के बाद का परिमाणीकरण एक रूपांतरण तकनीक है जो मॉडल सटीकता में थोड़ी गिरावट के साथ सीपीयू और हार्डवेयर त्वरक विलंबता में सुधार करते हुए मॉडल के आकार को कम कर सकती है। जब आप इसे TensorFlow Lite कन्वर्टर का उपयोग करके TensorFlow Lite प्रारूप में परिवर्तित करते हैं, तो आप पहले से ही प्रशिक्षित फ्लोट TensorFlow मॉडल की मात्रा निर्धारित कर सकते हैं।
अनुकूलन के तरीके
चुनने के लिए कई पोस्ट-प्रशिक्षण परिमाणीकरण विकल्प हैं। यहां विकल्पों और उनके द्वारा प्रदान किए जाने वाले लाभों की सारांश तालिका दी गई है:
तकनीक | फ़ायदे | हार्डवेयर |
---|---|---|
गतिशील रेंज परिमाणीकरण | 4x छोटा, 2x-3x स्पीडअप | CPU |
पूर्ण पूर्णांक परिमाणीकरण | 4x छोटा, 3x+ स्पीडअप | सीपीयू, एज टीपीयू, माइक्रोकंट्रोलर |
फ्लोट16 परिमाणीकरण | 2x छोटा, GPU त्वरण | सीपीयू, जीपीयू |
निम्नलिखित निर्णय वृक्ष यह निर्धारित करने में मदद कर सकता है कि आपके उपयोग के मामले के लिए प्रशिक्षण के बाद का कौन सा परिमाणीकरण तरीका सबसे अच्छा है:
गतिशील रेंज परिमाणीकरण
डायनेमिक रेंज परिमाणीकरण एक अनुशंसित प्रारंभिक बिंदु है क्योंकि यह आपके द्वारा अंशांकन के लिए एक प्रतिनिधि डेटासेट प्रदान किए बिना कम मेमोरी उपयोग और तेज़ संगणना प्रदान करता है। इस प्रकार का परिमाणीकरण, स्थिर रूप से रूपांतरण समय पर फ्लोटिंग पॉइंट से पूर्णांक तक केवल वज़न को परिमाणित करता है, जो 8-बिट सटीकता प्रदान करता है:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] tflite_quant_model = converter.convert()
अनुमान के दौरान विलंबता को और कम करने के लिए, "डायनेमिक-रेंज" ऑपरेटर गतिशील रूप से 8-बिट्स की अपनी सीमा के आधार पर सक्रियता की मात्रा निर्धारित करते हैं और 8-बिट वज़न और सक्रियण के साथ संगणना करते हैं। यह अनुकूलन पूरी तरह से निश्चित-बिंदु अनुमानों के करीब विलंबता प्रदान करता है। हालाँकि, आउटपुट अभी भी फ़्लोटिंग पॉइंट का उपयोग करके संग्रहीत किए जाते हैं, इसलिए डायनेमिक-रेंज ऑप्स की बढ़ी हुई गति पूर्ण निश्चित-बिंदु संगणना से कम है।
पूर्ण पूर्णांक परिमाणीकरण
यह सुनिश्चित करके कि सभी मॉडल गणित पूर्णांक परिमाणित हैं, आप और विलंबता सुधार प्राप्त कर सकते हैं, चरम मेमोरी उपयोग में कमी, और केवल पूर्णांक हार्डवेयर उपकरणों या त्वरक के साथ संगतता प्राप्त कर सकते हैं।
पूर्ण पूर्णांक परिमाणीकरण के लिए, आपको मॉडल में सभी फ़्लोटिंग-पॉइंट टेंसरों की सीमा, यानी, (न्यूनतम, अधिकतम) को कैलिब्रेट या अनुमानित करने की आवश्यकता है। वजन और पूर्वाग्रह जैसे स्थिर टेंसरों के विपरीत, चर टेंसर जैसे कि मॉडल इनपुट, सक्रियण (मध्यवर्ती परतों के आउटपुट) और मॉडल आउटपुट को तब तक कैलिब्रेट नहीं किया जा सकता जब तक कि हम कुछ अनुमान चक्र नहीं चलाते। नतीजतन, कनवर्टर को उन्हें कैलिब्रेट करने के लिए प्रतिनिधि डेटासेट की आवश्यकता होती है। यह डेटासेट प्रशिक्षण या सत्यापन डेटा का एक छोटा उपसमुच्चय (लगभग ~100-500 नमूने) हो सकता है। नीचे दिए गए representative_dataset()
फ़ंक्शन का संदर्भ लें।
TensorFlow 2.7 संस्करण से, आप निम्न उदाहरण के रूप में एक हस्ताक्षर के माध्यम से प्रतिनिधि डेटासेट निर्दिष्ट कर सकते हैं:
def representative_dataset(): for data in dataset: yield { "image": data.image, "bias": data.bias, }
यदि दिए गए TensorFlow मॉडल में एक से अधिक हस्ताक्षर हैं, तो आप हस्ताक्षर कुंजी निर्दिष्ट करके एकाधिक डेटासेट निर्दिष्ट कर सकते हैं:
def representative_dataset(): # Feed data set for the "encode" signature. for data in encode_signature_dataset: yield ( "encode", { "image": data.image, "bias": data.bias, } ) # Feed data set for the "decode" signature. for data in decode_signature_dataset: yield ( "decode", { "image": data.image, "hint": data.hint, }, )
आप इनपुट टेन्सर सूची प्रदान करके प्रतिनिधि डेटासेट उत्पन्न कर सकते हैं:
def representative_dataset(): for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100): yield [tf.dtypes.cast(data, tf.float32)]
TensorFlow 2.7 संस्करण के बाद से, हम इनपुट टेंसर सूची-आधारित दृष्टिकोण पर हस्ताक्षर-आधारित दृष्टिकोण का उपयोग करने की सलाह देते हैं क्योंकि इनपुट टेंसर ऑर्डरिंग को आसानी से फ़्लिप किया जा सकता है।
परीक्षण उद्देश्यों के लिए, आप एक डमी डेटासेट का उपयोग निम्नानुसार कर सकते हैं:
def representative_dataset(): for _ in range(100): data = np.random.rand(1, 244, 244, 3) yield [data.astype(np.float32)]
फ्लोट फ़ॉलबैक के साथ पूर्णांक (डिफ़ॉल्ट फ़्लोट इनपुट/आउटपुट का उपयोग करके)
किसी मॉडल को पूरी तरह से पूर्णांक बनाने के लिए, लेकिन फ्लोट ऑपरेटरों का उपयोग तब करें जब उनके पास पूर्णांक कार्यान्वयन न हो (रूपांतरण सुचारू रूप से सुनिश्चित करने के लिए), निम्न चरणों का उपयोग करें:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.representative_dataset = representative_dataset tflite_quant_model = converter.convert()
केवल पूर्णांक
माइक्रोकंट्रोलर्स और कोरल एज टीपीयू के लिए TensorFlow Lite के लिए केवल पूर्णांक मॉडल बनाना एक सामान्य उपयोग मामला है।
इसके अतिरिक्त, पूर्णांक उपकरणों (जैसे 8-बिट माइक्रोकंट्रोलर) और त्वरक (जैसे कोरल एज टीपीयू) के साथ संगतता सुनिश्चित करने के लिए, आप निम्न चरणों का उपयोग करके इनपुट और आउटपुट सहित सभी ऑप्स के लिए पूर्ण पूर्णांक परिमाणीकरण लागू कर सकते हैं:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.representative_dataset = representative_dataset converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] converter.inference_input_type = tf.int8 # or tf.uint8 converter.inference_output_type = tf.int8 # or tf.uint8 tflite_quant_model = converter.convert()
फ्लोट16 परिमाणीकरण
आप 16-बिट फ़्लोटिंग पॉइंट नंबरों के लिए IEEE मानक, फ़्लोट16 के वज़न को परिमाणित करके फ़्लोटिंग पॉइंट मॉडल के आकार को कम कर सकते हैं। वज़न के फ़्लोट16 परिमाणीकरण को सक्षम करने के लिए, निम्न चरणों का उपयोग करें:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_types = [tf.float16] tflite_quant_model = converter.convert()
फ्लोट16 परिमाणीकरण के लाभ इस प्रकार हैं:
- यह मॉडल के आकार को आधे तक कम कर देता है (क्योंकि सभी भार अपने मूल आकार के आधे हो जाते हैं)।
- यह सटीकता में न्यूनतम नुकसान का कारण बनता है।
- यह कुछ प्रतिनिधियों (जैसे जीपीयू प्रतिनिधि) का समर्थन करता है जो फ्लोट 16 डेटा पर सीधे काम कर सकता है, जिसके परिणामस्वरूप फ्लोट 32 कंप्यूटेशंस की तुलना में तेज़ निष्पादन होता है।
फ्लोट16 परिमाणीकरण के नुकसान इस प्रकार हैं:
- यह विलंबता को निश्चित बिंदु गणित के परिमाणीकरण जितना कम नहीं करता है।
- डिफ़ॉल्ट रूप से, एक फ्लोट 16 क्वांटाइज़्ड मॉडल सीपीयू पर चलने पर वज़न मानों को फ़्लोट 32 पर "डिक्वांटाइज़" करेगा। (ध्यान दें कि जीपीयू प्रतिनिधि इस विचलन को नहीं करेगा, क्योंकि यह फ्लोट 16 डेटा पर काम कर सकता है।)
केवल पूर्णांक: 8-बिट भार के साथ 16-बिट सक्रियण (प्रायोगिक)
यह एक प्रायोगिक परिमाणीकरण योजना है। यह "केवल पूर्णांक" योजना के समान है, लेकिन सक्रियता को उनकी सीमा के आधार पर 16-बिट्स के आधार पर परिमाणित किया जाता है, वज़न को 8-बिट पूर्णांक में परिमाणित किया जाता है और पूर्वाग्रह को 64-बिट पूर्णांक में परिमाणित किया जाता है। इसे आगे 16x8 परिमाणीकरण के रूप में जाना जाता है।
इस परिमाणीकरण का मुख्य लाभ यह है कि यह सटीकता में काफी सुधार कर सकता है, लेकिन केवल मॉडल के आकार को थोड़ा बढ़ा सकता है।
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.representative_dataset = representative_dataset converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8] tflite_quant_model = converter.convert()
यदि मॉडल में कुछ ऑपरेटरों के लिए 16x8 परिमाणीकरण समर्थित नहीं है, तब भी मॉडल को परिमाणित किया जा सकता है, लेकिन असमर्थित ऑपरेटरों को फ्लोट में रखा जाता है। इसे अनुमति देने के लिए निम्नलिखित विकल्प को target_spec में जोड़ा जाना चाहिए।
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.representative_dataset = representative_dataset converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8, tf.lite.OpsSet.TFLITE_BUILTINS] tflite_quant_model = converter.convert()
उपयोग के मामलों के उदाहरण जहां इस परिमाणीकरण योजना द्वारा प्रदान की गई सटीकता में सुधार शामिल हैं:
- सुपर-रिज़ॉल्यूशन,
- ऑडियो सिग्नल प्रोसेसिंग जैसे शोर रद्द करना और बीमफॉर्मिंग,
- छवि डी-शोरिंग,
- एक छवि से एचडीआर पुनर्निर्माण।
इस परिमाणीकरण का नुकसान है:
- अनुकूलित कर्नेल कार्यान्वयन की कमी के कारण वर्तमान में अनुमान 8-बिट पूर्ण पूर्णांक से काफी धीमा है।
- वर्तमान में यह मौजूदा हार्डवेयर त्वरित TFLite प्रतिनिधियों के साथ असंगत है।
इस परिमाणीकरण मोड के लिए एक ट्यूटोरियल यहां पाया जा सकता है।
मॉडल सटीकता
चूंकि वजन प्रशिक्षण के बाद परिमाणित होते हैं, इसलिए सटीकता में कमी हो सकती है, विशेष रूप से छोटे नेटवर्क के लिए। TensorFlow हब पर विशिष्ट नेटवर्क के लिए पूर्व-प्रशिक्षित पूरी तरह से परिमाणित मॉडल प्रदान किए जाते हैं। यह सत्यापित करने के लिए परिमाणित मॉडल की सटीकता की जांच करना महत्वपूर्ण है कि सटीकता में कोई गिरावट स्वीकार्य सीमा के भीतर है। TensorFlow Lite मॉडल सटीकता का मूल्यांकन करने के लिए उपकरण हैं।
वैकल्पिक रूप से, यदि सटीकता में गिरावट बहुत अधिक है, तो परिमाणीकरण जागरूक प्रशिक्षण का उपयोग करने पर विचार करें। हालांकि, ऐसा करने के लिए मॉडल प्रशिक्षण के दौरान नकली परिमाणीकरण नोड्स को जोड़ने के लिए संशोधनों की आवश्यकता होती है, जबकि इस पृष्ठ पर प्रशिक्षण के बाद के परिमाणीकरण तकनीकों में मौजूदा पूर्व-प्रशिक्षित मॉडल का उपयोग किया जाता है।
परिमाणित टेंसरों के लिए प्रतिनिधित्व
8-बिट परिमाणीकरण निम्न सूत्र का उपयोग करके फ़्लोटिंग पॉइंट मानों का अनुमान लगाता है।
\[real\_value = (int8\_value - zero\_point) \times scale\]
प्रतिनिधित्व के दो मुख्य भाग हैं:
प्रति-अक्ष (उर्फ़ प्रति-चैनल) या प्रति-टेंसर भार int8 दो के पूरक मानों द्वारा [-127, 127] श्रेणी में शून्य-बिंदु के बराबर 0 के साथ दर्शाया गया है।
[-128, 127] रेंज [-128, 127] में int8 दो के पूरक मूल्यों द्वारा प्रतिनिधित्व प्रति-टेंसर सक्रियण/इनपुट, रेंज में शून्य-बिंदु [-128, 127] के साथ।
हमारी परिमाणीकरण योजना के विस्तृत विवरण के लिए, कृपया हमारी परिमाणीकरण युक्ति देखें। हार्डवेयर विक्रेता जो TensorFlow Lite के प्रतिनिधि इंटरफ़ेस में प्लग इन करना चाहते हैं, उन्हें वहां वर्णित परिमाणीकरण योजना को लागू करने के लिए प्रोत्साहित किया जाता है।