İçeriğe geç

YOLOv5 ile Çoklu-GPU Eğitimi

Bu kılavuz, tek veya birden fazla makinede YOLOv5 🚀 ile bir veri kümesini eğitmek için birden çok GPU'nun nasıl doğru şekilde kullanılacağını açıklamaktadır.

Başlamadan Önce

requirements.txt'i bir Python>=3.8.0 ortamında, PyTorch>=1.8 dahil olmak üzere klonlayın ve kurun. 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 # install

Profesyonel İpucu!

Docker İmajı tüm Çoklu-GPU eğitimleri için önerilir. Bkz. Docker Hızlı Başlangıç Kılavuzu Docker Çekmeleri

Profesyonel İpucu!

torch.distributed.run yerine geçer torch.distributed.launch içinde PyTorch>=1.9. Bakınız: PyTorch dağıtılmış belgelendirme ayrıntılar için.

Eğitim

Eğitime başlamak için önceden eğitilmiş bir model seçin. Burada mevcut en küçük ve en hızlı model olan YOLOv5s'i seçiyoruz. Tüm modellerin tam karşılaştırması için README tablomuzu inceleyin. Bu modeli COCO veri kümesinde Çoklu-GPU ile eğiteceğiz.

YOLOv5 Modelleri

Tek GPU

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

Artırabilirsiniz device DataParallel modunda birden çok GPU kullanmak için.

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

Bu yöntem yavaştır ve yalnızca 1 GPU kullanmaya kıyasla eğitimi pek hızlandırmaz.

Geçmeniz gerekecek python -m torch.distributed.run --nproc_per_node, ardından her zamanki argümanlar gelir.

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 kaç adet GPU kullanmak istediğinizi belirtir. Yukarıdaki örnekte, bu sayı 2'dir.
  • --batch toplam yığın boyutudur. Her GPU'ya eşit olarak bölünecektir. Yukarıdaki örnekte, GPU başına 64/2=32'dir.

Yukarıdaki kod, GPU'ları kullanacaktır. 0... (N-1).

Belirli GPU'ları kullanın (genişletmek için tıklayın) Bunu, `--device` ve ardından belirli GPU'larınızı belirterek yapabilirsiniz. Örneğin, aşağıdaki kodda `2,3` GPU'larını kullanacağız.
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3
SyncBatchNorm Kullanın (genişletmek için tıklayın) [SyncBatchNorm](https://docs.pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase [accuracy](https://www.ultralytics.com/glossary/accuracy) for multiple GPU training, however, it will slow down training by a significant factor. It is **only** available for Multiple GPU DistributedDataParallel training. It is best used when the batch-size on **each** GPU is small (<= 8). To use SyncBatchNorm, simply pass `--sync-bn` to the command like below:
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Birden Fazla Makine Kullanın (genişletmek için tıklayın) Bu **yalnızca** Çoklu GPU DistributedDataParallel eğitimi için geçerlidir. Devam etmeden önce, tüm makinelerdeki dosyaların (veri kümesi, kod tabanı vb.) aynı olduğundan emin olun. Ardından, makinelerin birbiriyle iletişim kurabildiğinden emin olun. Bir ana makine seçmeniz gerekecek (diğerlerinin iletişim kuracağı makine). Adresini (`master_addr`) not alın ve bir bağlantı noktası (`master_port`) seçin. Aşağıdaki örnek için `master_addr = 192.168.1.1` ve `master_port = 1234` kullanacağım. Kullanmak için aşağıdakileri yapabilirsiniz:
# 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` ise `0...(N-1)`'den makine numarasıdır. Diyelim ki her birinde iki GPU bulunan iki makinem var, yukarıdaki için `G = 2`, `N = 2` ve `R = 1` olacaktır. Eğitim, **tüm** `N` makineleri bağlanana kadar başlamayacaktır. Çıktı yalnızca ana makinede gösterilecektir!

Notlar

  • Windows desteği test edilmemiştir, Linux önerilir.
  • --batch GPU sayısının katı olmalıdır.
  • EMA'yı koruduğu ve kontrol noktası oluşturmadan sorumlu olduğu için GPU 0, diğer GPU'lardan biraz daha fazla bellek kullanacaktır.
  • Eğer alırsanız RuntimeError: Address already in use, bunun nedeni aynı anda birden fazla eğitim çalıştırıyor olmanız olabilir. Bunu düzeltmek için, basitçe şunu ekleyerek farklı bir port numarası kullanın: --master_port aşağıdaki gibi:

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

Sonuçlar

AWS EC2 P4d örneği üzerinde 8x A100 SXM4-40GB ile 1 COCO epok için YOLOv5l üzerindeki DDP profil oluşturma sonuçları.

Profil çıkarma kodu
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --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
batch-size CUDA_mem
device0 (G)
COCO
train
COCO
val
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.

SSS

Bir hata oluşursa, lütfen önce aşağıdaki kontrol listesini okuyun! (Zamanınızdan tasarruf sağlayabilir)

Kontrol Listesi (genişletmek için tıklayın) - Bu gönderiyi doğru bir şekilde okudunuz mu? - Kod tabanını yeniden klonlamayı denediniz mi? Kod **günlük** olarak değişiyor. - Hatanızı aramayı denediniz mi? Birisi bu depoda veya başka bir depoda zaten karşılaşmış ve çözümü olabilir. - Yukarıda listelenen tüm gereksinimleri (doğru Python ve PyTorch sürümleri dahil) kurdunuz mu? - Aşağıdaki "Ortamlar" bölümünde listelenen diğer ortamlarda denediniz mi? - coco128 veya coco2017 gibi başka bir veri kümesiyle denediniz mi? Bu, temel nedeni bulmayı kolaylaştıracaktır. Yukarıdakilerin hepsini yaptıysanız, şablonu izleyerek mümkün olduğunca ayrıntılı bilgi vererek bir Sorun oluşturmaktan çekinmeyin.

Desteklenen Ortamlar

Ultralytics, projelerinize hızlı bir başlangıç yapmanız için her biri 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 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'da tutarlı ve güvenilir çalışmayı sağlarlar; testler her 24 saatte bir ve her yeni commit'te yapılır.

Katkıda Bulunanlar

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

Ayrıca Bakınız



📅 1 yıl önce oluşturuldu ✏️ 2 ay önce güncellendi

Yorumlar