TensorFlow Lite 8-बिट क्वांटाइज़ेशन की खास बातें

निम्नलिखित दस्तावेज़ TensorFlow Lite की 8-बिट परिमाणीकरण योजना के विनिर्देशन की रूपरेखा प्रस्तुत करता है। इसका उद्देश्य परिमाणित टेन्सरफ्लो लाइट मॉडल के अनुमान के लिए हार्डवेयर समर्थन प्रदान करने में हार्डवेयर डेवलपर्स की सहायता करना है।

विशिष्टता सारांश

हम एक विशिष्टता प्रदान कर रहे हैं, और यदि विशिष्टता का पालन किया जाता है तो हम व्यवहार पर केवल कुछ गारंटी प्रदान कर सकते हैं। हम यह भी समझते हैं कि अलग-अलग हार्डवेयर में प्राथमिकताएं और प्रतिबंध हो सकते हैं जो विशिष्टताओं को लागू करते समय मामूली विचलन पैदा कर सकते हैं जिसके परिणामस्वरूप कार्यान्वयन बिट-सटीक नहीं होते हैं। जबकि यह ज्यादातर मामलों में स्वीकार्य हो सकता है (और हम परीक्षणों का एक सूट प्रदान करेंगे जिसमें हमारे सर्वोत्तम ज्ञान के अनुसार प्रति-ऑपरेशन सहनशीलता शामिल है जिसे हमने कई मॉडलों से इकट्ठा किया है), मशीन लर्निंग की प्रकृति (और सबसे आम में गहरी शिक्षा) केस) कोई भी कठोर गारंटी प्रदान करना असंभव बना देता है।

8-बिट परिमाणीकरण निम्न सूत्र का उपयोग करके फ़्लोटिंग पॉइंट मानों का अनुमान लगाता है।

\[real\_value = (int8\_value - zero\_point) \times scale\]

प्रति-अक्ष (रूपांतरण ऑप्स में प्रति-चैनल उर्फ) या प्रति-टेंसर भार को 0 के बराबर शून्य-बिंदु के साथ [-127, 127] सीमा में int8 दो के पूरक मानों द्वारा दर्शाया जाता है। प्रति-टेंसर सक्रियण/इनपुट का प्रतिनिधित्व किया जाता है int8 सीमा [-128, 127] में दो पूरक मान हैं, सीमा [-128, 127] में शून्य-बिंदु के साथ।

विशेष परिचालनों के लिए अन्य अपवाद भी हैं जिनका दस्तावेजीकरण नीचे किया गया है।

हस्ताक्षरित पूर्णांक बनाम अहस्ताक्षरित पूर्णांक

TensorFlow Lite परिमाणीकरण मुख्य रूप से 8-बिट के लिए int8 परिमाणीकरण के लिए टूलींग और कर्नेल को प्राथमिकता देगा। यह 0 के बराबर शून्य-बिंदु द्वारा दर्शाए जाने वाले सममित परिमाणीकरण की सुविधा के लिए है। इसके अतिरिक्त कई बैकएंड में int8xint8 संचय के लिए अतिरिक्त अनुकूलन हैं।

प्रति-अक्ष बनाम प्रति-टेंसर

प्रति-टेंसर परिमाणीकरण का अर्थ है कि प्रति पूरे टेंसर में एक पैमाना और/या शून्य-बिंदु होगा। प्रति-अक्ष परिमाणीकरण का अर्थ है कि quantized_dimension में प्रति स्लाइस एक स्केल और/या zero_point होगा। परिमाणित आयाम टेन्सर के आकार के आयाम को निर्दिष्ट करता है जो तराजू और शून्य-बिंदु के अनुरूप होता है। उदाहरण के लिए, एक टेंसर t , dims=[4, 3, 2, 1] के साथ परिमाणीकरण पैरामीटर के साथ: scale=[1.0, 2.0, 3.0] , zero_point=[1, 2, 3] , quantization_dimension=1 भर में परिमाणित किया जाएगा t का दूसरा आयाम:

t[:, 0, :, :] will have scale[0]=1.0, zero_point[0]=1
t[:, 1, :, :] will have scale[1]=2.0, zero_point[1]=2
t[:, 2, :, :] will have scale[2]=3.0, zero_point[2]=3

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

TFLite के पास बढ़ती संख्या में परिचालनों के लिए प्रति-अक्ष समर्थन है। इस दस्तावेज़ के समय, Conv2d और DepthवाइजConv2d के लिए समर्थन मौजूद है।

सममित बनाम असममित

सक्रियण असममित हैं: उनका शून्य-बिंदु हस्ताक्षरित int8 सीमा [-128, 127] के भीतर कहीं भी हो सकता है। कई सक्रियण प्रकृति में असममित हैं और शून्य-बिंदु परिशुद्धता के अतिरिक्त बाइनरी बिट तक प्रभावी ढंग से पहुंचने का एक अपेक्षाकृत सस्ता तरीका है। चूँकि सक्रियताएँ केवल स्थिर भार से गुणा की जाती हैं, इसलिए स्थिर शून्य-बिंदु मान को काफी हद तक अनुकूलित किया जा सकता है।

वजन सममित हैं: शून्य-बिंदु को 0 के बराबर रखने के लिए मजबूर किया जाता है। वजन मान को गतिशील इनपुट और सक्रियण मान से गुणा किया जाता है। इसका मतलब यह है कि सक्रियण मूल्य के साथ वजन के शून्य-बिंदु को गुणा करने की एक अपरिहार्य रनटाइम लागत है। यह लागू करके कि शून्य-बिंदु 0 है हम इस लागत से बच सकते हैं।

गणित की व्याख्या: यह arXiv:1712.05877 में अनुभाग 2.3 के समान है, सिवाय इस अंतर के कि हम स्केल मानों को प्रति-अक्ष होने की अनुमति देते हैं। इसे आसानी से सामान्यीकृत किया जा सकता है, इस प्रकार:

\(A\) एक है \(m \times n\) परिमाणित सक्रियणों का मैट्रिक्स।
\(B\) एक है \(n \times p\) परिमाणित भार का मैट्रिक्स।
गुणा करने पर विचार करें \(j\)की पंक्ति \(A\), \(a_j\) से \(k\)का वां कॉलम\(B\), \(b_k\), दोनों की लंबाई \(n\). परिमाणित पूर्णांक मान और शून्य-बिंदु मान हैं \(q_a\), \(z_a\) और \(q_b\), \(z_b\) क्रमश।

\[a_j \cdot b_k = \sum_{i=0}^{n} a_{j}^{(i)} b_{k}^{(i)} = \sum_{i=0}^{n} (q_{a}^{(i)} - z_a) (q_{b}^{(i)} - z_b) = \sum_{i=0}^{n} q_{a}^{(i)} q_{b}^{(i)} - \sum_{i=0}^{n} q_{a}^{(i)} z_b - \sum_{i=0}^{n} q_{b}^{(i)} z_a + \sum_{i=0}^{n} z_a z_b\]