Ultralytics YOLO27:
Get Started

YOLOv5 ile Çoklu GPU Eğitimi#

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

Başlamadan Önce#

Depoyu klonla ve Python>=3.8.0 ortamında PyTorch>=1.8 dahil olmak üzere requirements.txt dosyasındaki gereksinimleri yükle. Modeller ve veri kümeleri, en son YOLOv5 sürümünden otomatik olarak indirilir.

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

Tüm çoklu GPU eğitim çalıştırmaları için Ultralytics Docker imajı önerilir. Docker Hızlı Başlangıç Kılavuzuna bak. Docker Pulls

PyTorch >= 1.9

torch.distributed.run, PyTorch >= 1.9 sürümünde torch.distributed.launch yerine kullanılır. Ayrıntılar için PyTorch dağıtık eğitim belgelerine bak.

Eğitim#

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

YOLOv5 Models

Tek GPU#

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

DataParallel modunu etkinleştirmek için --device komutuna 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 kullanmaya kıyasla eğitimi neredeyse hiç hızlandırmaz.

Eğitim komutunun başına python -m torch.distributed.run --nproc_per_node ekle, ardından olağan argümanları geçir:

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 değer 2.
  • --batch, her GPU'ya eşit olarak bölünen toplam yığın boyutudur. Yukarıdaki örnekte GPU başına değer 64 / 2 = 32.

Yukarıdaki komut 0...(N-1) GPU'larını kullanır. Bunun yerine ortam değişkenleri üzerinden hangi aygıtların görünür olacağını denetlemek için başlatmadan önce CUDA_VISIBLE_DEVICES=2,3 (veya başka bir liste) ayarla.

Belirli GPU'ları kullan (genişletmek için tıkla)

--device komutunu ve ardından belirli GPU kimliklerini geçir. Aşağıdaki örnekte 2,3 GPU'ları kullanılır.

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3
SyncBatchNorm kullan (genişletmek için tıkla)

SyncBatchNorm, çoklu GPU eğitiminde 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.

Her GPU'daki yığın boyutu küçük olduğunda (<= 8) en iyi sonucu verir.

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

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Birden fazla makine kullan (genişletmek için tıkla)

Bu özellik yalnızca ç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 makineler arasında eşleştiğinden emin ol; ardından makinelerin ağ üzerinden birbirine erişebildiğini doğrula.

Bir ana makine seç (diğer makinelerin bağlanacağı makine), adresini (master_addr) not et ve bir bağlantı noktası belirle (master_port). Aşağıdaki örnekte master_addr = 192.168.1.1 ve master_port = 1234 kullanılı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 GPU sayısı, N makine sayısı ve R, 0...(N-1) içindeki makine sırasıdır. Örneğin, her birinde iki GPU bulunan iki makineyle çalışırken ikinci makinede G = 2, N = 2 ve R = 1 değerlerini ayarla.

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

Notlar#

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

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

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

  • RuntimeError: Address already in use hatasını alırsan bunun nedeni genellikle birden fazla eğitim çalıştırmasının aynı bağlantı noktasını kullanmasıdır. --master_port ile farklı bir bağlantı noktası belirt:

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

Sonuçlar#

YOLOv5l için 1 COCO epoch boyunca 8x A100 SXM4-40GB bulunan bir AWS EC2 P4d instance'ında elde edilen DDP profilleme sonuçları.

Kodu profilleme
# 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'lar
A100
yığın-boyutuCUDA_belleği
aygıt0 (G)
COCO
eğitim
COCO
doğrulama
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Sonuçlarda görüldüğü gibi, birden fazla GPU ile DistributedDataParallel kullanmak, eğitim hızını neredeyse doğrusal olarak artırır. 8 GPU ile eğitim, aygıt başına aynı bellek kullanımını korurken tek GPU'ya kıyasla yaklaşık 6,5 kat daha hızlı tamamlanır.

Desteklenen Ortamlar#

Ultralytics, projelerine hızlıca başlaman için CUDA, CUDNN, Python ve PyTorch gibi temel bağımlılıkların önceden yüklü olduğu çeşitli kullanıma hazır 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ğitim, doğrulama, çıkarım, dışa aktarma ve karşılaştırmalı testler gibi temel alanlarda titizlikle denetler. Testler her 24 saatte bir ve her yeni gönderimde gerçekleştirilerek macOS, Windows ve Ubuntu'da tutarlı ve güvenilir çalışma sağlanır.

Teşekkürler#

Tüm yoğun çalışmaları üstlenen @MagicFrogSJTU'ya ve bu süreçte bize yol gösteren @glenn-jocher'a teşekkür ederiz.

Ayrıca Bakın#

Sık Sorulan Sorular#

Bir sorun bildirmeden önce aşağıdaki kontrol listesini oku — bu genellikle zaman kazandırır.

Kontrol listesi (genişletmek için tıkla)
  • Bu kılavuzun tamamını baştan sona okudun mu?
  • Kod tabanını yeniden klonladın mı? Kod her gün değişiyor.
  • Hata mesajını aradın mı? Başka biri aynı sorunla karşılaşmış ve çözüm paylaşmış olabilir.
  • Doğru Python ve PyTorch sürümleri dahil tüm gereksinimleri yükledin mi?
  • Yukarıda listelenen desteklenen ortamlardan birini denedin mi?
  • Temel nedeni belirlemek için coco128 veya coco2017 gibi standart bir veri kümesini denedin mi?

Yukarıdakilerin tümü uygunsa şablonu izleyerek mümkün olduğunca fazla ayrıntı içeren bir Issue aç.

Yorumlar