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 # installTüm çoklu GPU eğitim çalıştırmaları için Ultralytics Docker imajı önerilir. Docker Hızlı Başlangıç Kılavuzuna bak.
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.

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 komutuna birden fazla GPU kimliği geçir:
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1DataParallel 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 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ğer2.--batch, her GPU'ya eşit olarak bölünen toplam yığın boyutudur. Yukarıdaki örnekte GPU başına değer64 / 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,3SyncBatchNorm 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-bnBirden 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 usehatasını alırsan bunun nedeni genellikle birden fazla eğitim çalıştırmasının aynı bağlantı noktasını kullanmasıdır.--master_portile 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-boyutu | CUDA_belleği aygıt0 (G) | COCO eğitim | COCO doğrulama |
|---|---|---|---|---|
| 1x | 16 | 26GB | 20:39 | 0:55 |
| 2x | 32 | 26GB | 11:43 | 0:57 |
| 4x | 64 | 26GB | 5:57 | 0:55 |
| 8x | 128 | 26GB | 3:09 | 0: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.
- Ücretsiz GPU Not Defterleri:
- Google Cloud: GCP Hızlı Başlangıç Kılavuzu
- Amazon: AWS Hızlı Başlangıç Kılavuzu
- Azure: AzureML Hızlı Başlangıç Kılavuzu
- Docker: Docker Hızlı Başlangıç Kılavuzu
Proje Durumu#
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#
- Eğitim Modu - Ultralytics ile YOLO modellerini eğitmeyi öğren
- Hiperparametre Ayarlama - Modelinin performansını optimize et
- Docker Hızlı Başlangıç Kılavuzu - Eğitim için Docker ortamını kur
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
coco128veyacoco2017gibi 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ç.