تدريب متعدد وحدات GPU الرسومات باستخدام YOLOv5
يشرح هذا الدليل كيفية استخدام وحدات معالجة الرسومات المتعددة بشكل صحيح لتدريب مجموعة بيانات باستخدام YOLOv5 🚀 على جهاز واحد أو عدة أجهزة.
قبل أن تبدأ
استنساخ الريبو وتثبيت المتطلبات.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 يوصى به لجميع الدورات التدريبية متعددةGPU . انظر دليل البدء السريع لـ Docker
نصيحة احترافية!
torch.distributed.run
يستبدل torch.distributed.launch
في PyTorch>=1.9. انظر وثائق PyTorch الموزعة للحصول على التفاصيل.
التدريب
حدد نموذجًا مدربًا مسبقًا لبدء التدريب منه. هنا نختار YOLOv5s، أصغر وأسرع نموذج متاح. راجع جدول README للحصول على مقارنة كاملة لجميع النماذج. سنقوم بتدريب هذا النموذج باستخدام Multi-GPU على مجموعة بيانات COCO.
مفردة GPU
الوضعالمتوازي متعددGPU البيانات (⚠️ غير موصى به)
يمكنك زيادة device
لاستخدام وحدات معالجة رسومات متعددة في وضع DataParallel.
هذه الطريقة بطيئة وبالكاد تسرع التدريب مقارنة باستخدام 1 GPU فقط .
متعددGPU وضع البيانات الموزعة الوضعالمتوازي (✅ موصى به)
يجب أن تجتاز 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
يحدد عدد وحدات معالجة الرسومات التي ترغب في استخدامها. في المثال أعلاه، هو 2.--batch
هو إجمالي حجم الدفعة. سيتم تقسيمها بالتساوي على كل GPU. في المثال أعلاه، هو 64/2=32 لكل GPU.
سيستخدم الكود أعلاه وحدات معالجة الرسومات 0... (N-1)
.
استخدام وحدات معالجة رسومات محددة (انقر للتوسيع)
يمكنك القيام بذلك ببساطة عن طريق تمرير '---جهاز' متبوعًا بوحدات معالجة الرسومات المحددة. على سبيل المثال، في الكود أدناه، سنستخدم وحدات معالجة الرسومات '2،3'.استخدام SyncBatchNorm (انقر للتوسيع)
[SyncBatchNorm](https://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:استخدام أجهزة متعددة (انقر للتوسيع)
هذا **متوفر **فقط** لتدريب GPU متعدد GPU DistributedDataParallel. قبل المتابعة، تأكد من أن الملفات الموجودة على جميع الأجهزة متماثلة، مجموعة البيانات، وقاعدة البيانات، وقاعدة الشفرات، وما إلى ذلك. بعد ذلك، تأكد من أن الأجهزة يمكنها التواصل مع بعضها البعض. سيكون عليك اختيار جهاز رئيسي (الجهاز الذي ستتحدث إليه الأجهزة الأخرى). قم بتدوين عنوانه ('Master_addr') واختر منفذًا ('master_addr'). سوف أستخدم 'Master_addr = 192.168.1.1.1' و 'Master_port = 1234' في المثال أدناه. لاستخدامه، يمكنك القيام بما يلي: حيث "G" هو عدد GPU لكل جهاز، و"N" هو عدد الأجهزة، و"R" هو عدد الأجهزة من "0... (N-1)". لنفترض أن لدي جهازين مع وحدتي معالجة رسومات لكل منهما، سيكون "G = 2" و"N = 2" و"R = 1" لما سبق. لن يبدأ التدريب حتى ** يتم توصيل جميع ** جميع ** الأجهزة "N". لن يظهر الناتج إلا على الجهاز الرئيسي فقط!الملاحظات
- لم يتم اختبار دعم نظام التشغيل ويندوز غير مجرب، ويوصى باستخدام لينكس.
--batch
يجب أن يكون مضاعفًا لعدد وحدات معالجة الرسومات.- GPU 0 سيأخذ ذاكرة أكبر قليلاً من وحدات معالجة الرسومات الأخرى لأنه يحافظ على EMA وهو مسؤول عن نقاط التحقق وما إلى ذلك.
- إذا حصلت على
RuntimeError: Address already in use
، فقد يكون ذلك بسبب قيامك بتشغيل عدة تدريبات في وقت واحد. لإصلاح ذلك، ما عليك سوى استخدام رقم منفذ مختلف عن طريق إضافة--master_port
كما هو موضح أدناه:
النتائج
نتائج التنميط DDP على مثيل AWS EC2 P4d على مثيل AWS EC2 P4d مع 8x A100 SXM4-40GB لـ YOLOv5l لمدة 1 COCO.
كود التنميط
# 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_mem الجهاز 0 (G) |
قطار COCO |
كوكو فال |
---|---|---|---|---|
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 مرات من GPU واحدة، مع الحفاظ على نفس استخدام الذاكرة لكل جهاز.
الأسئلة الشائعة
في حالة حدوث خطأ، يُرجى قراءة قائمة المراجعة أدناه أولاً! (يمكن أن يوفر وقتك)
قائمة التحقق (انقر للتوسيع)
- هل قرأت هذا المنشور بشكل صحيح؟ - هل حاولت إعادة استنساخ قاعدة الرموز؟ الكود يتغير **يوميًا**. - هل حاولت البحث عن الخطأ الخاص بك؟ قد يكون شخص ما قد واجهته بالفعل في هذا الريبو أو في غيره ولديه الحل. - هل قمت بتثبيت جميع المتطلبات المدرجة في الأعلى (بما في ذلك إصدارات Python و PyTorch الصحيحة)؟ - هل جربت في بيئات أخرى مدرجة في قسم "البيئات" أدناه؟ - هل جربت مع مجموعة بيانات أخرى مثل coco128 أو coco2017؟ سيجعل ذلك من السهل العثور على السبب الجذري. إذا مررت بكل ما سبق، لا تتردد في رفع مشكلة من خلال إعطاء أكبر قدر ممكن من التفاصيل باتباع النموذج.البيئات المدعومة
Ultralytics مجموعة من البيئات الجاهزة للاستخدام، كل منها مثبت مسبقًا مع التبعيات الأساسية مثل CUDA، CUDNN, Pythonو PyTorchلبدء مشاريعك.
- GPU دفاتر مجاناً:
- Google السحابة: دليل البدء السريع لـ GCP
- أمازون دليل AWS للبدء السريع
- Azure: دليل البدء السريع لـ AzureML
- دوكر: دليل البدء السريع لـ Docker
حالة المشروع
تشير هذه الشارة إلى اجتياز جميع اختبارات التكامل المستمر (CI) لإجراءات GitHub YOLOv5 بنجاح. تتحقق اختبارات التكامل المستمر هذه بدقة من وظائف وأداء YOLOv5 عبر مختلف الجوانب الرئيسية: التدريب والتحقق من الصحة والاستدلال والتصدير والمعايير. وهي تضمن تشغيلًا متسقًا وموثوقًا على أنظمة macOS وWindows وUbuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل التزام جديد.
الاعتمادات
نودّ أن نشكر @MagicFrogSJTU، الذي قام بكل ما يلزم، و@glenn-jocher على توجيهنا طوال الطريق.
انظر أيضاً
- وضع التدريب - تعرف على تدريب نماذج YOLO مع Ultralytics
- ضبط المعلمة الفائقة - تحسين أداء النموذج الخاص بك
- دليل Docker Quickstart Guide - إعداد بيئة Docker الخاصة بك للتدريب