Chuyển đến nội dung

Huấn luyện Multi-GPU với YOLOv5

Hướng dẫn này giải thích cách sử dụng đúng cách nhiều GPU để huấn luyện một bộ 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 kho lưu trữ và cài đặt requirements.txt trong môi trường Python>=3.8.0, bao gồm PyTorch>=1.8. Mô hìnhbộ dữ liệu được tải xuống tự động từ phiên 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

Mẹo chuyên nghiệp!

Docker Image được khuyến nghị cho tất cả các quá trình huấn luyện Multi-GPU. Xem Hướng dẫn Bắt đầu Nhanh DockerLượt Pull Docker

Mẹo chuyên nghiệp!

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

Huấn luyện

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

Các mô hình YOLOv5

Single 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 quá trình huấn luyện so với việc chỉ sử dụng 1 GPU.

Bạn sẽ phải chuyển python -m torch.distributed.run --nproc_per_node, sau đó là 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 chỉ định số lượng GPU bạn muốn sử dụng. Trong ví dụ trên, con số này là 2.
  • --batch là tổng kích thước lô (batch-size). Nó sẽ được chia đều cho mỗi GPU. Trong ví dụ trên, con số này là 64/2=32 trên mỗi GPU.

Đoạn mã trên sẽ sử dụng GPU 0... (N-1). Bạn cũng có thể thiết lập CUDA_VISIBLE_DEVICES=2,3 (hoặc bất kỳ danh sách nào khác) trước khi khởi chạy lệnh nếu bạn muốn 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.

Sử dụng GPU cụ thể (nhấp để mở rộng) Bạn có thể thực hiện việc này bằng cách truyền `--device` theo sau là các GPU cụ thể của bạn. Ví dụ: trong đoạn mã dưới đây, chúng ta sẽ 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
Sử dụng SyncBatchNorm (nhấp để mở rộng) [SyncBatchNorm](https://docs.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, simply 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) Tính năng này **chỉ** khả dụng cho Nhiều GPU Đào tạo DistributedDataParallel. Trước khi tiếp tục, hãy đảm bảo các tệp trên tất cả các máy đều giống nhau, chẳng hạn như tập dữ liệu, cơ sở mã, v.v. Sau đó, hãy đảm bảo các máy có thể giao tiếp với nhau. Bạn sẽ phải chọn một máy chủ (máy mà các máy khác sẽ giao tiếp). Ghi lại địa chỉ của máy chủ (`master_addr`) và chọn một cổng (`master_port`). Tôi sẽ sử dụng `master_addr = 192.168.1.1` và `master_port = 1234` cho ví dụ bên dưới. Để sử dụng, bạn có thể làm như sau:
# 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, và `R` là số máy từ `0...(N-1)`. Giả sử tôi có hai máy, mỗi máy có hai GPU, thì `G = 2`, `N = 2` và `R = 1` sẽ là các giá trị trên. Quá trình huấn luyện sẽ không bắt đầu cho đến khi **tất cả** `N` máy được kết nối. Đầu ra sẽ chỉ được hiển thị trên máy chủ!

Ghi chú

  • Hỗ trợ Windows chưa được kiểm tra, nên dùng Linux.
  • --batch phải là một bội số của số lượng 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 gặp phải RuntimeError: Address already in use, có thể là do bạn đang chạy nhiều quá trình huấn luyện 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ư bên dưới:

    python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
    

Results

Kết quả lập hồ sơ DDP trên một AWS EC2 P4d instance với 8x A100 SXM4-40GB cho YOLOv5l cho 1 epoch COCO.

Mã lập hồ sơ
# 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
GPU
A100
batch-sizeCUDA_mem
device0 (G)
COCO
train
COCO
val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Như được hiển thị trong kết quả, việc sử dụng DistributedDataParallel với nhiều GPU cung cấp khả năng mở rộng gần như tuyến tính về tốc độ huấn luyện. 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 một GPU duy nhất, đồng thời duy trì mức sử dụng bộ nhớ trên mỗi thiết bị như nhau.

Câu hỏi thường gặp

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ể giúp bạn tiết kiệm thời gian)

Danh sách kiểm tra (nhấp để mở rộng) - Bạn đã đọc kỹ bài viết này chưa? - Bạn đã thử sao chép lại cơ sở mã chưa? Mã thay đổi **hàng ngày**. - Bạn đã thử tìm kiếm lỗi của mình chưa? Có thể ai đó đã gặp lỗi này trong kho lưu trữ này hoặc kho lưu trữ 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 (bao gồm 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? Việc này sẽ giúp tìm ra nguyên nhân gốc rễ dễ dàng hơn. Nếu bạn đã thực hiện tất cả các bước trên, hãy thoải mái nêu 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 các phần phụ thuộc thiết yếu như CUDA, CUDNN, PythonPyTorch, để khởi động các dự án của bạn.

Trạng thái dự án

YOLOv5 CI

Huy hiệu này cho biết rằng tất cả các thử nghiệm Tích hợp Liên tục (CI) YOLOv5 GitHub Actions đều vượt qua thành công. Các thử nghiệm 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đ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 thực hiện sau mỗi 24 giờ và sau mỗi cam kết mới.

Nguồn tham khảo

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

Xem Thêm



📅 Được tạo ra cách đây 2 năm ✏️ Cập nhật cách đây 5 ngày
glenn-jocherUltralyticsAssistantonuralpszrLaughing-qRizwanMunawarBurhan-Q

Bình luận