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

يُنصح باستخدام صورة Ultralytics Docker لجميع عمليات التدريب باستخدام وحدات معالجة رسومات متعددة. راجع دليل البدء السريع لـ Docker. Docker Pulls

PyTorch >= 1.9

يحل torch.distributed.run محل torch.distributed.launch في PyTorch >= 1.9. راجع توثيق توزيع PyTorch لمزيد من التفاصيل.

التدريب

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

YOLOv5 Models

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

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

وضع DataParallel باستخدام وحدات معالجة رسومات متعددة (⚠️ غير مستحسن)

مرر معرفات وحدات معالجة رسومات متعددة إلى --device لتمكين وضع DataParallel:

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

يعد DataParallel بطيئاً وبالكاد يسرع التدريب مقارنة باستخدام وحدة معالجة رسومات واحدة.

وضع DistributedDataParallel باستخدام وحدات معالجة رسومات متعددة (✅ مستحسن)

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

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

Use specific GPUs (click to expand)

مرر --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
Use SyncBatchNorm (click to expand)

يمكن لـ SyncBatchNorm زيادة الدقة لتدريب وحدات معالجة رسومات متعددة، لكنه يبطئ التدريب بشكل ملحوظ. وهو متاح فقط لتدريب DistributedDataParallel باستخدام وحدات معالجة رسومات متعددة.

يُفضل استخدامه عندما يكون حجم الدفعة (batch size) على كل وحدة معالجة رسومات صغيراً (<= 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
Use Multiple machines (click to expand)

هذا متاح فقط لتدريب 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...(N-1). على سبيل المثال، مع وجود جهازين ووحدتي معالجة رسوميات لكل منهما، اضبط G = 2 و N = 2 و R = 1 على الجهاز الثاني.

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

ملاحظات

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

  • يجب أن يكون --batch من مضاعفات عدد وحدات معالجة الرسوميات.

  • تستخدم وحدة معالجة الرسوميات 0 ذاكرة أكثر قليلاً من غيرها لأنها تحتفظ بـ EMA وتتعامل مع التحقق من نقاط الحفظ (checkpointing).

  • إذا تلقيت 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 لمدة 1 عصر (epoch) على COCO.

Profiling code
# 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
وحدات GPU
A100
حجم الدفعة (batch-size)ذاكرة CUDA
device0 (G)
COCO
تدريب
COCO
تحقق
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

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

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

اقرأ قائمة التحقق أدناه قبل فتح إصدار (Issue) - فهي غالباً ما توفر الوقت.

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

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

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

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

حالة المشروع

YOLOv5 CI

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

الاعتمادات

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

انظر أيضاً

التعليقات