YOLOv5'te Model Budama ve Seyreklik
📚 Bu rehber, performansı korurken daha verimli ağlar oluşturmak için YOLOv5 🚀 modellerine nasıl budama (pruning) uygulayacağını açıklıyor.
Model Budama Nedir?
Model budama, daha az önemli parametreleri (ağırlıklar ve bağlantılar) kaldırarak sinir ağlarının boyutunu ve karmaşıklığını azaltmak için kullanılan bir tekniktir. Bu süreç, çeşitli avantajlara sahip daha verimli bir model oluşturur:
- Kaynak kısıtlı cihazlarda daha kolay dağıtım için azaltılmış model boyutu
- Doğruluk üzerinde minimum etki ile daha hızlı çıkarım hızları
- Daha düşük bellek kullanımı ve enerji tüketimi
- Gerçek zamanlı uygulamalar için genel verimlilik artışı
Budama, modelin performansına minimum katkıda bulunan parametreleri tanımlayıp kaldırarak çalışır ve benzer doğrulukta daha hafif bir model elde edilmesini sağlar.
Başlamadan Önce
Clone repo and install requirements.txt in a Python>=3.8.0 environment, including PyTorch>=1.8. Models and datasets download automatically from the latest YOLOv5 release.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installTemel Performansı Test Et
Budamadan önce, karşılaştırma yapmak için bir temel performans belirle. Bu komut, YOLOv5x'i COCO val2017 üzerinde 640 piksel görüntü boyutunda test eder. yolov5x.pt, mevcut en büyük ve en doğru modeldir. Diğer seçenekler yolov5s.pt, yolov5m.pt ve yolov5l.pt'dir veya özel bir veri kümesi eğiterek elde ettiğin kendi kontrol noktan olan ./weights/best.pt dosyasını kullanabilirsin. Tüm mevcut modeller hakkında ayrıntılar için README tablosuna bak.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --halfÇıktı:
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/expYOLOv5x'e Budama Uygula (%30 Seyreklik)
We can apply pruning to the model using the torch_utils.prune() command defined in utils/torch_utils.py. To test a pruned model, we update val.py to prune YOLOv5x to 0.3 sparsity (30% of weights set to zero):
%30 budanmış çıktı:
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-3Sonuç Analizi
Sonuçlardan şunları gözlemleyebiliriz:
- %30 seyreklik başarıldı:
nn.Conv2dkatmanlarındaki model ağırlık parametrelerinin %30'u artık sıfırdır - Çıkarım süresi değişmeden kaldı: Budamaya rağmen, işlem hızı temelde aynıdır
- Minimum performans etkisi: mAP, 0.507'den 0.489'a hafifçe düştü (yalnızca %3.6 düşüş)
- Model boyutu küçüldü: Budanmış model, depolama için daha az bellek gerektirir
Bu, budamanın performans üzerinde sadece küçük bir etkiyle model karmaşıklığını önemli ölçüde azaltabileceğini ve kaynak kısıtlı ortamlarda dağıtım için etkili bir optimizasyon tekniği olduğunu göstermektedir.
Budanmış Modellerin İnce Ayarı (Fine-tuning)
En iyi sonuçlar için, budanmış modeller doğruluk kaybını geri kazanmak adına budama işleminden sonra ince ayar yapılmalıdır. Bu şu şekilde yapılabilir:
- İstenen seyreklik seviyesiyle budama uygulamak
- Budanmış modeli daha düşük bir öğrenme oranıyla birkaç epoch boyunca eğitmek
- İnce ayar yapılmış budanmış modeli temele karşı değerlendirmek
Bu süreç, kalan parametrelerin kaldırılan bağlantıları telafi etmek için uyum sağlamasına yardımcı olur ve genellikle orijinal doğruluğun çoğunu veya tamamını geri kazandırır.
Desteklenen Ortamlar
Ultralytics, projelerine hızlı bir başlangıç yapman için CUDA, CUDNN, Python ve PyTorch gibi temel bağımlılıkların önceden yüklü olduğu, kullanıma hazır çeşitli ortamlar sunar.
- Ücretsiz GPU Not defterleri:
- Google Cloud: GCP Başlangıç Kılavuzu
- Amazon: AWS Başlangıç Kılavuzu
- Azure: AzureML Başlangıç Kılavuzu
- Docker: Docker Başlangıç Kılavuzu
Proje Durumu
Bu rozet, tüm YOLOv5 GitHub Actions Sürekli Entegrasyon (CI) testlerinin başarıyla geçtiğini gösterir. Bu CI testleri, YOLOv5'in işlevselliğini ve performansını çeşitli temel açılardan titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir bir çalışma sağlarlar; testler her 24 saatte bir ve her yeni commit'te gerçekleştirilir.