İçeriğe geç

Çoklu GPU Eğitimi

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

Başlamadan Önce

Repoyu klonlayın ve requirements.txt dosyasını bir Python>=3.8.0 ortamı dahil olmak üzere PyTorch>=1.8. 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

💡 ProTip! Docker Görüntüsü tüm Multi-GPU eğitimleri için önerilir. Bakınız Docker Hızlı Başlangıç Kılavuzu Docker Çeker

💡 ProTip! torch.distributed.run yerine geçer torch.distributed.launch içinde PyTorch>=1.9. Bkz. dokümanlar detaylar 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 tablomuza bakın. Bu modeli COCO veri kümesi üzerinde Multi-GPU ile eğiteceğiz.

YOLOv5 Modeller

Tek GPU

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

Artırabilirsiniz device DataParallel modunda Çoklu GPU'ları kullanmak için.

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

Bu yöntem yavaştır ve sadece 1 GPU kullanmaya kıyasla eğitimi zar zor hızlandırır.

Geçmeniz gerekecek python -m torch.distributed.run --nproc_per_nodeardından olağan tartışmalar 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ç 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 sadece `--device` ve ardından belirli GPU'larınızı geçerek 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://pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase 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, simple 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 **sadece** Çoklu GPU DağıtılmışVeriParalel eğitimi için kullanılabilir. Devam etmeden önce, tüm makinelerdeki dosyaların aynı olduğundan emin olun, veri kümesi, kod tabanı vb. Daha sonra, makinelerin birbirleriyle iletişim kurabildiğinden emin olun. Bir ana makine (diğerlerinin konuşacağı makine) seçmeniz gerekecektir. Adresini not edin (`master_addr`) ve bir port seçin (`master_port`). Aşağıdaki örnek için `master_addr = 192.168.1.1` ve `master_port = 1234` kullanacağım. Kullanmak için aşağıdaki işlemleri 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` `0...(N-1)` arasındaki makine numarasıdır. Diyelim ki her biri iki GPU'ya sahip iki makinem var, yukarıdakiler için `G = 2` , `N = 2` ve `R = 1` olacaktır. Eğitim şu tarihe kadar başlamayacaktır hepsi N` makine bağlı. Çıktı sadece ana makinede gösterilecektir!

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ından vb. sorumlu olduğu için diğer GPU'lardan biraz daha fazla bellek alacaktır.
  • Eğer alırsan RuntimeError: Address already in useBunun nedeni aynı anda birden fazla eğitim yürütüyor olmanız olabilir. Bunu düzeltmek için, aşağıdakileri ekleyerek farklı bir bağlantı noktası numarası kullanın --master_port Aşağıdaki gibi,
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Sonuçlar

YOLOv5l için 1 COCO dönemi için 8x A100 SXM4-40GB ile AWS EC2 P4d örneğinde DDP profilleme sonuçları.

Profil oluşturma 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
parti boyutu CUDA_mem
device0 (G)
COCO
tren
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

SSS

Bir hata oluşursa, lütfen önce aşağıdaki kontrol listesini okuyun! (Size zaman kazandırabilir)

Kontrol Listesi (genişletmek için tıklayın)
  • Bu yazıyı doğru dürüst okudunuz mu?
  • Kod tabanını yeniden klonlamayı denediniz mi? Kod her gün değişiyor.
  • Hatanızı araştırmayı denediniz mi? Birisi bu depoda veya başka bir yerde daha önce karşılaşmış ve çözüme sahip olabilir.
  • Üstte listelenen tüm gereksinimleri (doğru Python ve Pytorch sürümleri dahil) yüklediniz mi?
  • Aşağıdaki "Ortamlar" bölümünde listelenen diğer ortamlarda denediniz mi?
  • coco128 veya coco2017 gibi başka bir veri kümesi ile denediniz mi? Temel nedeni bulmayı kolaylaştıracaktır.
Yukarıdakilerin hepsinden geçtiyseniz, şablonu izleyerek mümkün olduğunca fazla ayrıntı vererek bir Sorun bildirmekten çekinmeyin.

Desteklenen Ortamlar

Ultralytics her biri CUDA, CUDNN gibi temel bağımlılıklarla önceden yüklenmiş bir dizi kullanıma hazır ortam sağlar, Pythonve PyTorchProjelerinizi başlatmak için.

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 'un işlevselliğini ve performansını çeşitli temel yönlerden titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. Her 24 saatte bir ve her yeni işlemde yapılan testlerle macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir çalışma sağlarlar.

Krediler

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



Oluşturuldu 2023-11-12, Güncellendi 2023-12-03
Yazarlar: glenn-jocher (2)

Yorumlar