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