تقليم النماذج والتخلخل في YOLOv5#
📚 يشرح هذا الدليل كيفية تطبيق التقليم على نماذج YOLOv5 🚀 لإنشاء شبكات أكثر كفاءة مع الحفاظ على الأداء.
ما تقليم النماذج؟#
تقليم النماذج تقنية تُستخدم لتقليل حجم الشبكات العصبية وتعقيدها عبر إزالة المعاملات الأقل أهمية (الأوزان والوصلات). وتنتج عن هذه العملية نماذج أكثر كفاءة تحقق عدة فوائد:
- تقليل حجم النموذج لتسهيل نشره على الأجهزة محدودة الموارد
- زيادة سرعة الاستدلال بأدنى تأثير في الدقة
- خفض استخدام الذاكرة واستهلاك الطاقة
- تحسين الكفاءة الإجمالية للتطبيقات الفورية
يعمل التقليم على تحديد المعاملات التي لا تسهم إلا قليلًا في أداء النموذج وإزالتها، ما ينتج نموذجًا أخف وزنًا بدقة مماثلة.
قبل البدء#
استنسخ المستودع وثبّت requirements.txt في بيئة Python>=3.8.0، بما في ذلك PyTorch>=1.8. تُنزّل النماذج ومجموعات البيانات تلقائيًا من إصدار YOLOv5 الأحدث.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installاختبار الأداء الأساسي#
قبل التقليم، حدّد أداءً أساسيًا للمقارنة به. يختبر هذا الأمر YOLOv5x على COCO val2017 بحجم صورة يبلغ 640 بكسلًا. يُعد yolov5x.pt أكبر النماذج المتاحة وأكثرها دقة. وتشمل الخيارات الأخرى yolov5s.pt وyolov5m.pt وyolov5l.pt، أو نقطة التحقق الخاصة بك الناتجة عن تدريب مجموعة بيانات مخصصة، أي runs/train/exp/weights/best.pt. للاطلاع على تفاصيل جميع النماذج المتاحة، انظر الجدول في README.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --halfالمخرجات:
val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)
Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [01:12<00:00, 2.16it/s]
all 5000 36335 0.732 0.628 0.683 0.496
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640) # <--- base speed
Evaluating pycocotools mAP... saving runs/val/exp2/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.507 # <--- base mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.689
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.552
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.345
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.381
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.630
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.682
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.731
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.829
Results saved to runs/val/exp2تطبيق التقليم على YOLOv5x (تخلخل بنسبة 30%)#
يمكننا تطبيق التقليم على النموذج باستخدام الدالة prune() المحددة في utils/torch_utils.py. لاختبار نموذج مُقلَّم، نحدّث val.py لتقليم YOLOv5x إلى تخلخل بقيمة 0.3 (أي ضبط 30% من الأوزان على الصفر):
مخرجات التقليم بنسبة 30%:
val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)
Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
Pruning model... 0.3 global sparsity
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [01:11<00:00, 2.19it/s]
all 5000 36335 0.724 0.614 0.671 0.478
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640) # <--- prune speed
Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.489 # <--- prune mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.677
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.537
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.334
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.542
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.635
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.370
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.612
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.664
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.496
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.722
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.803
Results saved to runs/val/exp3تحليل النتائج#
يمكننا ملاحظة ما يلي من النتائج:
- تحقق تخلخل بنسبة 30%: أصبحت 30% من معاملات أوزان النموذج في طبقات
nn.Conv2dتساوي صفرًا الآن - لم يتغير زمن الاستدلال: على الرغم من التقليم، بقيت سرعة المعالجة كما هي تقريبًا
- تأثير محدود في الأداء: انخفض mAP قليلًا من 0.507 إلى 0.489 (أي بتراجع قدره 3.6% فقط)
- لم يتغير حجم النموذج: لا تزال الأوزان التي ضُبطت على الصفر مخزنة بكثافة، لذا لا يتقلص حجم الملف إلا باستخدام صيغ تراعي التخلخل أو الضغط
يوضح ذلك أن التقليم يمكن أن يقلل تعقيد النموذج بدرجة كبيرة مع تأثير طفيف في الأداء، ما يجعله تقنية تحسين فعالة للنشر في البيئات محدودة الموارد.
الضبط الدقيق للنماذج المُقلَّمة#
للحصول على أفضل النتائج، ينبغي إجراء ضبط دقيق للنماذج المُقلَّمة بعد التقليم لاستعادة الدقة. ويمكن تنفيذ ذلك على النحو التالي:
- تطبيق التقليم بمستوى التخلخل المطلوب
- تدريب النموذج المُقلَّم لبضع حقب بمعدل تعلم أقل
- تقييم النموذج المُقلَّم بعد الضبط الدقيق ومقارنته بالأداء الأساسي
تساعد هذه العملية المعاملات المتبقية على التكيف لتعويض الوصلات التي أُزيلت، وغالبًا ما تستعيد معظم الدقة الأصلية أو كلها.
البيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقًا به التبعيات الأساسية مثل CUDA وCUDNN وPython وPyTorch، لتتمكن من بدء مشاريعك.
- دفاتر GPU مجانية:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع#
تشير هذه الشارة إلى اجتياز جميع اختبارات التكامل المستمر (CI) الخاصة بـ إجراءات YOLOv5 على GitHub بنجاح. وتتحقق اختبارات CI بدقة من وظائف YOLOv5 وأدائه في جوانب رئيسية متعددة: التدريب والتحقق والاستدلال والتصدير واختبارات الأداء. وهي تضمن التشغيل المتسق والموثوق على macOS وWindows وUbuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل إيداع جديد.
الأسئلة الشائعة#
يضبط التقليم غير المنظم الأوزان على الصفر لكنه يُبقي أشكال الموترات دون تغيير، لذا تنفّذ نوى PyTorch الكثيفة المقدار نفسه من العمل. ويتطلب تسريع التنفيذ بيئة تشغيل تراعي التخلخل، مثل DeepSparse، أو تقليمًا منظمًا يزيل قنوات كاملة.
استدعِ الدالة المساعدة من
utils/torch_utils.pyقبل التحقق أو التصدير:from utils.torch_utils import prune prune(model, amount=0.3) # تخلخل عام بنسبة 30% لأوزان nn.Conv2dابدأ بقيمة 0.3 وقِس mAP. فقد YOLOv5x نحو 3.6% من mAP عند تخلخل بنسبة 30% من دون ضبط دقيق؛ وعادةً ما تتطلب مستويات التخلخل الأعلى بضع حقب من إعادة التدريب بمعدل تعلم منخفض لاستعادة الدقة.
نعم. تُحفَظ الأوزان المضبوطة على الصفر كغيرها، لذا يعمل
export.pyدون تغيير. ولا يتقلص حجم الملف إلا إذا ضغطت الصيغة المستهدفة أو بيئة التشغيل الموترات المتخلخلة.