سند زیر مشخصات طرح کوانتیزاسیون ۸ بیتی LiteRT را شرح میدهد. این سند برای کمک به توسعهدهندگان سختافزار در ارائه پشتیبانی سختافزاری برای استنتاج با مدلهای کوانتیزه LiteRT در نظر گرفته شده است.
خلاصه مشخصات
ما در حال ارائه مشخصات هستیم و تنها میتوانیم در صورت رعایت مشخصات، تضمینهایی در مورد رفتار ارائه دهیم. ما همچنین درک میکنیم که سختافزارهای مختلف ممکن است ترجیحات و محدودیتهایی داشته باشند که ممکن است هنگام پیادهسازی مشخصات، انحرافات جزئی ایجاد کنند که منجر به پیادهسازیهایی میشود که دقیق نیستند. اگرچه این امر در بیشتر موارد ممکن است قابل قبول باشد (و ما مجموعهای از آزمایشها را ارائه خواهیم داد که تا آنجا که میدانیم شامل تلرانسهای هر عملیات است که از چندین مدل جمعآوری کردهایم)، ماهیت یادگیری ماشین (و یادگیری عمیق در رایجترین مورد) ارائه هرگونه تضمین قطعی را غیرممکن میسازد.
کوانتیزاسیون ۸ بیتی، مقادیر ممیز شناور را با استفاده از فرمول زیر تقریب میزند.
\[real\_value = (int8\_value - zero\_point) \times scale\]
وزنهای هر محور (که در عملیات کانولوشن به هر کانال نیز معروف است) یا هر تانسور با مقادیر مکمل دو در int8 [-127, 127] با نقطه صفر برابر با 0 نمایش داده میشوند. فعالسازیها/ورودیهای هر تانسور با مقادیر مکمل دو در int8 [-128, 127] با نقطه صفر در بازه [-128, 127] نمایش داده میشوند.
استثنائات دیگری نیز برای عملیات خاص وجود دارد که در زیر مستند شده است.
عدد صحیح علامتدار در مقابل عدد صحیح بدون علامت
کوانتیزاسیون LiteRT در درجه اول ابزارها و هستهها را برای کوانتیزاسیون int8 برای ۸ بیتی در اولویت قرار میدهد. این برای راحتی کوانتیزاسیون متقارن است که با نقطه صفر برابر با ۰ نمایش داده میشود. علاوه بر این، بسیاری از backendها بهینهسازیهای اضافی برای انباشت 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 و DepthwiseConv2d وجود دارد.
متقارن در مقابل نامتقارن
فعالسازیها نامتقارن هستند: آنها میتوانند نقطه صفر خود را در هر جایی در محدوده int8 علامتدار [-128, 127] داشته باشند. بسیاری از فعالسازیها ذاتاً نامتقارن هستند و نقطه صفر روشی نسبتاً ارزان برای رسیدن به دقت دودویی اضافی است. از آنجایی که فعالسازیها فقط در وزنهای ثابت ضرب میشوند، مقدار نقطه صفر ثابت را میتوان به شدت بهینه کرد.
وزنها متقارن هستند: مجبورند نقطه صفر برابر با ۰ داشته باشند. مقادیر وزن در ورودی پویا و مقادیر فعالسازی ضرب میشوند. این بدان معناست که یک هزینه زمان اجرای اجتنابناپذیر برای ضرب نقطه صفر وزن در مقدار فعالسازی وجود دارد. با اعمال این الزام که نقطه صفر ۰ باشد، میتوانیم از این هزینه جلوگیری کنیم.
توضیح محاسبات: این بخش مشابه بخش ۲.۳ در arXiv:1712.05877 است، با این تفاوت که ما اجازه میدهیم مقادیر مقیاس به ازای هر محور باشند. این به راحتی به صورت زیر تعمیم داده میشود:
$A$ یک ماتریس $m \times n$ از فعالسازیهای کوانتیزه است.
$B$ یک ماتریس $n ضربدر 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\]