Bỏ để qua phần nội dung

Đa-GPU Đào tạo

📚 Hướng dẫn này giải thích cách sử dụng nhiều GPU đúng cách để đào tạo tập dữ liệu với YOLOv5 🚀 trên một hoặc nhiều máy.

Trước khi bắt đầu

Sao chép repo và cài đặt requirements.txt trong một PythonMôi trường >=3.8.0 , bao gồm PyTorch>=1,8. Mô hìnhbộ dữ liệu tải xuống tự động từ phiên bản mới nhất YOLOv5 phát hành.

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

💡 ProTip! Hình ảnh Docker được khuyến nghị cho tất cả Multi-GPU Đào tạo. Xem Hướng dẫn bắt đầu nhanh Docker Docker kéo

💡 ProTip! torch.distributed.run Thay thế torch.distributed.launch trong PyTorch>=1.9. Xem Documents để biết chi tiết.

Đào tạo

Chọn một mô hình được đào tạo trước để bắt đầu đào tạo. Ở đây chúng tôi chọn YOLOv5s, mô hình nhỏ nhất và nhanh nhất hiện có. Xem bảng README của chúng tôi để so sánh đầy đủ tất cả các mô hình. Chúng tôi sẽ đào tạo mô hình này với Multi-GPU trên bộ dữ liệu COCO .

YOLOv5 Mô hình

Đơn GPU

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

Bạn có thể tăng device để sử dụng Nhiều GPU ở chế độ DataParallel.

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

Phương pháp này chậm và hầu như không tăng tốc độ đào tạo so với chỉ sử dụng 1 GPU.

Bạn sẽ phải vượt qua python -m torch.distributed.run --nproc_per_node, tiếp theo là các lập luận 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 chỉ định số lượng GPU bạn muốn sử dụng. Trong ví dụ trên, nó là 2. --batch là tổng kích thước lô. Nó sẽ được chia đều cho mỗi GPU. Trong ví dụ trên, nó là 64/2 = 32 mỗi GPU.

Mã trên sẽ sử dụng GPU 0... (N-1).

Sử dụng GPU cụ thể (nhấp để mở rộng) Bạn có thể làm như vậy bằng cách chỉ cần chuyển '--device' theo sau là GPU cụ thể của bạn. Ví dụ: trong đoạn mã bên dưới, chúng tôi sẽ sử dụng 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
Sử dụng SyncBatchNorm (nhấp để mở rộng) [SyncBatchNorm](https://pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase [accuracy](https://www.ultralytics.com/glossary/accuracy) for multiple gpu training, however, it will slow down training by a significant factor. It is **only** available for Multiple GPU DistributedDataParallel training. It is best used when the batch-size on **each** GPU is small (<= 8). To use SyncBatchNorm, simple pass `--sync-bn` to the command like below,
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Sử dụng nhiều máy (nhấp để mở rộng) This is **only** available for Multiple GPU DistributedDataParallel training. Before we continue, make sure the files on all machines are the same, dataset, codebase, etc. Afterward, make sure the machines can communicate to each other. You will have to choose a master machine(the machine that the others will talk to). Note down its address(`master_addr`) and choose a port(`master_port`). I will use `master_addr = 192.168.1.1` and `master_port = 1234` for the example below. To use it, you can do as the following,
# 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 ''
where `G` is number of GPU per machine, `N` is the number of machines, and `R` is the machine number from `0...(N-1)`. Let's say I have two machines with two GPUs each, it would be `G = 2` , `N = 2`, and `R = 1` for the above. Training will not start until tất cả Máy 'N' được kết nối. Đầu ra sẽ chỉ được hiển thị trên máy chính!

Ghi chú

  • Hỗ trợ Windows chưa được kiểm tra, Linux được khuyến khích.
  • --batch phải là bội số của số GPU.
  • GPU 0 sẽ chiếm nhiều bộ nhớ hơn một chút so với các GPU khác vì nó duy trì EMA và chịu trách nhiệm kiểm tra, v.v.
  • Nếu bạn nhận được RuntimeError: Address already in use, có thể là do bạn đang chạy nhiều khóa đào tạo cùng một lúc. Để khắc phục điều này, chỉ cần sử dụng một số cổng khác bằng cách thêm --master_port như dưới đây,
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Kết quả

DDP profiling results on an AWS EC2 P4d instance with 8x A100 SXM4-40GB for YOLOv5l for 1 COCO epoch.

Mã hồ sơ
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --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
GPU
A100
Kích thước hàng loạtCUDA_Mem
thiết bị0 (G)
COCO
xe lửa
COCO
Val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

FAQ

Nếu xảy ra lỗi, vui lòng đọc danh sách kiểm tra bên dưới trước! (Nó có thể tiết kiệm thời gian của bạn)

Danh sách kiểm tra (nhấp để mở rộng)
  • Bạn đã đọc đúng bài đăng này chưa?
  • Bạn đã thử sao chép lại codebase chưa? Mã thay đổi hàng ngày.
  • Bạn đã cố gắng tìm kiếm lỗi của mình chưa? Ai đó có thể đã gặp phải nó trong repo này hoặc trong một repo khác và có giải pháp.
  • Bạn đã cài đặt tất cả các yêu cầu được liệt kê trên đầu trang (bao gồm cả chính xác Python và Pytorch phiên bản)?
  • Bạn đã thử trong các môi trường khác được liệt kê trong phần "Môi trường" bên dưới chưa?
  • Bạn đã thử với một tập dữ liệu khác như coco128 hoặc coco2017 chưa? Nó sẽ làm cho nó dễ dàng hơn để tìm ra nguyên nhân gốc rễ.
Nếu bạn đã xem qua tất cả những điều trên, vui lòng nêu ra Vấn đề bằng cách cung cấp càng nhiều chi tiết càng tốt theo mẫu.

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

Ultralytics Cung cấp một loạt các môi trường sẵn sàng sử dụng, mỗi môi trường được cài đặt sẵn với các phụ thuộc thiết yếu như CUDA, CUDNN,PythonPyTorch, để khởi động các dự án của bạn.

Tình trạng dự án

YOLOv5 CI

Huy hiệu này cho biết rằng tất cả YOLOv5 Các bài kiểm tra Tích hợp liên tục (CI) GitHub Actions đã 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 các khía cạnh chính khác nhau: đào tạo, xác nhận, suy luận, xuất khẩuđiểm chuẩn. 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 thử nghiệm được tiến hành 24 giờ một lần và theo mỗi cam kết mới.

Tín dụng

Chúng tôi muốn cảm ơn @MagicFrogSJTU, người đã làm tất cả các công việc nặng nhọc, và @glenn-jocher đã hướng dẫn chúng tôi trên đường đi.

📅 Được tạo ra cách đây 1 năm ✏️ Đã cập nhật cách đây 1 tháng

Ý kiến