تقليم النموذج والندرة في YOLOv5#
📚 يشرح هذا الدليل كيفية تطبيق التقليم (pruning) على نماذج YOLOv5 🚀 لإنشاء شبكات أكثر كفاءة مع الحفاظ على الأداء.
ما هو تقليم النموذج؟#
يُعد تقليم النماذج تقنية تُستخدم لتقليل حجم التعصبات العصبية وتعقيدها عن طريق إزالة المعلمات الأقل أهمية (الأوزان والاتصالات). تُنشئ هذه العملية نموذجاً أكثر كفاءة مع عدة مزايا:
- تقليل حجم النموذج لتسهيل النشر على الأجهزة ذات الموارد المحدودة
- سرعات استدلال (inference) أسرع مع تأثير ضئيل على الدقة
- استهلاك أقل للذاكرة والطاقة
- تحسين الكفاءة العامة للتطبيقات في الوقت الفعلي
يعمل التقليم من خلال تحديد وإزالة المعلمات التي تساهم بأقل قدر في أداء النموذج، مما ينتج عنه نموذج أخف وزناً وبدقة مماثلة.
قبل البدء#
استنسخ المستودع وقم بتثبيت 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، أو نقطة التحقق الخاصة بك من تدريب مجموعة بيانات مخصصة ./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/exp-2/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/expتطبيق التقليم على YOLOv5x (ندرة بنسبة 30%)#
يمكننا تطبيق التقليم على النموذج باستخدام أمر torch_utils.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/exp-3/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/exp-3تحليل النتائج#
من النتائج، يمكننا ملاحظة ما يلي:
- تحقيق تشتت بنسبة 30%: أصبحت 30% من معلمات وزن النموذج في طبقات
nn.Conv2dالآن صفراً - وقت الاستدلال يظل دون تغيير: على الرغم من التقليم، فإن سرعة المعالجة هي نفسها تقريباً
- تأثير طفيف على الأداء: انخفض mAP قليلاً من 0.507 إلى 0.489 (انخفاض بنسبة 3.6% فقط)
- تقليل حجم النموذج: يتطلب النموذج المقلم ذاكرة أقل للتخزين
يوضح هذا أن التقليم يمكن أن يقلل بشكل كبير من تعقيد النموذج مع تأثير بسيط على الأداء، مما يجعله تقنية تحسين فعالة للنشر في البيئات ذات الموارد المحدودة.
ضبط النماذج المقلمة#
للحصول على أفضل النتائج، يجب ضبط النماذج المقلمة بعد التقليم لاستعادة الدقة. يمكن القيام بذلك عن طريق:
- تطبيق التقليم بمستوى ندرة مرغوب
- تدريب النموذج المقلم لبضع دورات (epochs) مع معدل تعلم أقل
- تقييم النموذج المقلم بعد الضبط مقابل الأداء الأساسي
تساعد هذه العملية المعلمات المتبقية على التكيف للتعويض عن الاتصالات التي تمت إزالتها، مما يؤدي غالباً إلى استعادة معظم أو كل الدقة الأصلية.
البيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقاً بالتبعيات الأساسية مثل CUDA، وCUDNN، وPython، وPyTorch، لبدء مشاريعك بسرعة.
- دفاتر ملاحظات مجانية لوحدات معالجة الرسومات:
- Google Cloud: GCP Quickstart Guide
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: Docker Quickstart Guide
حالة المشروع#
تشير هذه الشارة إلى أن جميع اختبارات التكامل المستمر (CI) لـ YOLOv5 GitHub Actions تمر بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداء YOLOv5 عبر جوانب رئيسية مختلفة: training، وvalidation، وinference، وexport، وbenchmarks. وهي تضمن تشغيلاً متسقاً وموثوقاً على أنظمة macOS وWindows وUbuntu، مع إجراء اختبارات كل 24 ساعة ومع كل عملية commit جديدة.