التدريب متعدد وحدات معالجة الرسوميات (Multi-GPU) باستخدام YOLOv5
يشرح هذا الدليل كيفية استخدام وحدات معالجة الرسوميات المتعددة بشكل صحيح لتدريب مجموعة بيانات باستخدام YOLOv5 🚀 على جهاز واحد أو أجهزة متعددة.
قبل أن تبدأ
استنساخ المستودع وتثبيت requirements.txt في بيئة Python>=3.8.0، بما في ذلك PyTorch>=1.8. يتم تنزيل النماذج و مجموعات البيانات تلقائيًا من أحدث إصدار YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
نصيحة احترافية!
صورة Docker موصى به لجميع عمليات التدريب متعددة وحدات معالجة الرسومات. انظر دليل البدء السريع لـ Docker
نصيحة احترافية!
torch.distributed.run
يستبدل torch.distributed.launch
في PyTorch>=1.9. انظر وثائق PyTorch الموزعة للحصول على التفاصيل.
التدريب
حدد نموذجًا مُدرَّبًا مسبقًا لبدء التدريب منه. هنا نختار YOLOv5s، وهو أصغر وأسرع نموذج متاح. راجع الجدول في ملف README الخاص بنا للحصول على مقارنة كاملة لجميع النماذج. سندرب هذا النموذج باستخدام Multi-GPU على مجموعة بيانات COCO.
وحدة معالجة رسومية واحدة (Single GPU)
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0
وضع DataParallel لوحدة معالجة الرسومات المتعددة (⚠️ غير مستحسن)
يمكنك زيادة ال device
لاستخدام وحدات معالجة الرسوميات المتعددة في وضع DataParallel.
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
هذه الطريقة بطيئة وبالكاد تسرع التدريب مقارنة باستخدام GPU واحد فقط.
وضع DistributedDataParallel متعدد وحدات معالجة الرسوميات (✅ مُوصى به)
سيتعين عليك اجتياز python -m torch.distributed.run --nproc_per_node
، متبوعًا بالحجج المعتادة.
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
يحدد عدد وحدات معالجة الرسومات (GPU) التي ترغب في استخدامها. في المثال أعلاه، هو 2.--batch
يمثل الحجم الكلي للدُفعة (batch-size). سيتم تقسيمه بالتساوي على كل وحدة معالجة رسومية (GPU). في المثال أعلاه، يكون 64/2=32 لكل وحدة معالجة رسومية.
سيستخدم الكود أعلاه وحدات معالجة الرسوميات GPUs. 0... (N-1)
.
استخدم وحدات معالجة الرسوميات GPUs محددة (انقر للتوسيع)
يمكنك القيام بذلك ببساطة عن طريق تمرير `--device` متبوعًا بوحدات معالجة الرسومات (GPU) المحددة الخاصة بك. على سبيل المثال، في الكود أدناه، سنستخدم وحدات معالجة الرسومات `2,3`.python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3
استخدم SyncBatchNorm (انقر للتوسيع)
[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
استخدم أجهزة متعددة (انقر للتوسيع)
هذا متاح **فقط** للتدريب الموزع المتوازي على وحدات معالجة الرسوميات المتعددة (Multiple GPU DistributedDataParallel). قبل المتابعة، تأكد من أن الملفات الموجودة على جميع الأجهزة متطابقة، مثل مجموعة البيانات وقاعدة التعليمات البرمجية وما إلى ذلك. بعد ذلك، تأكد من أن الأجهزة يمكنها التواصل مع بعضها البعض. ستحتاج إلى اختيار جهاز رئيسي (الجهاز الذي ستتصل به الأجهزة الأخرى). دوّن عنوانه (`master_addr`) واختر منفذًا (`master_port`). سأستخدم `master_addr = 192.168.1.1` و `master_port = 1234` للمثال أدناه. لاستخدامه، يمكنك القيام بما يلي:# 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 ''
ملاحظات
- دعم Windows غير مُختبر، يوصى باستخدام Linux.
--batch
يجب أن يكون مضاعفًا لعدد وحدات معالجة الرسوميات.- ستستهلك وحدة معالجة الرسوميات GPU 0 ذاكرة أكبر قليلاً من وحدات معالجة الرسوميات الأخرى لأنها تحتفظ بـ EMA وهي مسؤولة عن التحقق وما إلى ذلك.
-
إذا حصلت على
RuntimeError: Address already in use
، قد يكون ذلك بسبب تشغيلك لعمليات تدريب متعددة في وقت واحد. لإصلاح ذلك، ما عليك سوى استخدام رقم منفذ مختلف عن طريق إضافة.--master_port
كما في الأسفل:python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
النتائج
نتائج تحديد خصائص DDP على AWS EC2 P4d instance مع 8x A100 SXM4-40GB لـ YOLOv5l لـ 1 COCO epoch.
تحليل أداء الكود
# 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
وحدات معالجة الرسوميات A100 |
حجم الدفعة | ذاكرة CUDA device0 (G) |
COCO train |
COCO val |
---|---|---|---|---|
1x | 16 | 26 جيجابايت | 20:39 | 0:55 |
2x | 32 | 26 جيجابايت | 11:43 | 0:57 |
4x | 64 | 26 جيجابايت | 5:57 | 0:55 |
8x | 128 | 26 جيجابايت | 3:09 | 0:57 |
كما هو موضح في النتائج، يوفر استخدام DistributedDataParallel مع وحدات معالجة الرسومات المتعددة تحجيمًا خطيًا تقريبًا في سرعة التدريب. مع 8 وحدات معالجة رسومات، يكتمل التدريب أسرع بحوالي 6.5 مرة مما هو عليه مع وحدة معالجة رسومات واحدة، مع الحفاظ على نفس استخدام الذاكرة لكل جهاز.
الأسئلة الشائعة
إذا حدث خطأ، يرجى قراءة قائمة التحقق أدناه أولاً! (قد يوفر وقتك)
قائمة التحقق (انقر للتوسيع)
- هل قرأت هذا المنشور بشكل صحيح؟ - هل حاولت إعادة استنساخ قاعدة التعليمات البرمجية؟ تتغير التعليمات البرمجية **يوميًا**. - هل حاولت البحث عن خطأك؟ ربما يكون شخص ما قد واجهه بالفعل في هذا المستودع أو في مستودع آخر ولديه الحل. - هل قمت بتثبيت جميع المتطلبات المذكورة أعلاه (بما في ذلك إصدارات Python و PyTorch الصحيحة)؟ - هل حاولت في بيئات أخرى مذكورة في قسم "البيئات" أدناه؟ - هل حاولت مع مجموعة بيانات أخرى مثل coco128 أو coco2017؟ سيجعل من السهل العثور على السبب الجذري. إذا كنت قد مررت بكل ما سبق، فلا تتردد في طرح مشكلة من خلال تقديم أكبر قدر ممكن من التفاصيل باتباع النموذج.البيئات المدعومة
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، كل منها مثبت مسبقًا بالتبعيات الأساسية مثل CUDA و CUDNN و Python و PyTorch، لبدء مشاريعك.
- دفاتر ملاحظات GPU مجانية:
- Google Cloud: دليل البدء السريع في GCP
- Amazon: دليل البدء السريع في AWS
- Azure: دليل البدء السريع في AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع
تشير هذه الشارة إلى أن جميع اختبارات التكامل المستمر (CI) لـ YOLOv5 GitHub Actions قد اجتازت بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداء YOLOv5 عبر مختلف الجوانب الرئيسية: التدريب، التحقق، الاستدلال، التصدير، و المعايير. وهي تضمن تشغيلًا متسقًا وموثوقًا على أنظمة macOS و Windows و Ubuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل commit جديد.
تقدير
نود أن نشكر @MagicFrogSJTU، الذي قام بكل العمل الشاق، و @glenn-jocher لتوجيهنا على طول الطريق.
انظر أيضاً
- وضع التدريب - تعرف على تدريب نماذج YOLO باستخدام Ultralytics
- ضبط المعلمات الفائقة - حسّن أداء النموذج الخاص بك
- دليل البدء السريع لـ Docker - قم بإعداد بيئة Docker الخاصة بك للتدريب