convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

آپ سے پہلے ایک بار پھر اشیاء کا پتہ لگانے کا کام ہے. ترجیح قابل قبول درستگی کے ساتھ کام کی رفتار ہے۔ آپ YOLOv3 فن تعمیر کو لیں اور اسے مزید تربیت دیں۔ درستگی (mAp75) 0.95 سے زیادہ ہے۔ لیکن رن ریٹ اب بھی کم ہے۔ گھٹیا.

آج ہم کوانٹائزیشن کو نظرانداز کریں گے۔ اور کٹ کے نیچے ہم دیکھیں گے۔ ماڈل کی کٹائی - درستگی کے نقصان کے بغیر انفرنس کو تیز کرنے کے لیے نیٹ ورک کے بے کار حصوں کو تراشنا۔ یہ واضح ہے کہ کہاں، کتنا اور کیسے کاٹنا ہے۔ آئیے یہ معلوم کریں کہ یہ دستی طور پر کیسے کریں اور آپ اسے کہاں خودکار کر سکتے ہیں۔ آخر میں کیراس پر ایک ذخیرہ ہے۔

تعارف

اپنے پچھلے کام کی جگہ، پرم میں میکروسکوپ، میں نے ایک عادت پیدا کر لی تھی - ہمیشہ الگورتھم کے عمل کے وقت کی نگرانی کرنا۔ اور ہمیشہ ایک مناسب فلٹر کے ذریعے نیٹ ورک کے رن ٹائم کو چیک کریں۔ عام طور پر پروڈکشن میں جدید ترین اس فلٹر کو پاس نہیں کرتا، جس کی وجہ سے میں کٹائی کی طرف چلا گیا۔

کٹائی ایک پرانا موضوع ہے جس پر بات کی گئی تھی۔ اسٹینفورڈ لیکچرز 2017 میں بنیادی خیال مختلف نوڈس کو ہٹا کر درستگی کو کھوئے بغیر تربیت یافتہ نیٹ ورک کے سائز کو کم کرنا ہے۔ یہ اچھا لگتا ہے، لیکن میں اس کے استعمال کے بارے میں شاذ و نادر ہی سنتا ہوں۔ شاید، وہاں کافی نفاذ نہیں ہیں، روسی زبان میں کوئی مضمون نہیں ہے، یا صرف ہر کوئی اسے علم کی کٹائی کو سمجھتا ہے اور خاموش رہتا ہے۔
لیکن آئیے اسے الگ کرتے ہیں۔

حیاتیات میں ایک جھلک

مجھے یہ پسند ہے جب ڈیپ لرننگ حیاتیات سے آنے والے خیالات کو دیکھتی ہے۔ ان پر، ارتقاء کی طرح، بھروسہ کیا جا سکتا ہے (کیا آپ جانتے ہیں کہ ReLU سے بہت ملتا جلتا ہے۔ دماغ میں نیوران ایکٹیویشن کا کام?)

ماڈل کی کٹائی کا عمل بھی حیاتیات کے قریب ہے۔ یہاں نیٹ ورک کے ردعمل کا موازنہ دماغ کی پلاسٹکٹی سے کیا جا سکتا ہے۔ کتاب میں چند دلچسپ مثالیں ہیں۔ نارمن ڈوج:

  1. ایک عورت جو صرف ایک نصف کے ساتھ پیدا ہوئی تھی اس کے دماغ نے گمشدہ نصف کے افعال کو انجام دینے کے لیے خود کو دوبارہ پروگرام کیا ہے۔
  2. اس لڑکے نے اپنے دماغ کے اس حصے کو گولی مار دی جو بصارت کے لیے ذمہ دار تھی۔ وقت کے ساتھ، دماغ کے دوسرے حصوں نے ان افعال کو سنبھال لیا. (ہم دہرانے کی کوشش نہیں کر رہے ہیں)

اسی طرح، آپ اپنے ماڈل سے کچھ کمزور کنولیشنز کو کاٹ سکتے ہیں۔ آخری حربے کے طور پر، باقی بنڈل کٹے ہوئے کو تبدیل کرنے میں مدد کریں گے۔

کیا آپ کو ٹرانسفر لرننگ پسند ہے یا آپ شروع سے سیکھ رہے ہیں؟

آپشن نمبر ایک۔ آپ Yolov3 پر ٹرانسفر لرننگ استعمال کرتے ہیں۔ ریٹنا، ماسک-RCNN یا U-Net۔ لیکن زیادہ تر وقت ہمیں COCO کی طرح 80 آبجیکٹ کلاسز کو پہچاننے کی ضرورت نہیں ہوتی ہے۔ میری مشق میں، سب کچھ گریڈ 1-2 تک محدود ہے۔ کوئی یہ سمجھ سکتا ہے کہ یہاں 80 کلاسوں کا فن تعمیر بے کار ہے۔ اس سے پتہ چلتا ہے کہ فن تعمیر کو چھوٹا کرنے کی ضرورت ہے۔ مزید یہ کہ، میں یہ پہلے سے تربیت یافتہ وزن کو کھونے کے بغیر کرنا چاہوں گا۔

آپشن نمبر دو۔ ہوسکتا ہے کہ آپ کے پاس بہت سارے ڈیٹا اور کمپیوٹنگ کے وسائل ہوں، یا صرف ایک سپر کسٹم فن تعمیر کی ضرورت ہو۔ کوئی فرق نہیں پڑتا۔ لیکن آپ شروع سے نیٹ ورک سیکھ رہے ہیں۔ معمول کا طریقہ کار یہ ہے کہ ڈیٹا کے ڈھانچے کو دیکھیں، ایک ایسے فن تعمیر کو منتخب کریں جو ضرورت سے زیادہ طاقت رکھتا ہو، اور ڈراپ آؤٹ کو دوبارہ تربیت سے دھکیلیں۔ میں نے 0.6 ڈراپ آؤٹ دیکھا، کارل۔

دونوں صورتوں میں، نیٹ ورک کو کم کیا جا سکتا ہے. حوصلہ افزائی. اب آئیے یہ معلوم کرتے ہیں کہ ختنہ کی کٹائی کس قسم کی ہے۔

عمومی الگورتھم

ہم نے فیصلہ کیا کہ ہم بنڈلز کو ہٹا سکتے ہیں۔ یہ کافی آسان لگتا ہے:

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

کسی بھی تبدیلی کو ہٹانا نیٹ ورک کے لیے دباؤ کا باعث ہے، جو عام طور پر غلطی میں کچھ اضافے کا باعث بنتا ہے۔ ایک طرف، غلطی میں یہ اضافہ اس بات کا اشارہ ہے کہ ہم کنوولوشنز کو کس طرح درست طریقے سے ہٹاتے ہیں (مثال کے طور پر، ایک بڑا اضافہ اس بات کی نشاندہی کرتا ہے کہ ہم کچھ غلط کر رہے ہیں)۔ لیکن ایک چھوٹا سا اضافہ کافی قابل قبول ہے اور اکثر ایک چھوٹے LR کے ساتھ بعد میں ہلکی اضافی تربیت کے ذریعے اسے ختم کر دیا جاتا ہے۔ ایک اضافی تربیتی مرحلہ شامل کریں:

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

اب ہمیں یہ جاننے کی ضرورت ہے کہ ہم اپنی لرننگ<->پروننگ لوپ کو کب روکنا چاہتے ہیں۔ یہاں غیر ملکی اختیارات ہوسکتے ہیں جب ہمیں نیٹ ورک کو ایک مخصوص سائز اور رفتار تک کم کرنے کی ضرورت ہوتی ہے (مثال کے طور پر، موبائل آلات کے لیے)۔ تاہم، سب سے عام آپشن یہ ہے کہ سائیکل کو اس وقت تک جاری رکھیں جب تک کہ غلطی قابل قبول سے زیادہ نہ ہوجائے۔ شرط شامل کریں:

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

لہذا، الگورتھم واضح ہو جاتا ہے. یہ معلوم کرنا باقی ہے کہ حذف شدہ کنوولوشنز کا تعین کیسے کیا جائے۔

حذف شدہ پیکیجز تلاش کریں۔

ہمیں کچھ کنولیشنز کو دور کرنے کی ضرورت ہے۔ آگے بڑھنا اور کسی کو "شوٹنگ" کرنا برا خیال ہے، حالانکہ یہ کام کرے گا۔ لیکن چونکہ آپ کا سر ہے، آپ سوچ سکتے ہیں اور ہٹانے کے لیے "کمزور" کنولیشنز کو منتخب کرنے کی کوشش کر سکتے ہیں۔ کئی اختیارات ہیں:

  1. سب سے چھوٹی L1 پیمائش یا کم_میگنیٹیوڈ_پروننگ. یہ خیال کہ چھوٹے وزن کے ساتھ اختلاط حتمی فیصلے میں بہت کم حصہ ڈالتے ہیں۔
  2. اوسط اور معیاری انحراف کو مدنظر رکھتے ہوئے سب سے چھوٹی L1 پیمائش۔ ہم تقسیم کی نوعیت کے جائزے کے ساتھ ضمیمہ کرتے ہیں۔
  3. اختلاط کو ماسک کرنا اور ان کو خارج کرنا جو حتمی درستگی کو کم سے کم متاثر کرتے ہیں۔. غیر معمولی تبدیلیوں کا زیادہ درست تعین، لیکن بہت وقت طلب اور وسائل کی ضرورت ہے۔
  4. دیگر

اختیارات میں سے ہر ایک کو زندگی کا حق اور اس کے نفاذ کی اپنی خصوصیات ہیں۔ یہاں ہم سب سے چھوٹی L1 پیمائش والے آپشن پر غور کرتے ہیں۔

YOLOv3 کے لیے دستی عمل

اصل فن تعمیر میں بقایا بلاکس شامل ہیں۔ لیکن اس سے کوئی فرق نہیں پڑتا ہے کہ وہ گہرے نیٹ ورکس کے لیے کتنے ہی ٹھنڈے ہوں، وہ ہمیں کسی حد تک روکیں گے۔ مشکل یہ ہے کہ آپ ان تہوں میں مختلف اشاریہ جات کے ساتھ مفاہمت کو حذف نہیں کرسکتے ہیں۔

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

لہذا، آئیے ان تہوں کو منتخب کریں جہاں سے ہم آزادانہ طور پر مفاہمت کو حذف کر سکتے ہیں:

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

اب ایک کام کا چکر بنائیں:

  1. ایکٹیویشنز اپ لوڈ کرنا
  2. یہ معلوم کرنا کہ کتنا کاٹنا ہے۔
  3. کاٹ
  4. LR=10e-1 کے ساتھ 4 دور سیکھنا
  5. ٹیسٹنگ

ان لوڈنگ convolutions کا اندازہ لگانے کے لیے مفید ہے کہ ہم کسی خاص مرحلے پر کتنے حصے کو ہٹا سکتے ہیں۔ اتارنے کی مثالیں:

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

ہم دیکھتے ہیں کہ تقریباً ہر جگہ 5% convolutions کا L1-norm بہت کم ہوتا ہے اور ہم انہیں ہٹا سکتے ہیں۔ ہر قدم پر، اس اتار چڑھاؤ کو دہرایا جاتا تھا اور اس بات کا اندازہ لگایا جاتا تھا کہ کون سی پرتیں اور کتنی کٹائی جا سکتی ہیں۔

پورا عمل 4 مراحل میں مکمل کیا گیا تھا (RTX 2060 Super کے لیے یہاں اور ہر جگہ نمبر):

مرحلہ mAp75 پیرامیٹرز کی تعداد، ملین نیٹ ورک کا سائز، ایم بی ابتدائی سے، % رن ٹائم، MS ختنہ کی شرط
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 سب کا 5%
2 0.9625 50 197 83 168 سب کا 5%
3 0.9633 39 155 64 155 15% 400+ convolutions کے ساتھ تہوں کے لیے
4 0.9555 31 124 51 146 10% 100+ convolutions کے ساتھ تہوں کے لیے

ایک مثبت اثر مرحلہ 2 میں شامل کیا گیا - بیچ سائز 4 میموری میں فٹ، جس نے اضافی تربیت کے عمل کو بہت تیز کیا۔
مرحلہ 4 پر، عمل روک دیا گیا تھا کیونکہ یہاں تک کہ طویل مدتی اضافی تربیت نے mAp75 کو پرانی اقدار تک نہیں بڑھایا۔
نتیجے کے طور پر، ہم نے تخمینہ کو تیز کرنے میں کامیاب کیا 15٪کی طرف سے سائز کو کم کریں 35٪ اور بالکل نہیں کھونا۔

آسان فن تعمیر کے لیے آٹومیشن

آسان نیٹ ورک آرکیٹیکچرز کے لیے (بغیر مشروط اضافہ، کنکٹرنیٹ اور بقایا بلاکس)، یہ بہت ممکن ہے کہ تمام ارتعاشی تہوں کی پروسیسنگ پر توجہ مرکوز کی جائے اور کنوولوشن کو کاٹنے کے عمل کو خودکار بنایا جائے۔

میں نے اس اختیار کو نافذ کیا۔ یہاں.
یہ آسان ہے: آپ کو صرف نقصان کی تقریب، ایک اصلاح کار اور بیچ جنریٹرز کی ضرورت ہے:

import pruning
from keras.optimizers import Adam
from keras.utils import Sequence

train_batch_generator = BatchGenerator...
score_batch_generator = BatchGenerator...

opt = Adam(lr=1e-4)
pruner = pruning.Pruner("config.json", "categorical_crossentropy", opt)

pruner.prune(train_batch, valid_batch)

اگر ضروری ہو تو، آپ تشکیل کے پیرامیٹرز کو تبدیل کر سکتے ہیں:

{
    "input_model_path": "model.h5",
    "output_model_path": "model_pruned.h5",
    "finetuning_epochs": 10, # the number of epochs for train between pruning steps
    "stop_loss": 0.1, # loss for stopping process
    "pruning_percent_step": 0.05, # part of convs for delete on every pruning step
    "pruning_standart_deviation_part": 0.2 # shift for limit pruning part
}

مزید برآں، معیاری انحراف پر مبنی ایک حد نافذ کی جاتی ہے۔ مقصد اس حصے کو محدود کرنا ہے جسے ہٹا دیا گیا ہے، پہلے سے ہی "کافی" L1 اقدامات کے ساتھ convolutions کو چھوڑ کر:

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

اس طرح، ہم آپ کو اجازت دیتے ہیں کہ دائیں سے ملتی جلتی تقسیموں سے صرف کمزور کنوولوشنز کو ہٹا دیں اور بائیں سے ملتی جلتی تقسیم سے ہٹانے پر کوئی اثر نہ ڈالیں:

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

جب تقسیم معمول کے قریب آجاتی ہے، pruning_standart_deviation_part coefficient اس سے منتخب کیا جا سکتا ہے:

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی
میں 2 سگما کے مفروضے کی سفارش کرتا ہوں۔ یا آپ قدر <1.0 کو چھوڑ کر اس خصوصیت کو نظر انداز کر سکتے ہیں۔

آؤٹ پٹ پورے ٹیسٹ کے لیے نیٹ ورک کے سائز، نقصان، اور نیٹ ورک کے رن ٹائم کا ایک گراف ہے، جسے 1.0 پر معمول بنایا گیا ہے۔ مثال کے طور پر، یہاں نیٹ ورک کا سائز تقریباً 2 گنا کم کر دیا گیا ہے بغیر کوالٹی کے نقصان کے (100k وزن کے ساتھ چھوٹا convolutional نیٹ ورک):

convolutional نیٹ ورک کو کم کرنے کے لئے Jedi تکنیک - کٹائی

چلنے کی رفتار معمول کے اتار چڑھاو کے تابع ہے اور عملی طور پر کوئی تبدیلی نہیں کی جاتی ہے۔ اس کی ایک وضاحت ہے:

  1. convolutions کی تعداد آسان (32, 64, 128) سے بدل کر ویڈیو کارڈز کے لیے سب سے زیادہ آسان نہیں ہے - 27، 51، وغیرہ۔ میں یہاں غلط ہو سکتا ہوں، لیکن غالباً اس کا اثر ہے۔
  2. فن تعمیر وسیع نہیں ہے، لیکن مسلسل ہے. چوڑائی کو کم کرنے سے، ہم گہرائی کو متاثر نہیں کرتے ہیں۔ اس طرح، ہم بوجھ کو کم کرتے ہیں، لیکن رفتار کو تبدیل نہیں کرتے ہیں.

لہذا، رن کے دوران CUDA کے بوجھ میں 20-30% کی کمی میں بہتری ظاہر کی گئی، لیکن رن ٹائم میں کمی میں نہیں۔

کے نتائج

آئیے غور کریں۔ ہم نے کٹائی کے لیے 2 اختیارات پر غور کیا - YOLOv3 کے لیے (جب آپ کو اپنے ہاتھوں سے کام کرنا ہو) اور آسان فن تعمیر والے نیٹ ورکس کے لیے۔ یہ دیکھا جا سکتا ہے کہ دونوں صورتوں میں درستگی کے نقصان کے بغیر نیٹ ورک کے سائز میں کمی اور رفتار حاصل کرنا ممکن ہے۔ نتائج:

  • سائز کو کم کرنا
  • ایکسلریشن رن
  • CUDA لوڈ کو کم کرنا
  • نتیجے کے طور پر، ماحولیاتی دوستی (ہم کمپیوٹنگ وسائل کے مستقبل کے استعمال کو بہتر بناتے ہیں. کہیں کوئی خوش ہے گریٹا تھنبرگ)

معاہدہ

  • کٹائی کے مرحلے کے بعد، آپ کوانٹائزیشن شامل کر سکتے ہیں (مثال کے طور پر، TensorRT کے ساتھ)
  • Tensorflow کے لیے صلاحیتیں فراہم کرتا ہے۔ کم_میگنیٹیوڈ_کاٹنا. کام کرتا ہے۔
  • ذخیرہ میں ترقی کرنا چاہتا ہوں اور مدد کرنے میں خوشی محسوس کروں گا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں