YOLOv5 ile Çoklu GPU Eğitimi

Bu kılavuz, YOLOv5'i tek bir makinede veya birden fazla makinede birden fazla GPU ile nasıl eğiteceğini açıklar.

Başlamadan Önce

Clone repo and install requirements.txt in a Python>=3.8.0 environment, including PyTorch>=1.8. Models and datasets download automatically from the latest YOLOv5 release.

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

Ultralytics Docker image tüm çoklu GPU eğitimleri için önerilir. Docker Başlangıç Kılavuzuna bak. Docker Pulls

PyTorch >= 1.9

torch.distributed.run replaces torch.distributed.launch in PyTorch >= 1.9. See the PyTorch distributed documentation for details.

Eğitim

Eğitime başlamak için önceden eğitilmiş bir model seç. Burada, mevcut en küçük ve en hızlı model olan YOLOv5s modelini seçiyoruz. Tüm modellerin tam karşılaştırması için README tablomuz kısmına bak. Bu modeli COCO veri kümesi üzerinde Çoklu GPU ile eğiteceğiz.

YOLOv5 Models

Tek GPU

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

Çoklu GPU DataParallel Modu (⚠️ önerilmez)

DataParallel modunu etkinleştirmek için --device parametresine birden fazla GPU kimliği geçir:

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

DataParallel yavaştır ve tek GPU kullanımına kıyasla eğitimi neredeyse hiç hızlandırmaz.

Çoklu GPU DistributedDataParallel Modu (✅ önerilen)

Eğitim komutunun başına python -m torch.distributed.run --nproc_per_node ekle ve ardından normal argümanları belirt:

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, kullanılacak GPU sayısıdır. Yukarıdaki örnekte bu sayı 2'dir.
  • --batch toplam toplu iş boyutudur ve her GPU'ya eşit olarak bölünür. Yukarıdaki örnekte bu, GPU başına 64 / 2 = 32 demektir.

Yukarıdaki komut 0...(N-1) GPU'larını kullanır. Cihaz görünürlüğünü ortam değişkenleri ile kontrol etmek istersen, başlatmadan önce CUDA_VISIBLE_DEVICES=2,3 (veya başka bir liste) ayarla.

Use specific GPUs (click to expand)

--device ifadesinden sonra spesifik GPU kimliklerini geçir. Aşağıdaki örnek 2,3 GPU'larını kullanır.

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, çoklu GPU eğitimi için doğruluğu artırabilir, ancak eğitimi önemli ölçüde yavaşlatır. Yalnızca çoklu GPU DistributedDataParallel eğitimi için kullanılabilir.

En iyi, her GPU'daki toplu iş boyutu küçük (<= 8) olduğunda kullanılır.

SyncBatchNorm'u etkinleştirmek için --sync-bn parametresini geçir:

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)

Bu sadece çoklu GPU DistributedDataParallel eğitimi için kullanılabilir.

Devam etmeden önce veri kümesinin, kod tabanının ve diğer tüm bağımlılıkların tüm makinelerde eşleştiğinden emin ol, ardından makinelerin ağ üzerinde birbirine erişebildiğini doğrula.

Bir ana makine seç (diğerlerinin bağlanacağı makine), adresini (master_addr) not et ve bir port (master_port) belirle. Aşağıdaki örnek master_addr = 192.168.1.1 ve master_port = 1234 kullanır.

Ardından şunu çalıştır:

# 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 ''

Burada G makine başına düşen GPU sayısı, N makine sayısı ve R ise 0...(N-1) arasındaki makine sırasıdır. Örneğin, her birinde iki GPU olan iki makine ile G = 2, N = 2 ayarla ve ikinci makinede R = 1 değerini kullan.

Eğitim, tüm N makine bağlanana kadar başlamaz. Çıktı sadece ana makinede gösterilir.

Notlar

  • Windows desteği test edilmemiştir; Linux önerilir.

  • --batch sayısı, GPU sayısının bir katı olmalıdır.

  • GPU 0, EMA'yı tuttuğu ve kontrol noktalarını (checkpointing) yönettiği için diğerlerinden biraz daha fazla bellek kullanır.

  • Eğer RuntimeError: Address already in use hatası alırsan, bu genellikle birden fazla eğitim çalıştırmasının aynı portu kullandığı anlamına gelir. --master_port ile farklı bir port belirle:

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

Results

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

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
GPU'lar
A100
toplu iş boyutuCUDA_bellek
cihaz0 (G)
COCO
eğitim
COCO
doğrulama
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Sonuçlarda gösterildiği gibi, çoklu GPU ile DistributedDataParallel kullanımı, eğitim hızında neredeyse doğrusal bir ölçeklendirme sağlar. 8 GPU ile, cihaz başına aynı bellek kullanımını korurken, eğitim tek bir GPU'ya kıyasla yaklaşık 6,5 kat daha hızlı tamamlanır.

SSS

Bir sorun (issue) açmadan önce aşağıdaki kontrol listesini oku — genellikle zaman kazandırır.

Checklist (click to expand)
  • Bu kılavuzu baştan sona okudun mu?
  • Kod tabanını yeniden klonladın mı? Kod günlük olarak değişir.
  • Hata mesajını arattın mı? Başkası aynı sorunla karşılaşmış ve bir çözüm paylaşmış olabilir.
  • Tüm gereksinimleri (doğru Python ve PyTorch sürümleri dahil) yükledin mi?
  • Aşağıda listelenen desteklenen ortamlardan birini denedin mi?
  • Kök nedeni izole etmek için coco128 veya coco2017 gibi daha küçük bir veri kümesi denedin mi?

Yukarıdakilerin tümü kontrol edildiyse, şablonu takip ederek mümkün olduğunca çok ayrıntıyla bir Sorun (Issue) aç.

Desteklenen Ortamlar

Ultralytics, projelerine hızlı bir başlangıç yapman için CUDA, CUDNN, Python ve PyTorch gibi temel bağımlılıkların önceden yüklü olduğu, kullanıma hazır çeşitli ortamlar sunar.

Proje Durumu

YOLOv5 CI

Bu rozet, tüm YOLOv5 GitHub Actions Sürekli Entegrasyon (CI) testlerinin başarıyla geçtiğini gösterir. Bu CI testleri, YOLOv5'in işlevselliğini ve performansını çeşitli temel açılardan titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir bir çalışma sağlarlar; testler her 24 saatte bir ve her yeni commit'te gerçekleştirilir.

Katkıda Bulunanlar

Tüm zorlu işleri yapan @MagicFrogSJTU'ya ve yol boyunca bize rehberlik eden @glenn-jocher'a teşekkür ederiz.

Ayrıca Bakınız

Yorumlar