Ultralytics YOLO27:
Get Started

التدريب باستخدام وحدات GPU متعددة مع YOLOv5#

يشرح هذا الدليل كيفية تدريب YOLOv5 باستخدام وحدات GPU متعددة على جهاز واحد أو عبر أجهزة متعددة.

قبل البدء#

استنسخ المستودع وثبّت 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 من Ultralytics لجميع مهام التدريب متعددة وحدات GPU. راجع دليل البدء السريع لـDocker. Docker Pulls

PyTorch >= 1.9

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

التدريب#

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

YOLOv5 Models

وحدة GPU واحدة#

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

مرّر معرّفات وحدات GPU متعددة إلى --device لتفعيل وضع DataParallel:

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

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

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

استخدم وحدات GPU محددة (انقر للتوسيع)

مرّر --device متبوعًا بمعرّفات وحدات GPU المحددة. يستخدم المثال أدناه وحدات 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 الدقة في التدريب باستخدام وحدات GPU متعددة، لكنه يبطئ التدريب بدرجة كبيرة. وهو متاح فقط لتدريب DistributedDataParallel متعدد وحدات GPU.

يُفضّل استخدامه عندما يكون حجم الدفعة على كل وحدة GPU صغيرًا (<= 8).

لتفعيل SyncBatchNorm، مرّر --sync-bn:

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
استخدم أجهزة متعددة (انقر للتوسيع)

هذا متاح فقط لتدريب DistributedDataParallel متعدد وحدات GPU.

قبل المتابعة، تأكد من تطابق مجموعة البيانات وقاعدة الشيفرة وأي تبعيات أخرى على جميع الأجهزة، ثم تحقق من قدرة الأجهزة على الاتصال بعضها ببعض عبر الشبكة.

اختر جهازًا رئيسيًا (يتصل به الآخرون)، وسجّل عنوانه (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 هو عدد وحدات GPU لكل جهاز، وN هو عدد الأجهزة، وR هو رتبة الجهاز في 0...(N-1). على سبيل المثال، عند استخدام جهازين ووحدتي GPU في كل منهما، عيّن G = 2 وN = 2 وR = 1 على الجهاز الثاني.

لا يبدأ التدريب حتى تتصل جميع الأجهزة N. لا يظهر الإخراج إلا على الجهاز الرئيسي.

ملاحظات#

  • لم يُختبر دعم Windows؛ ويوصى باستخدام Linux.

  • يجب أن يكون --batch من مضاعفات عدد وحدات GPU.

  • تستهلك 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 مزود بـ 8 وحدات A100 SXM4-40GB لنموذج YOLOv5l خلال حقبة واحدة من COCO.

تحليل أداء الشيفرة
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --ipc=host --device nvidia.com/gpu=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
وحدات GPU
A100
حجم الدفعةذاكرة CUDA
الجهاز0 (G)
COCO
التدريب
COCO
التحقق
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

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

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

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

حالة المشروع#

YOLOv5 CI

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

الشكر والتقدير#

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

انظر أيضًا#

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

اقرأ قائمة التحقق أدناه قبل فتح issue — فهذا يوفر الوقت غالبًا.

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

إذا كانت جميع النقاط أعلاه سليمة، فافتح Issue وأدرج أكبر قدر ممكن من التفاصيل، مع اتباع القالب.

التعليقات