Meet YOLO26: next-gen vision AI.

Link to this sectionHuấ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.

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 modeltậ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 # install
Sử dụng Docker

Khuyến khích sử dụng Ultralytics Docker image cho tất cả các quy trình huấn luyện multi-GPU. Xem Hướng dẫn nhanh về Docker. Docker Pulls

PyTorch >= 1.9

torch.distributed.run thay thế cho torch.distributed.launch trong PyTorch >= 1.9. Xem tài liệu về phân tán của PyTorch để biết chi tiết.

Link to this sectionHuấn luyện#

Chọn một model đã được tiền huấn luyện để bắt đầu quá trình đào tạo. Tại đây, chúng tôi chọn YOLOv5s, một model nhỏ và nhanh. Xem bảng trong README của chúng tôi để so sánh đầy đủ tất cả các model. Chúng tôi sẽ huấn luyện model này với Multi-GPU trên tập dữ liệu COCO.

YOLOv5 Models

Link to this sectionGPU đơn#

python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0

Link to this sectionChế độ Multi-GPU DataParallel (⚠️ không khuyến khích)#

Truyền nhiều GPU ID vào --device để bật chế độ DataParallel:

python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1

DataParallel 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.

Link to this sectionChế độ Multi-GPU DistributedDataParallel (✅ khuyến khích)#

Thêm tiền tố vào lệnh huấn luyện với python -m torch.distributed.run --nproc_per_node, sau đó truyền các đối 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_node là số lượng GPU cần sử dụng. Trong ví dụ trên, nó là 2.
  • --batch là tổng kích thước batch, được chia đều cho mỗi GPU. Trong ví dụ trên, đó là 64 / 2 = 32 cho 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ị của thiết bị thông qua các biến môi trường thay vì cách trên, 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 GPU ID cụ thể. Ví dụ dưới đây 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,3
Use SyncBatchNorm (click to expand)

SyncBatchNorm có thể tăng độ chính xác cho huấn luyện multi-GPU, nhưng nó làm chậm quá trình huấn luyện đáng kể. Nó chỉ khả dụng cho huấn luyện multi-GPU DistributedDataParallel.

Sử dụng tốt nhất khi kích thước batch trên mỗi GPU nhỏ (<= 8).

Để bật SyncBatchNorm, 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-bn
Use 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ủ (máy mà các máy khác sẽ kết nối vào), ghi lại địa chỉ của nó (master_addr) và chọn một cổng (master_port). Ví dụ dưới đây sử dụng master_addr = 192.168.1.1master_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 mỗi máy, N là số lượng máy và R là thứ tự của máy trong 0...(N-1). Ví dụ, với hai máy và mỗi máy có hai GPU, thiết lập G = 2, N = 2R = 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ả N máy được kết nối. Kết quả chỉ hiển thị trên máy chủ (master).

Link to this sectionLưu ý#

  • Hỗ trợ cho Windows chưa được thử nghiệm; khuyến khích sử dụng Linux.

  • --batch phả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 gặp lỗi RuntimeError: Address already in use, điều đó thường có nghĩa là có nhiều phiên 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 ...

Link to this sectionKết quả#

Kết quả profiling DDP trên một 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 --runtime=nvidia --ipc=host --gpus 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-sizeCUDA_mem
device0 (G)
COCO
train
COCO
val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Như đã thấy 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 sử dụng một GPU đơn, trong khi vẫn duy trì mức sử dụng bộ nhớ trên mỗi thiết bị.

Link to this sectionCâ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ợ liệt kê dưới đây chưa?
  • Bạn đã thử với tập dữ liệu nhỏ hơn như coco128 hoặc coco2017 để 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.

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, PythonPyTorch, để khởi động dự án của bạn.

Link to this sectionTrạng thái Dự án#

YOLOv5 CI

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 modelbenchmarks. 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.

Link to this sectionGhi 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.

Link to this sectionXem thêm#

Bình luận