Link to this sectionCắt tỉa mô hình (Model Pruning) và Độ thưa (Sparsity) trong YOLOv5#
📚 Hướng dẫn này giải thích cách áp dụng pruning cho các mô hình YOLOv5 🚀 để tạo ra các mạng hiệu quả hơn trong khi vẫn duy trì hiệu suất.
Link to this sectionCắt tỉa mô hình là gì?#
Model pruning là một kỹ thuật được sử dụng để giảm kích thước và độ phức tạp của các mạng thần kinh bằng cách loại bỏ các tham số (trọng số và kết nối) ít quan trọng hơn. Quá trình này tạo ra một mô hình hiệu quả hơn với nhiều lợi ích:
- Giảm kích thước mô hình để triển khai dễ dàng hơn trên các thiết bị bị hạn chế về tài nguyên
- Tốc độ suy luận (inference) nhanh hơn với tác động tối thiểu đến độ chính xác
- Sử dụng bộ nhớ và tiêu thụ năng lượng thấp hơn
- Cải thiện hiệu quả tổng thể cho các ứng dụng thời gian thực
Pruning hoạt động bằng cách xác định và loại bỏ các tham số đóng góp tối thiểu vào hiệu suất của mô hình, dẫn đến một mô hình nhẹ hơn với độ chính xác tương đương.
Link to this sectionTrước khi Bắt đầu#
Sao chép repo và cài đặt requirements.txt trong môi trường Python>=3.8.0, bao gồm PyTorch>=1.8. Các model và tập dữ liệu sẽ tự động tải xuống từ bản phát hành YOLOv5 mới nhất.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installLink to this sectionKiểm tra hiệu suất cơ sở#
Trước khi thực hiện pruning, hãy thiết lập hiệu suất cơ sở để so sánh. Lệnh này kiểm tra YOLOv5x trên COCO val2017 ở kích thước ảnh 640 pixel. yolov5x.pt là mô hình lớn nhất và chính xác nhất hiện có. Các tùy chọn khác là yolov5s.pt, yolov5m.pt và yolov5l.pt, hoặc checkpoint riêng của bạn từ quá trình huấn luyện bộ dữ liệu tùy chỉnh ./weights/best.pt. Để biết chi tiết về tất cả các mô hình có sẵn, hãy xem bảng trong README.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --halfĐầu ra:
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/expLink to this sectionÁp dụng Pruning cho YOLOv5x (Độ thưa 30%)#
Chúng ta có thể áp dụng pruning cho mô hình bằng lệnh torch_utils.prune() được định nghĩa trong utils/torch_utils.py. Để kiểm tra mô hình đã được prune, chúng ta cập nhật val.py để prune YOLOv5x với độ thưa 0.3 (30% trọng số được đặt về 0):
Kết quả sau khi pruning 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-3Link to this sectionPhân tích kết quả#
Từ kết quả, chúng ta có thể quan sát thấy:
- Đạt độ thưa 30%: 30% tham số trọng số của mô hình trong các lớp
nn.Conv2dhiện đã bằng không - Thời gian suy luận không đổi: Mặc dù đã prune, tốc độ xử lý về cơ bản vẫn giữ nguyên
- Tác động hiệu suất tối thiểu: mAP giảm nhẹ từ 0.507 xuống 0.489 (chỉ giảm 3.6%)
- Giảm kích thước mô hình: Mô hình đã prune yêu cầu ít bộ nhớ hơn để lưu trữ
Điều này chứng minh rằng pruning có thể làm giảm đáng kể độ phức tạp của mô hình với tác động không đáng kể đến hiệu suất, khiến nó trở thành một kỹ thuật tối ưu hóa hiệu quả để triển khai trong các môi trường hạn chế về tài nguyên.
Link to this sectionTinh chỉnh (Fine-tuning) các mô hình đã Prune#
Để có kết quả tốt nhất, các mô hình đã prune nên được tinh chỉnh sau khi thực hiện pruning để khôi phục độ chính xác. Điều này có thể được thực hiện bằng cách:
- Áp dụng pruning với mức độ thưa mong muốn
- Huấn luyện mô hình đã prune trong một vài epoch với tốc độ học (learning rate) thấp hơn
- Đánh giá mô hình đã tinh chỉnh so với hiệu suất cơ sở
Quá trình này giúp các tham số còn lại thích nghi để bù đắp cho các kết nối đã bị loại bỏ, thường khôi phục lại hầu hết hoặc toàn bộ độ chính xác ban đầu.
Link to this sectionCác Môi trường được Hỗ trợ#
Ultralytics cung cấp hàng loạt môi trường sẵn sàng sử dụng, mỗi môi trường được cài đặt sẵn các phụ thuộc thiết yếu như CUDA, CUDNN, Python và PyTorch, để khởi động dự án của bạn.
- Free GPU Notebooks:
- Google Cloud: Hướng dẫn bắt đầu nhanh GCP
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- Docker: Docker Quickstart Guide
Link to this sectionTrạng thái Dự án#
Huy hiệu này cho biết tất cả các bài kiểm tra Tích hợp liên tục (CI) của YOLOv5 GitHub Actions đều đã vượt qua thành công. Các bài kiểm tra CI này kiểm tra nghiêm ngặt chức năng và hiệu suất của YOLOv5 trên nhiều khía cạnh chính: huấn luyện, xác thực, suy luận, xuất model và benchmarks. Chúng đảm bảo hoạt động nhất quán và đáng tin cậy trên macOS, Windows và Ubuntu, với các bài kiểm tra được thực hiện mỗi 24 giờ và sau mỗi commit mới.