انتقل إلى المحتوى

تدريب متعدد وحدات معالجة الرسومات

📚 يشرح هذا الدليل كيفية استخدام وحدات معالجة الرسومات المتعددة بشكل صحيح لتدريب مجموعة بيانات باستخدام 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 عامل ميناء يسحب

💡 بروتيب! torch.distributed.run يستبدل torch.distributed.launch في PyTorch>=1.9. رأى مستندات للتفاصيل.

تدريب

حدد نموذجا تم تدريبه مسبقا لبدء التدريب منه. هنا نختار YOLOv5s ، أصغر وأسرع طراز متاح. انظر جدول README الخاص بنا للحصول على مقارنة كاملة لجميع الموديلات. سنقوم بتدريب هذا النموذج باستخدام Multi-GPU على مجموعة بيانات COCO .

YOLOv5 نماذج

وحدة معالجة رسومات واحدة

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

يمكنك زيادة device لاستخدام وحدات معالجة رسومات متعددة في وضع DataParallel.

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

هذه الطريقة بطيئة وبالكاد تسرع التدريب مقارنة باستخدام 1 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 هو إجمالي حجم الدفعة. سيتم تقسيمها بالتساوي إلى كل وحدة معالجة رسومات. في المثال أعلاه ، هو 64/2 = 32 لكل وحدة معالجة رسومات.

سيستخدم الرمز أعلاه وحدات معالجة الرسومات 0... (N-1).

استخدام وحدات معالجة رسومات محددة (انقر للتوسيع) يمكنك القيام بذلك ببساطة عن طريق تمرير "--device" متبوعا بوحدات معالجة الرسومات الخاصة بك. على سبيل المثال ، في الكود أدناه ، سنستخدم وحدات معالجة الرسومات "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://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
استخدام أجهزة متعددة (انقر للتوسيع) هذا **فقط** متاح للتدريب على وحدة معالجة الرسومات المتعددة 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 ''
حيث "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 مثل أدناه ،
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

النتائج

نتائج تنميط 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، لبدء مشاريعك.

حالة المشروع

YOLOv5 سي آي

تشير هذه الشارة إلى أن جميع YOLOv5 اجتياز اختبارات التكامل المستمر (CI) لإجراءات GitHub بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداءYOLOv5 عبر جوانب رئيسية مختلفة: التدريب ، والتحقق من الصحة ، والاستدلال ، والتصدير ، والمعايير. إنها تضمن التشغيل المتسق والموثوق به على macOS و Windows و Ubuntu ، مع إجراء الاختبارات كل 24 ساعة وعند كل التزام جديد.

الائتمانات

نود أن نشكر @MagicFrogSJTU ، الذي قام بكل الرفع الثقيل ، و @glenn-jocher لإرشادنا على طول الطريق.



تم إنشاؤه في 2023-11-12, اخر تحديث 2023-12-03
المؤلفون: جلين جوشر (2)

التعليقات