YOLO Vision 2026:

Đào tạo đa GPU với YOLOv5#

Hướng dẫn này giải thích cách đào tạo YOLOv5 bằng nhiều GPU trên một máy 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. Modeldataset sẽ tự động được 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

Bạn nên sử dụng Ultralytics Docker image cho tất cả các lần chạy training multi-GPU. Xem Docker Quickstart Guide. Docker Pulls

PyTorch >= 1.9

torch.distributed.run thay thế torch.distributed.launch trong PyTorch >= 1.9. Xem tài liệu PyTorch về distributed để biết thêm chi tiết.

Training#

Chọn một model pretrained để bắt đầu quá trình đào tạo. Ở đây, chúng ta 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 ta sẽ đào tạo model này với đa GPU trên dataset COCO.

YOLOv5 Models

Một GPU#

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

Chế độ đa GPU DataParallel (⚠️ không khuyến nghị)#

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

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

DataParallel chạy chậm và hầu như không tăng tốc quá trình đào tạo so với việc sử dụng một GPU.

Chế độ đa GPU DistributedDataParallel (✅ khuyến nghị)#

Thêm tiền tố python -m torch.distributed.run --nproc_per_node vào lệnh đào tạo, 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ố GPU cần sử dụng. Trong ví dụ trên, giá trị này là 2.
  • --batch là tổng batch size, được chia đều cho từng GPU. Trong ví dụ trên, mỗi GPU có 64 / 2 = 32.

Lệnh trên sử dụng các GPU 0...(N-1). Thay vào đó, để kiểm soát khả năng hiển thị của device thông qua các biến môi trường, hãy đặt CUDA_VISIBLE_DEVICES=2,3 (hoặc bất kỳ danh sách nào khác) trước khi khởi chạy.

Use specific GPUs (click to expand)

Truyền --device theo sau là các ID GPU 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 khi đào tạo đa GPU, nhưng làm quá trình đào tạo chậm đi đáng kể. Tính năng này chỉ khả dụng cho đào tạo đa GPU bằng DistributedDataParallel.

Phù hợp nhất khi batch size 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 đào tạo đa GPU bằng DistributedDataParallel.

Trước khi tiếp tục, hãy đảm bảo dataset, codebase và mọi dependency khác nhất quán 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 network.

Chọn một máy master (máy mà các máy khác sẽ kết nối đến), ghi lại địa chỉ của máy đó (master_addr) và chọn một port (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ố GPU trên mỗi máy, N là số máy, còn R là rank của máy trong 0...(N-1). Ví dụ, với hai máy và mỗi máy có hai GPU, hãy đặt G = 2, N = 2R = 1 trên máy thứ hai.

Quá trình đào tạo sẽ không bắt đầu cho đến khi tất cả N máy được kết nối. Output chỉ được hiển thị trên máy master.

Ghi chú#

  • Chưa kiểm thử khả năng hỗ trợ Windows; khuyến nghị sử dụng Linux.

  • --batch phải là bội số của số GPU.

  • GPU 0 sử dụng nhiều memory hơn một chút so với các GPU khác vì GPU này duy trì EMA và xử lý việc checkpoint.

  • Nếu bạn gặp RuntimeError: Address already in use, nguyên nhân thường là nhiều lần chạy đào tạo đang sử dụng cùng một port. Chỉ định port 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 instance AWS EC2 P4d 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
GPU
A100
batch-sizeCUDA_mem
device0 (G)
COCO
train
COCO
val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Như kết quả cho thấy, sử dụng DistributedDataParallel với nhiều GPU mang lại khả năng mở rộng gần tuyến tính về tốc độ đào tạo. Với 8 GPU, quá trình đào tạo hoàn tất nhanh hơn khoảng 6,5 lần so với một GPU, đồng thời duy trì cùng mức sử dụng memory trên mỗi device.

Môi trường được hỗ trợ#

Ultralytics cung cấp nhiều 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 dependency thiết yếu như CUDA, CUDNN, PythonPyTorch, giúp bạn nhanh chóng bắt đầu các project.

Trạng thái dự án#

YOLOv5 CI

Huy hiệu này cho biết tất cả các bài kiểm thử GitHub Actions của YOLOv5 về Tích hợp liên tục (CI) đều đã vượt qua thành công. Các bài kiểm thử CI này kiểm tra nghiêm ngặt chức năng và hiệu năng của YOLOv5 trên nhiều khía cạnh quan trọng: huấn luyện, validation, suy luận, exportbenchmark. 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 thử được thực hiện mỗi 24 giờ và sau mỗi commit mới.

Ghi nhận#

Chúng tôi xin cảm ơn @MagicFrogSJTU, người đã đảm nhiệm phần lớn công việc, và @glenn-jocher vì đã hướng dẫn chúng tôi trong suốt quá trình.

Xem thêm#

FAQ#

Hãy đọc checklist bên dưới trước khi mở issue — việc này thường giúp tiết kiệm thời gian.

Checklist (click to expand)
  • Bạn đã đọc toàn bộ hướng dẫn này 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 vấn đề tương tự và chia sẻ cách khắc phục.
  • Bạn đã cài đặt tất cả requirement chưa (bao gồm đúng phiên bản Python và PyTorch)?
  • Bạn đã thử một trong các môi trường được hỗ trợ liệt kê ở trên chưa?
  • Bạn đã thử một dataset nhỏ hơn như coco128 hoặc coco2017 để cô lập nguyên nhân gốc chưa?

Nếu tất cả các mục trên đều đã được kiểm tra, hãy mở một Issue với nhiều thông tin chi tiết nhất có thể và làm theo template.

Bình luận