تخطي إلى المحتوى

التدريب متعدد وحدات معالجة الرسوميات (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عمليات سحب Docker

نصيحة احترافية!

torch.distributed.run يستبدل torch.distributed.launch في PyTorch>=1.9. انظر وثائق PyTorch الموزعة للحصول على التفاصيل.

التدريب

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

نماذج YOLOv5

وحدة معالجة رسومية واحدة (Single GPU)

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

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

سيستخدم الكود أعلاه وحدات معالجة الرسوميات GPUs. 0... (N-1). يمكنك أيضًا تعيين CUDA_VISIBLE_DEVICES=2,3 (أو أي قائمة أخرى) قبل تشغيل الأمر إذا كنت تفضل التحكم في رؤية الجهاز عبر متغيرات البيئة.

استخدم وحدات معالجة الرسوميات 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
استخدم أجهزة متعددة (انقر للتوسيع) هذا **متوفر **فقط** لتدريب GPU الموزع متعدد GPU الموزعة المتوازية. قبل المتابعة، تأكد من أن الملفات الموجودة على جميع الأجهزة متماثلة، مجموعة البيانات، وقاعدة البيانات، وقاعدة الشفرات، وما إلى ذلك. بعد ذلك، تأكد من أن الأجهزة يمكنها التواصل مع بعضها البعض. سيكون عليك اختيار جهاز رئيسي (الجهاز الذي ستتحدث إليه الأجهزة الأخرى). قم بتدوين عنوانه ('Master_addr') واختر منفذًا ('master_addr'). سوف أستخدم 'Master_addr = 192.168.1.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" هو عدد GPU لكل جهاز، و"N" هو عدد الأجهزة، و"R" هو عدد الأجهزة من "0... (N-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 على مثيل AWS EC2 P4d مع 8x A100 SXM4-40GB لـ YOLOv5lلمدة 1 COCO .

تحليل أداء الكود
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --runtime=nvidia --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
القطار
COCO
فال
1x1626 جيجابايت20:390:55
2x3226 جيجابايت11:430:57
4x6426 جيجابايت5:570:55
8x12826 جيجابايت3:090:57

كما هو موضح في النتائج، يوفر استخدام DistributedDataParallel مع وحدات معالجة الرسومات المتعددة تحجيمًا خطيًا تقريبًا في سرعة التدريب. مع 8 وحدات معالجة رسومات، يكتمل التدريب أسرع بحوالي 6.5 مرة مما هو عليه مع وحدة معالجة رسومات واحدة، مع الحفاظ على نفس استخدام الذاكرة لكل جهاز.

الأسئلة الشائعة

إذا حدث خطأ، يرجى قراءة قائمة التحقق أدناه أولاً! (قد يوفر وقتك)

قائمة التحقق (انقر للتوسيع) - هل قرأت هذا المنشور بشكل صحيح؟ - هل حاولت إعادة استنساخ قاعدة الرموز؟ الكود يتغير **يوميًا**. - هل حاولت البحث عن الخطأ الخاص بك؟ قد يكون شخص ما قد واجهته بالفعل في هذا الريبو أو في غيره ولديه الحل. - هل قمت بتثبيت جميع المتطلبات المدرجة في الأعلى (بما في ذلك إصدارات Python و PyTorch الصحيحة)؟ - هل جربت في بيئات أخرى مدرجة في قسم "البيئات" أدناه؟ - هل حاولت باستخدام مجموعة بيانات أخرى مثل coco128 أو coco2017؟ سيجعل ذلك من السهل العثور على السبب الجذري. إذا مررت بكل ما سبق، لا تتردد في رفع مشكلة من خلال إعطاء أكبر قدر ممكن من التفاصيل باتباع النموذج.

البيئات المدعومة

توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، كل منها مثبت مسبقًا بالتبعيات الأساسية مثل CUDA و CUDNN و Python و PyTorch، لبدء مشاريعك.

حالة المشروع

YOLOv5 CI

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

تقدير

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

انظر أيضاً



📅 تم إنشاؤها منذ 2 سنوات مضت ✏️ تم التحديث منذ 1 يوم
glenn.jocher@ultralytics.comUltralyticsAssistantonuralp@ultralytics.comLaughing-qRizwanMunawarBurhan-Q

تعليقات