प्रशिक्षण के बाद परिमाणीकरण

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

अनुकूलन के तरीके

चुनने के लिए कई पोस्ट-प्रशिक्षण परिमाणीकरण विकल्प हैं। यहां विकल्पों और उनके द्वारा प्रदान किए जाने वाले लाभों की एक सारांश तालिका दी गई है:

तकनीक फ़ायदे हार्डवेयर
गतिशील रेंज परिमाणीकरण 4x छोटा, 2x-3x स्पीडअप सी पी यू
पूर्ण पूर्णांक परिमाणीकरण 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-बिट तक गतिशील रूप से निर्धारित करते हैं और 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, आईईईई मानक के लिए 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 परिमाणीकरण के लाभ इस प्रकार हैं:

  • यह मॉडल के आकार को आधे तक कम कर देता है (क्योंकि सभी भार अपने मूल आकार के आधे हो जाते हैं)।
  • यह सटीकता में न्यूनतम नुकसान का कारण बनता है।
  • यह कुछ प्रतिनिधियों (जैसे GPU प्रतिनिधि) का समर्थन करता है जो सीधे फ्लोट16 डेटा पर काम कर सकते हैं, जिसके परिणामस्वरूप फ्लोट32 कंप्यूटेशंस की तुलना में तेजी से निष्पादन होता है।

फ्लोट 16 परिमाणीकरण के नुकसान इस प्रकार हैं:

  • यह निश्चित बिंदु गणित के परिमाणीकरण के रूप में विलंबता को कम नहीं करता है।
  • डिफ़ॉल्ट रूप से, एक फ्लोट16 क्वांटाइज्ड मॉडल सीपीयू पर चलने पर वेट वैल्यू को फ्लोट 32 पर "डिक्वेंटाइज" करेगा। (ध्यान दें कि GPU प्रतिनिधि इस डीक्वांटाइजेशन को नहीं करेगा, क्योंकि यह फ्लोट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] श्रेणी में int8 दो के पूरक मानों द्वारा दर्शाया गया है, जिसमें शून्य-बिंदु सीमा [-128, 127] है।

हमारी परिमाणीकरण योजना के विस्तृत दृश्य के लिए, कृपया हमारे परिमाणीकरण युक्ति को देखें। हार्डवेयर विक्रेता जो TensorFlow Lite के प्रतिनिधि इंटरफ़ेस में प्लग इन करना चाहते हैं, उन्हें वहां वर्णित परिमाणीकरण योजना को लागू करने के लिए प्रोत्साहित किया जाता है।