تقليم النموذج والتباعد في YOLOv5
📚 يشرح هذا الدليل كيفية تطبيق التقليم على نماذج YOLOv5 🚀 لإنشاء شبكات أكثر كفاءة مع الحفاظ على الأداء.
ما هو تقليم النموذج (Model Pruning)؟
تقليم النموذج هو أسلوب يستخدم لتقليل حجم وتعقيد الشبكات العصبية عن طريق إزالة المعلمات الأقل أهمية (الأوزان والاتصالات). تخلق هذه العملية نموذجًا أكثر كفاءة مع العديد من الفوائد:
- تقليل حجم النموذج لتسهيل النشر على الأجهزة ذات الموارد المحدودة
- سرعات استدلال أسرع مع الحد الأدنى من التأثير على الدقة
- تقليل استخدام الذاكرة واستهلاك الطاقة
- تحسين الكفاءة الكلية للتطبيقات في الوقت الفعلي
يعمل التقليم عن طريق تحديد وإزالة المعلمات التي تساهم بأقل قدر ممكن في أداء النموذج، مما يؤدي إلى نموذج أخف وزنًا بدقة مماثلة.
قبل أن تبدأ
استنساخ المستودع وتثبيت 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/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/exp
تطبيق التقليم على YOLOv5x (كثافة 30%)
يمكننا تطبيق التقليم على النموذج باستخدام torch_utils.prune()
الأمر. لاختبار نموذج تم تقليمه، نقوم بتحديث 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 Actions قد اجتازت بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداء YOLOv5 عبر مختلف الجوانب الرئيسية: التدريب، التحقق، الاستدلال، التصدير، و المعايير. وهي تضمن تشغيلًا متسقًا وموثوقًا على أنظمة macOS و Windows و Ubuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل commit جديد.