YOLOv5 ile Çoklu GPU Eğitimi
Bu kılavuz, YOLOv5'i tek bir makinede veya birden fazla makinede birden fazla GPU ile nasıl eğiteceğini açıklar.
Başlamadan Önce
Clone repo and install requirements.txt in a Python>=3.8.0 environment, including PyTorch>=1.8. Models and datasets download automatically from the latest YOLOv5 release.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installUltralytics Docker image tüm çoklu GPU eğitimleri için önerilir. Docker Başlangıç Kılavuzuna bak.
torch.distributed.run replaces torch.distributed.launch in PyTorch >= 1.9. See the PyTorch distributed documentation for details.
Eğitim
Eğitime başlamak için önceden eğitilmiş bir model seç. Burada, mevcut en küçük ve en hızlı model olan YOLOv5s modelini seçiyoruz. Tüm modellerin tam karşılaştırması için README tablomuz kısmına bak. Bu modeli COCO veri kümesi ü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 parametresine 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 kullanımına kıyasla eğitimi neredeyse hiç hızlandırmaz.
Çoklu GPU DistributedDataParallel Modu (✅ önerilen)
Eğitim komutunun başına python -m torch.distributed.run --nproc_per_node ekle ve ardından normal argümanları belirt:
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 sayı2'dir.--batchtoplam toplu iş boyutudur ve her GPU'ya eşit olarak bölünür. Yukarıdaki örnekte bu, GPU başına64 / 2 = 32demektir.
Yukarıdaki komut 0...(N-1) GPU'larını kullanır. Cihaz görünürlüğünü ortam değişkenleri ile kontrol etmek istersen, başlatmadan önce CUDA_VISIBLE_DEVICES=2,3 (veya başka bir liste) ayarla.
Use specific GPUs (click to expand)
--device ifadesinden sonra spesifik GPU kimliklerini geçir. Aşağıdaki örnek 2,3 GPU'larını kullanı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.
En iyi, her GPU'daki toplu iş boyutu küçük (<= 8) olduğunda kullanılır.
SyncBatchNorm'u etkinleştirmek için --sync-bn parametresini geçir:
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 sadece ç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 tüm makinelerde eşleştiğinden emin ol, ardından makinelerin ağ üzerinde birbirine erişebildiğini doğrula.
Bir ana makine seç (diğerlerinin bağlanacağı makine), adresini (master_addr) not et ve bir port (master_port) belirle. Aşağıdaki örnek master_addr = 192.168.1.1 ve master_port = 1234 kullanı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 düşen GPU sayısı, N makine sayısı ve R ise 0...(N-1) arasındaki makine sırasıdır. Örneğin, her birinde iki GPU olan iki makine ile G = 2, N = 2 ayarla ve ikinci makinede R = 1 değerini kullan.
Eğitim, tüm N makine bağlanana kadar başlamaz. Çıktı sadece ana makinede gösterilir.
Notlar
-
Windows desteği test edilmemiştir; Linux önerilir.
-
--batchsayısı, GPU sayısının bir katı olmalıdır. -
GPU 0, EMA'yı tuttuğu ve kontrol noktalarını (checkpointing) yönettiği için diğerlerinden biraz daha fazla bellek kullanır.
-
Eğer
RuntimeError: Address already in usehatası alırsan, bu genellikle birden fazla eğitim çalıştırmasının aynı portu kullandığı anlamına gelir.--master_portile farklı bir port belirle:python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
Results
DDP profiling results on an AWS EC2 P4d instance with 8x A100 SXM4-40GB for YOLOv5l for 1 COCO epoch.
Profiling code
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --runtime=nvidia --ipc=host --gpus 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 | toplu iş boyutu | CUDA_bellek 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, çoklu GPU ile DistributedDataParallel kullanımı, eğitim hızında neredeyse doğrusal bir ölçeklendirme sağlar. 8 GPU ile, cihaz başına aynı bellek kullanımını korurken, eğitim tek bir GPU'ya kıyasla yaklaşık 6,5 kat daha hızlı tamamlanır.
SSS
Bir sorun (issue) açmadan önce aşağıdaki kontrol listesini oku — 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 günlük olarak değişir.
- Hata mesajını arattın mı? Başkası 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?
- Aşağıda listelenen desteklenen ortamlardan birini denedin mi?
- Kök nedeni izole etmek için
coco128veyacoco2017gibi daha küçük bir veri kümesi denedin mi?
Yukarıdakilerin tümü kontrol edildiyse, şablonu takip ederek mümkün olduğunca çok ayrıntıyla bir Sorun (Issue) aç.
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üklü olduğu, kullanıma hazır çeşitli ortamlar sunar.
- Ücretsiz GPU Not defterleri:
- Google Cloud: GCP Başlangıç Kılavuzu
- Amazon: AWS Başlangıç Kılavuzu
- Azure: AzureML Başlangıç Kılavuzu
- Docker: Docker 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şitli temel açılardan titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir bir çalışma sağlarlar; testler her 24 saatte bir ve her yeni commit'te gerçekleştirilir.
Katkıda Bulunanlar
Tüm zorlu işleri yapan @MagicFrogSJTU'ya ve yol boyunca bize rehberlik eden @glenn-jocher'a teşekkür ederiz.
Ayrıca Bakınız
- Eğitim Modu - Ultralytics ile YOLO modellerini eğitme hakkında bilgi edin
- Hiperparametre Ayarı - Modelinin performansını optimize et
- Docker Başlangıç Kılavuzu - Eğitim için Docker ortamını hazırla