YOLOv5'te Model Budama ve Seyreklik
Bu kılavuz, performansı korurken daha verimli ağlar oluşturmak için YOLOv5 modellerine budamanın nasıl uygulanacağını açıklar.
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 işlem, çeşitli avantajlar sunan daha verimli bir model oluşturur:
- Kaynakları kısıtlı cihazlarda daha kolay dağıtım için model boyutunun küçülmesi
- Doğruluk üzerindeki etkisi en aza inerken çıkarım hızının artması
- Bellek kullanımının ve enerji tüketiminin azalması
- Gerçek zamanlı uygulamalarda genel verimliliğin artması
Budama, model performansına çok az katkıda bulunan parametreleri belirleyip kaldırarak benzer doğruluğa sahip, daha hafif bir model elde edilmesini sağlar.
Başlamadan Önce#
Depoyu klonla ve Python>=3.8.0 ortamında requirements.txt dosyasındaki gereksinimleri, PyTorch>=1.8 dâhil olmak üzere yükle. Modeller ve veri kümeleri, en son YOLOv5 sürümünden otomatik olarak indirilir.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installTemel Performansı Test Et#
Budamadan önce karşılaştırmak için bir temel performans değeri belirle. Bu komut, YOLOv5x modelini COCO val2017 üzerinde 640 piksel görüntü boyutuyla test eder. yolov5x.pt, en büyük ve en yüksek doğruluğa sahip P5 modelidir. Diğer seçenekler daha küçük önceden eğitilmiş kontrol noktaları yolov5n.pt, yolov5s.pt, yolov5m.pt ve yolov5l.pt ya da özel bir veri kümesinde eğitiminden elde ettiğin kendi kontrol noktan (ör. runs/train/exp/weights/best.pt) olabilir.
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 Instances P R mAP50 mAP50-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/exp2YOLOv5x'e Budama Uygula (%30 Seyreklik)#
utils/torch_utils.py içinde tanımlanan prune() işlevini kullanarak modele budama uygulayabiliriz. Budanmış modeli test etmek için val.py değerini güncelleyerek YOLOv5x modeline 0.3 seyreklik (%30 sıfırlanmış ağırlık) uygularız:
%30 budama uygulanmış çı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 Instances P R mAP50 mAP50-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/exp3Sonuçların Analizi#
Sonuçlardan şunları gözlemleyebiliriz:
- %30 seyreklik elde edildi:
nn.Conv2dkatmanlarındaki model ağırlık parametrelerinin %30'u artık sıfır - Çıkarım süresi değişmedi: Budamaya rağmen işlem hızı temelde aynı kaldı
- Performans üzerindeki etki minimum düzeyde: mAP, 0.507'den 0.489'a hafifçe düştü (yalnızca %3.6 azalma)
- Model boyutu değişmedi: Sıfırlanan ağırlıklar yoğun biçimde saklanmaya devam eder; bu nedenle dosya boyutu yalnızca seyreklikten haberdar biçimler veya sıkıştırma kullanıldığında küçülür
Bu sonuç, doğruluk üzerinde yalnızca küçük bir etkiyle evrişim ağırlıklarının %30'unun kaldırılabileceğini gösterir. Bu seyrekliği daha hızlı çıkarıma veya daha küçük dosyalara dönüştürmek için seyrekliğin farkında olan bir çalışma zamanı, yapılandırılmış budama ya da sıkıştırma gerekir.
Budanmış Modellerde İnce Ayar#
En iyi sonuçlar için doğruluğu geri kazanmak amacıyla budanmış modeller budamadan sonra ince ayardan geçirilmelidir. Bunun için:
- İstenen seyreklik düzeyinde budama uygula
- Budanmış modeli birkaç epoch boyunca daha düşük bir öğrenme oranıyla eğitme
- İnce ayardan geçirilmiş budanmış modeli temel performansla karşılaştırarak değerlendir
Bu işlem, kalan parametrelerin kaldırılan bağlantıları telafi edecek şekilde uyum sağlamasına yardımcı olur ve çoğu zaman özgün doğruluğun büyük bölümünü veya tamamını geri kazandırır.
Desteklenen Ortamlar#
Ultralytics, projelerine hızlıca başlaman için CUDA, cuDNN, Python ve PyTorch gibi temel bağımlılıkların önceden yüklendiği, kullanıma hazır çeşitli ortamlar sunar.
- Ücretsiz GPU Not Defterleri:
- Google Cloud: GCP Hızlı Başlangıç Kılavuzu
- Amazon: AWS Hızlı Başlangıç Kılavuzu
- Azure: AzureML Hızlı Başlangıç Kılavuzu
- Docker: Docker Hızlı 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ğitim, doğrulama, çıkarım, dışa aktarma ve karşılaştırmalı testler gibi temel alanlarda titizlikle denetler. Testler her 24 saatte bir ve her yeni gönderimde gerçekleştirilerek macOS, Windows ve Ubuntu'da tutarlı ve güvenilir çalışma sağlanır.
Sık Sorulan Sorular#
Yapılandırılmamış budama ağırlıkları sıfırlar ancak tensör şekillerini değiştirmez; bu nedenle yoğun PyTorch çekirdekleri aynı miktarda işlem yapar. Hız kazanımı için DeepSparse gibi seyreklikten haberdar bir çalışma zamanı veya tüm kanalları kaldıran yapılandırılmış budama gerekir.
Doğrulama veya dışa aktarma işleminden önce
utils/torch_utils.pyiçindeki yardımcı işlevi çağır:from utils.torch_utils import prune prune(model, amount=0.3) # nn.Conv2d ağırlıklarında %30 genel seyreklik0.3 ile başla ve mAP değerini ölç. YOLOv5x, ince ayar yapılmadan %30 seyreklikte yaklaşık %3.6 mAP kaybetti; daha yüksek seyreklik düzeylerinde doğruluğu geri kazanmak için genellikle düşük öğrenme oranıyla birkaç dönem yeniden eğitim gerekir.
Evet. Sıfırlanan ağırlıklar diğer ağırlıklarla aynı şekilde kaydedilir; dolayısıyla
export.pydeğişiklik yapılmadan çalışır. Dosya boyutu yalnızca hedef biçim veya çalışma zamanı seyrek tensörleri sıkıştırırsa küçülür.
Yorumlar
Bir soru sor, sonuçlarını paylaş veya başka birine yardım et.