کمی سازی بعد از آموزش

کوانتیزاسیون پس از آموزش یک تکنیک تبدیل است که می تواند اندازه مدل را کاهش داده و در عین حال تاخیر شتاب دهنده CPU و سخت افزار را بهبود بخشد و دقت مدل کمی کاهش یابد. شما می توانید یک مدل TensorFlow شناور در حال حاضر آموزش دیده زمانی که شما آن تبدیل به فرمت TensorFlow آرشیو با استفاده از فرمول اندازهگیری TensorFlow آرشیو تبدیل .

روش های بهینه سازی

چندین گزینه کمیابی پس از آموزش برای انتخاب وجود دارد. در اینجا یک جدول خلاصه از انتخاب ها و مزایای آنها ارائه می شود:

تکنیک فواید سخت افزار
کمی سازی محدوده پویا 4 برابر کوچکتر ، 2 برابر 3x افزایش سرعت CPU
کوانتیزه کامل عدد صحیح 4 برابر کوچکتر ، 3x+ سرعت CPU ، Edge TPU ، میکروکنترلرها
کوانتیزاسیون Float16 2 برابر کوچکتر ، شتاب GPU CPU ، 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,
    }

شما می توانید مجموعه داده نماینده را با ارائه یک لیست تانسور ورودی ایجاد کنید:

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)]
 

عدد صحیح با float fallback (با استفاده از ورودی/خروجی float پیش فرض)

برای این که بتوان یک مدل را به طور کامل عدد صحیح تعیین کرد ، اما از اپراتورهای float در زمانی که اجرای صحیح ندارند استفاده کنید (برای اطمینان از تبدیل صاف) ، مراحل زیر را دنبال کنید:

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 برای میکروکنترلرها و مرجان لبه TPU ها .

علاوه بر این ، برای اطمینان از سازگاری فقط با دستگاه های صحیح (مانند میکروکنترلرهای 8 بیتی) و شتاب دهنده ها (مانند Coral Edge TPU) ، می توانید با استفاده از مراحل زیر ، کوانتیزاسیون صحیح کامل را برای همه گزینه ها از جمله ورودی و خروجی اعمال کنید:

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()

کوانتیزاسیون Float16

با اندازه گیری وزن ها به float16 ، استاندارد IEEE برای اعداد نقطه شناور 16 بیتی ، می توانید اندازه مدل شناور را کاهش دهید. برای فعال کردن کوانتیزاسیون float16 ، از مراحل زیر استفاده کنید:

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()

مزایای کوانتیزاسیون float16 به شرح زیر است:

  • اندازه مدل را تا نصف کاهش می دهد (زیرا همه وزن ها نصف اندازه اصلی خود می شوند).
  • باعث از دست رفتن حداقل دقت می شود.
  • این برنامه از برخی نمایندگان (به عنوان مثال نماینده GPU) پشتیبانی می کند که می توانند مستقیماً بر روی داده های float16 عمل کنند و در نتیجه سریعتر از محاسبات float32 اجرا می شود.

معایب کوانتیزاسیون float16 به شرح زیر است:

  • این تأخیر را به اندازه یک مقداردهی به ریاضیات نقطه ثابت کاهش نمی دهد.
  • به طور پیش فرض ، یک مدل کوانتیزه float16 هنگام اجرا روی CPU ، مقدار وزنه ها را به float32 "کاهش می دهد". (توجه داشته باشید که نماینده GPU این کمبود را انجام نمی دهد ، زیرا می تواند روی داده های float16 کار کند.)

فقط عدد صحیح: فعال سازیهای 16 بیتی با وزنهای 8 بیتی (آزمایشی)

این یک طرح کمی سازی تجربی است. این شبیه به طرح "فقط صحیح" است ، اما فعال سازی ها بر اساس محدوده آنها تا 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()

نمونه هایی از موارد استفاده که در آن بهبود دقت ارائه شده توسط این طرح کمی سازی عبارتند از: * وضوح فوق العاده ، * پردازش سیگنال صوتی مانند حذف نویز و ایجاد پرتو ، * نویز زدایی تصویر ، * بازسازی HDR از یک تصویر واحد.

مضرات این کمی سازی عبارتند از:

  • در حال حاضر نتیجه گیری به طور قابل توجهی کندتر از عدد صحیح کامل 8 بیتی به دلیل عدم اجرای بهینه هسته است.
  • در حال حاضر با نمایندگان TFLite شتابدهنده سخت افزاری موجود ناسازگار است.

آموزش برای این حالت تدریج می توان یافت در اینجا .

دقت مدل

از آنجا که وزنه ها پس از آموزش کوانتیزه می شوند ، ممکن است کاهش دقت داشته باشد ، به ویژه برای شبکه های کوچکتر. قبل از آموزش دیده به طور کامل مدل های کوانتیده هستند برای شبکه های خاص در ارائه مدل مخزن TensorFlow بازگشت به محتوا | . مهم است که دقت مدل کوانتیزه را بررسی کنید تا مطمئن شوید که هرگونه تخریب در دقت در محدوده قابل قبول است. ابزار برای ارزیابی وجود دارد دقت مدل TensorFlow بازگشت به محتوا | .

روش دیگر، اگر قطره دقت بیش از حد بالا است، در نظر با استفاده از آموزش آگاه تدریج . با این حال ، انجام این کار نیاز به اصلاحاتی در طول آموزش مدل برای افزودن گره های کوانتیزاسیون جعلی دارد ، در حالی که تکنیک های کمی سازی پس از آموزش در این صفحه از یک مدل از قبل آموزش داده شده استفاده می کند.

نمایندگی برای تنسورهای کوانتیزه

کوانتاسیون 8 بیتی با استفاده از فرمول زیر مقادیر نقاط شناور را تقریب می زند.

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

نمایندگی دارای دو بخش اصلی است:

  • هر محور (با نام مستعار هر کانال) یا وزن هر تنسور با مقادیر مکمل int82 در محدوده [-127 ، 127] با نقطه صفر برابر 0 نشان داده می شود.

  • فعال سازی/ورودی های هر تنسور با مقادیر مکمل int8 دو در محدوده [-128 ، 127] ، با یک نقطه صفر در محدوده [-128 ، 127].

برای مشاهده دقیق از طرح تدریج ما، لطفا ما را ببینید تنظیمات تدریج . فروشندگان سخت افزاری که می خواهند به رابط نماینده TensorFlow Lite وصل شوند ، تشویق می شوند که طرح کوانتاسیون توضیح داده شده در آنجا را اجرا کنند.