Pruning del modello e sparsità in YOLOv5
📚 Questa guida spiega come applicare il pruning ai modelli YOLOv5 🚀 per creare reti più efficienti mantenendo le prestazioni.
Che cos'è il Model Pruning?
Il model pruning è una tecnica utilizzata per ridurre le dimensioni e la complessità delle reti neurali rimuovendo i parametri meno importanti (pesi e connessioni). Questo processo crea un modello più efficiente con diversi vantaggi:
- Dimensioni ridotte del modello per facilitare l'implementazione su dispositivi con risorse limitate
- Velocità di inferenza più elevate con un impatto minimo sull'accuratezza
- Riduzione dell'utilizzo della memoria e del consumo energetico
- Miglioramento dell'efficienza complessiva per le applicazioni in tempo reale
Il pruning funziona identificando e rimuovendo i parametri che contribuiscono minimamente alle prestazioni del modello, ottenendo un modello più leggero con un'accuratezza simile.
Prima di iniziare
Clonare il repo e installare il file requirements.txt in un file Python>=3.8.0 con l'inclusione di PyTorch>=1.8. I modelli e i dataset vengono scaricati automaticamente dall'ultimarelease di YOLOv5 .
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Prestazioni di base del test
Prima di procedere alla potatura, stabilire una prestazione di base con cui confrontarsi. Questo comando testa YOLOv5x su COCO val2017 con immagini di 640 pixel. yolov5x.pt
è il modello più grande e preciso disponibile. Altre opzioni sono yolov5s.pt
, yolov5m.pt
e yolov5l.pt
o il proprio checkpoint dall'addestramento di un set di dati personalizzato. ./weights/best.pt
. Per informazioni dettagliate su tutti i modelli disponibili, consultare il file README. tavolo.
Uscita:
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_hybrid=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
Applicare la potatura a YOLOv5x (30% di spaziosità)
Si può applicare il pruning al modello utilizzando il metodo torch_utils.prune()
comando. Per testare un modello tagliato, aggiorniamo val.py
per ridurre YOLOv5x a una sparsità di 0,3 (30% dei pesi impostati a zero):
30% di potatura:
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_hybrid=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
Analisi dei risultati
Dai risultati si può osservare che:
- 30% di sparsità raggiunta: 30% dei parametri di peso del modello in
nn.Conv2d
gli strati sono ora pari a zero - Il tempo di inferenza rimane invariato: Nonostante il pruning, la velocità di elaborazione è essenzialmente la stessa.
- Impatto minimo sulle prestazioni: mAP è sceso leggermente da 0,507 a 0,489 (riduzione del 3,6%).
- Riduzione delle dimensioni del modello: Il modello ridotto richiede meno memoria per l'archiviazione.
Questo dimostra che il pruning può ridurre significativamente la complessità del modello con un impatto minimo sulle prestazioni, rendendolo una tecnica di ottimizzazione efficace per l'impiego in ambienti con risorse limitate.
Messa a punto dei modelli potati
Per ottenere risultati ottimali, i modelli potati devono essere messi a punto dopo la potatura per recuperare l'accuratezza. Questo può essere fatto da:
- Applicazione del pruning con un livello di sparsità desiderato
- Addestramento del modello potato per alcune epoche con un tasso di apprendimento inferiore
- Valutazione del modello potato e perfezionato rispetto alla linea di base
Questo processo aiuta i parametri rimanenti ad adattarsi per compensare le connessioni rimosse, spesso recuperando la maggior parte o la totalità dell'accuratezza originale.
Ambienti supportati
Ultralytics fornisce una serie di ambienti pronti all'uso, ognuno dei quali è preinstallato con le dipendenze essenziali quali CUDA, CUDNN, Python, e PyTorchper avviare i vostri progetti.
- Taccuini gratuiti GPU:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida AWS
- Azure: Guida rapida ad AzureML
- Docker: Guida rapida a Docker
Stato del progetto
Questo badge indica che tutti i test di Continuous Integration (CI) di YOLOv5 GitHub Actions sono stati superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in vari aspetti chiave: formazione, validazione, inferenza, esportazione e benchmark. Assicurano un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e su ogni nuovo commit.