YOLO Vision 2026:

YOLOv5 ile Çoklu GPU Eğitimi#

Bu kılavuz, tek bir makinede veya birden çok makine arasında birden fazla GPU ile YOLOv5 eğitiminin nasıl yapılacağını açıklar.

Başlamadan Önce#

Depoyu klonla ve Python>=3.8.0 ortamında, PyTorch>=1.8 dahil olmak üzere requirements.txt dosyasını yükle. Modeller ve veri kümeleri, en güncel 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ılavuzu sayfasına bak. Docker Pulls

PyTorch >= 1.9

torch.distributed.run, PyTorch >= 1.9 sürümünde torch.distributed.launch yerine geçer. Ayrıntılar için PyTorch dağıtık 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 dosyamızdaki tabloya 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

Çoklu GPU DataParallel Modu (⚠️ önerilmez)#

DataParallel modunu etkinleştirmek için --device seçeneğine birden çok GPU kimliği aktar:

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.

Çoklu GPU DistributedDataParallel Modu (✅ önerilir)#

Eğitim komutunun başına python -m torch.distributed.run --nproc_per_node ekle, ardından normal bağımsız değişkenleri aktar:

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

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

Use specific GPUs (click to expand)

--device seçeneğini belirli GPU kimlikleriyle takip ederek aktar. 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
Use SyncBatchNorm (click to expand)

SyncBatchNorm, çoklu GPU eğitiminde doğruluğu artırabilir, ancak eğitimi önemli ölçüde yavaşlatır. Bu özellik yalnızca çoklu GPU DistributedDataParallel eğitimi için kullanılabilir.

GPU başına batch boyutu küçük olduğunda (<= 8) kullanılması en uygunudur.

SyncBatchNorm'u etkinleştirmek için --sync-bn seçeneğini aktar:

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 ö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 bütün makinelerde aynı olduğundan 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ı (master_port) belirle. 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ı, N makine sayısını ve R, 0...(N-1) içindeki makine sırasını belirtir. Örneğin, iki makine ve her birinde iki GPU varsa ikinci makinede G = 2, N = 2 ve R = 1 değerlerini ayarla.

Tüm N makinesi bağlanana kadar eğitim başlamaz. Çıktı yalnızca ana makinede gösterilir.

Notlar#

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

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

  • GPU 0, EMA'yı koruduğu ve kontrol noktası kaydetme işlemini gerçekleştirdiği için diğerlerinden biraz daha fazla bellek kullanır.

  • RuntimeError: Address already in use hatasını alırsan bu genellikle birden çok eğitim çalıştırmasının aynı bağlantı noktasını kullandığı anlamına gelir. --master_port ile farklı bir bağlantı noktası belirt:

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

Sonuçlar#

1 COCO epoch'u için 8x A100 SXM4-40GB içeren bir AWS EC2 P4d örneğinde DDP profil oluşturma sonuçları.

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'lar
A100
batch-sizeCUDA_mem
device0 (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, birden çok GPU ile DistributedDataParallel kullanmak eğitim hızında neredeyse doğrusal ölçekleme sağlar. 8 GPU ile eğitim, tek GPU'ya kıyasla yaklaşık 6,5 kat daha hızlı tamamlanırken cihaz başına bellek kullanımı aynı kalır.

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üklendiği, 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 çeşitli önemli alanlardaki işlevselliğini ve performansını titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve karşılaştırmalı testler. Testler her 24 saatte bir ve her yeni işleme sonrasında yürütülerek macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir çalışmayı güvence altına alır.

Teşekkürler#

Tüm zor işi yapan @MagicFrogSJTU'ya ve süreç boyunca bize rehberlik eden @glenn-jocher'a teşekkür ederiz.

Ayrıca bakınız#

SSS#

Bir sorun bildirmeden önce aşağıdaki kontrol listesini oku — bu 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 her gün değişir.
  • Hata mesajını aradın mı? Başka biri 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?
  • Yukarıda listelenen desteklenen ortamlardan birini denedin mi?
  • Temel nedeni izole etmek için coco128 veya coco2017 gibi daha küçük bir veri kümesini denedin mi?

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

Yorumlar