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 # installTüm çoklu GPU eğitim çalıştırmaları için Ultralytics Docker image önerilir. Bkz. Docker Quickstart Guide.
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.

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,1DataParallel 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ğer2'dir.--batch, her bir GPU'ya eşit olarak bölünen toplam yığın boyutudur. Yukarıdaki örnekte bu, GPU başına64 / 2 = 32değ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,3Use 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-bnUse 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.
-
--batchGPU 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 usehatasını alıyorsan, bu genellikle birden fazla eğitim çalışmasının aynı bağlantı noktasını kullandığı anlamına gelir.--master_portile 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-size | CUDA_mem cihaz0 (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ö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.
- Ü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 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#
- Train Mode - Ultralytics ile YOLO modellerini eğitmeyi öğren
- Hyperparameter Tuning - Modelinin performansını optimize et
- Docker Quickstart Guide - Eğitim için Docker ortamını kur
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
coco128veyacoco2017gibi 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ç.