سوالی دارید؟ در انجمن بازدید از انجمن TensorFlow با انجمن ارتباط برقرار کنید

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

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

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

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

تکنیک فواید سخت افزار
کمی سازی دامنه پویا سرعت 4 برابر کوچکتر ، سرعت 2x-3x پردازنده
کمی سازی کامل عدد صحیح سرعت 4 برابر کوچکتر ، 3 برابر + CPU ، Edge TPU ، میکروکنترلرها
کمی سازی Float16 شتاب GPU 2 برابر کوچکتر پردازنده ، پردازنده گرافیکی

درخت تصمیم زیر می تواند به شما کمک کند تا تعیین کنید که کدام روش کوانتاسیون بعد از آموزش برای موارد استفاده شما بهترین است:

گزینه های بهینه سازی پس از آموزش

کمی سازی دامنه پویا

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

def representative_dataset():
  for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100):
    yield [tf.dtypes.cast(data, tf.float32)]

برای اهداف آزمایش ، می توانید از یک مجموعه داده ساختگی به شرح زیر استفاده کنید:

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 برای میکروکنترلرها و Coral Edge 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 ، هنگام اجرا بر روی پردازنده ، مقادیر وزن را برای 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 Lite ارائه شده است . برای بررسی صحت تخریب دقت در محدوده قابل قبول ، بررسی دقت مدل کوانتیزه شده مهم است. ابزارهایی برای ارزیابی دقت مدل TensorFlow Lite وجود دارد .

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

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

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

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

نمایندگی دارای دو قسمت اصلی است:

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

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

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