Huấn luyện Multi-GPU với YOLOv5#
Hướng dẫn này giải thích cách huấn luyện YOLOv5 với nhiều GPU trên một máy đơn hoặc trên nhiều máy.
Trướ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. Models và datasets sẽ được tải xuống tự động từ release YOLOv5 mới nhất.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installUltralytics Docker image được khuyên dùng cho mọi quá trình huấn luyện đa GPU. Xem Docker Quickstart Guide.
torch.distributed.run thay thế torch.distributed.launch trong PyTorch >= 1.9. Xem PyTorch distributed documentation để biết thêm chi tiết.
Huấn luyện#
Chọn một model đã được huấn luyện trước để bắt đầu huấn luyện. Ở đây chúng ta chọn YOLOv5s, một model nhỏ và nhanh. Xem table trong README để so sánh đầy đủ tất cả các model. Chúng ta sẽ huấn luyện model này với Đa GPU trên tập dữ liệu COCO.

GPU đơn#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0Chế độ đa GPU DataParallel (⚠️ không khuyên dùng)#
Truyền nhiều ID GPU vào --device để bật chế độ DataParallel:
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1DataParallel chậm và gần như không tăng tốc độ huấn luyện so với việc sử dụng một GPU đơn.
Chế độ đa GPU DistributedDataParallel (✅ khuyên dùng)#
Thêm python -m torch.distributed.run --nproc_per_node vào trước lệnh huấn luyện, sau đó truyền các tham số thông thường:
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1--nproc_per_nodelà số lượng GPU cần sử dụng. Trong ví dụ trên, đây là2.--batchlà tổng batch size, được chia đều cho mỗi GPU. Trong ví dụ trên, đó là64 / 2 = 32cho mỗi GPU.
Lệnh trên sử dụng các GPU 0...(N-1). Để kiểm soát khả năng hiển thị thiết bị thông qua các biến môi trường thay thế, hãy thiết lập CUDA_VISIBLE_DEVICES=2,3 (hoặc bất kỳ danh sách nào khác) trước khi chạy.
Use specific GPUs (click to expand)
Truyền --device theo sau là các ID GPU cụ thể. Ví dụ bên dưới sử dụng các GPU 2,3.
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3Use SyncBatchNorm (click to expand)
SyncBatchNorm có thể làm tăng accuracy cho quá trình huấn luyện đa GPU, nhưng nó làm chậm quá trình huấn luyện đáng kể. Tính năng này chỉ khả dụng cho huấn luyện DistributedDataParallel đa GPU.
Sử dụng tốt nhất khi batch size trên mỗi GPU nhỏ (<= 8).
Để bật SyncBatchNorm, hãy truyền --sync-bn:
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bnUse Multiple machines (click to expand)
Tính năng này chỉ khả dụng cho huấn luyện multi-GPU DistributedDataParallel.
Trước khi tiếp tục, hãy đảm bảo rằng tập dữ liệu, codebase và bất kỳ phụ thuộc nào khác đều khớp trên tất cả các máy, sau đó xác minh rằng các máy có thể kết nối với nhau qua mạng.
Chọn một máy chính (máy mà các máy khác sẽ kết nối tới), ghi lại địa chỉ của máy đó (master_addr), và chọn một cổng (master_port). Ví dụ bên dưới sử dụng master_addr = 192.168.1.1 và master_port = 1234.
Sau đó chạy:
# On master machine 0
python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank 0 --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''# On machine R
python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank R --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''trong đó G là số lượng GPU trên mỗi máy, N là số lượng máy, và R là thứ hạng máy trong 0...(N-1). Ví dụ, với hai máy và mỗi máy có hai GPU, hãy thiết lập G = 2, N = 2, và R = 1 trên máy thứ hai.
Quá trình huấn luyện không bắt đầu cho đến khi tất cả các máy N được kết nối. Đầu ra chỉ hiển thị trên máy chính.
Lưu ý#
-
Hỗ trợ cho Windows chưa được thử nghiệm; khuyến khích sử dụng Linux.
-
--batchphải là bội số của số lượng GPU. -
GPU 0 sử dụng nhiều bộ nhớ hơn một chút so với các GPU khác vì nó duy trì EMA và xử lý checkpointing.
-
Nếu bạn nhận được
RuntimeError: Address already in use, điều đó thường có nghĩa là có nhiều tiến trình huấn luyện đang sử dụng cùng một cổng. Hãy chỉ định một cổng khác bằng--master_port:python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
Kết quả#
Kết quả profiling DDP trên AWS EC2 P4d instance với 8x A100 SXM4-40GB cho YOLOv5l trong 1 epoch COCO.
Profiling code
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --ipc=host --device nvidia.com/gpu=all -v "$(pwd)"/coco:/usr/src/coco $t
pip3 install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
cd .. && rm -rf app && git clone https://github.com/ultralytics/yolov5 -b master app && cd app
cp data/coco.yaml data/coco_profile.yaml
# profile
python train.py --batch-size 16 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0
python -m torch.distributed.run --nproc_per_node 2 train.py --batch-size 32 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1
python -m torch.distributed.run --nproc_per_node 4 train.py --batch-size 64 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1,2,3
python -m torch.distributed.run --nproc_per_node 8 train.py --batch-size 128 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1,2,3,4,5,6,7| GPUs A100 | batch-size | CUDA_mem device0 (G) | COCO train | COCO val |
|---|---|---|---|---|
| 1x | 16 | 26GB | 20:39 | 0:55 |
| 2x | 32 | 26GB | 11:43 | 0:57 |
| 4x | 64 | 26GB | 5:57 | 0:55 |
| 8x | 128 | 26GB | 3:09 | 0:57 |
Như đã hiển thị trong kết quả, việc sử dụng DistributedDataParallel với nhiều GPU mang lại khả năng mở rộng tốc độ huấn luyện gần như tuyến tính. Với 8 GPU, quá trình huấn luyện hoàn thành nhanh hơn khoảng 6,5 lần so với việc sử dụng một GPU duy nhất, trong khi vẫn duy trì mức sử dụng bộ nhớ trên mỗi thiết bị.
Các Môi trường được Hỗ trợ#
Ultralytics cung cấp nhiều loại 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 các dự án của bạn.
- Free GPU Notebooks:
- Google Cloud: GCP Quickstart Guide
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- Docker: Docker Quickstart Guide
Trạ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 đã vượt qua thành công. Các bài kiểm tra CI này kiểm tra một cách nghiêm ngặt chức năng và hiệu suất của YOLOv5 qua nhiều khía cạnh quan trọng: training, validation, inference, export và benchmarks. Chúng đảm bảo hoạt động ổn định 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 cứ sau 24 giờ và trên mỗi commit mới.
Ghi nhận#
Chúng tôi xin cảm ơn @MagicFrogSJTU, người đã thực hiện công việc khó khăn nhất, và @glenn-jocher vì đã dẫn dắt chúng tôi trong suốt quá trình này.
Xem thêm#
- Train Mode - Tìm hiểu về cách huấn luyện các model YOLO với Ultralytics
- Hyperparameter Tuning - Tối ưu hóa hiệu suất của model bạn
- Docker Quickstart Guide - Thiết lập môi trường Docker của bạn để huấn luyện
Câu hỏi thường gặp#
Đọc danh sách kiểm tra dưới đây trước khi mở một Issue — nó thường giúp tiết kiệm thời gian.
Checklist (click to expand)
- Bạn đã đọc hướng dẫn này từ đầu đến cuối chưa?
- Bạn đã clone lại codebase chưa? Code thay đổi hàng ngày.
- Bạn đã tìm kiếm thông báo lỗi chưa? Có thể ai đó đã gặp cùng vấn đề này và chia sẻ giải pháp.
- Bạn đã cài đặt tất cả các yêu cầu (bao gồm phiên bản Python và PyTorch chính xác) chưa?
- Bạn đã thử một trong các môi trường được hỗ trợ được liệt kê ở trên chưa?
- Bạn đã thử một tập dữ liệu nhỏ hơn như
coco128hoặccoco2017để cô lập nguyên nhân gốc rễ chưa?
Nếu tất cả những điều trên đều ổn, hãy mở một Issue với đầy đủ chi tiết nhất có thể, theo đúng mẫu.