YOLO Vision 2026:

YOLOv5 ile Çoklu GPU Eğitimi#

Bu rehber, YOLOv5'i tek bir makinede veya birden fazla makine üzerinde birden çok GPU ile nasıl eğiteceğini açıklar.

Başlamadan Önce#

Depoyu klonla ve Python>=3.8.0 ortamında requirements.txt dosyasını PyTorch>=1.8 dahil olacak şekilde yükle. Modeller ve veri setleri 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 image önerilir. Bkz. Docker Quickstart Guide. 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 distributed documentation sayfasına 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 tam karşılaştırması için README tablomuza göz at. Bu modeli COCO veri seti ü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 ifadesine birden fazla GPU ID'si aktar:

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

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

Çoklu GPU DistributedDataParallel Modu (✅ önerilir)#

Eğitim komutunun önüne python -m torch.distributed.run --nproc_per_node ekle, ardından olağan argümanları ilet:

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

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

Use specific GPUs (click to expand)

--device ifadesini ve ardından belirli GPU ID'lerini ilet. 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ğ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.

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

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

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 mevcuttur.

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 ulaşabildiğini doğrula.

Ana bir makine seç (diğerlerinin bağlanacağı makine), adresini not et (master_addr) ve bir bağlantı noktası belirle (master_port). Aşağıdaki örnekte master_addr = 192.168.1.1 ve master_port = 1234 kullanılmaktadır.

Ardından ç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, 0...(N-1) içindeki makine sırasıdır. Örneğin, her birinde iki GPU bulunan iki makine için, ikinci makinede G = 2, N = 2 ve R = 1 ayarla.

Tüm N makineler 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 bir katı olmalıdır.

  • GPU 0, EMA'yı koruduğu ve kontrol noktası işlemlerini yönettiği için diğerlerinden biraz daha fazla bellek kullanır.

  • RuntimeError: Address already in use hatasını alıyorsan, bu genellikle birden fazla eğitim çalışması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#

8x A100 SXM4-40GB donanımlı bir AWS EC2 P4d instance üzerinde YOLOv5l için 1 COCO epoch süresince gerçekleştirilen 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
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, birden fazla GPU ile DistributedDataParallel kullanmak, eğitim hızında neredeyse doğrusal bir ölçeklendirme sağlar. 8 GPU ile eğitim, cihaz başına aynı bellek kullanımını korurken tek bir GPU'ya göre yaklaşık 6,5 kat daha hızlı tamamlanır.

Desteklenen Ortamlar#

Ultralytics, projelerinizi hızlandırmak için CUDA, CUDNN, Python ve PyTorch gibi temel bağımlılıklarla önceden yüklenmiş bir dizi kullanıma hazır ortam sunar.

Proje Durumu#

YOLOv5 CI

Bu rozet, tüm YOLOv5 GitHub Actions Continuous Integration (CI) testlerinin başarıyla geçtiğini gösterir. Bu CI testleri, YOLOv5'in işlevselliğini ve performansını çeşitli temel yönlerden titizlikle kontrol eder: training, validation, inference, export ve benchmarks. Her 24 saatte bir ve her yeni commit ile gerçekleştirilen testlerle macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir bir çalışma sağlarlar.

Katkıda Bulunanlar#

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

Ayrıca Bakınız#

SSS#

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

Checklist (click to expand)
  • Bu rehberi baştan sona okudun mu?
  • Kod tabanını yeniden kopyaladın mı? Kod günlük olarak değişir.
  • Hata mesajını arattı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 yalıtmak için coco128 veya coco2017 gibi daha küçük bir veri seti denedin mi?

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

Katkıda Bulunanlar

Yorumlar