امروز برای رویداد محلی TensorFlow خود در همه جا پاسخ دهید!
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

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

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

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

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

تکنیک فواید سخت افزار
کمی سازی دامنه پویا سرعت 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 [data.astype(tf.float32)]

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

def representative_dataset():
    for _ in range(100):
      data = np.random.rand(1, 244, 244, 3)
      yield [data.astype(np.float32)]
 

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

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