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
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.
Tek GPU
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0
Çoklu-GPU DataParallel Modu (⚠️ önerilmez)
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.
Çoklu-GPU DistributedDataParallel Modu (✅ önerilir)
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 ''
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.
- Ü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ş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
- Eğitim Modu - Ultralytics ile YOLO modellerini eğitme hakkında bilgi edinin
- Hiperparametre Ayarlama - Modelinizin performansını optimize edin
- Docker Hızlı Başlangıç Kılavuzu - Eğitim için Docker ortamınızı ayarlayın