التدريب باستخدام وحدات معالجة رسومية (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.
يحل torch.distributed.run محل torch.distributed.launch في PyTorch >= 1.9. راجع وثائق PyTorch الموزعة للتعرف على التفاصيل.
التدريب#
اختر نموذجاً مدرباً مسبقاً لبدء التدريب منه. هنا نختار YOLOv5s، وهو نموذج صغير وسريع. راجع جدول ملف README الخاص بنا للحصول على مقارنة كاملة لجميع النماذج. سنقوم بتدريب هذا النموذج باستخدام وحدات معالجة رسومية متعددة (Multi-GPU) على مجموعة بيانات COCO.

وحدة معالجة رسومية (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هو عدد وحدات معالجة الرسوميات المراد استخدامها. في المثال أعلاه، هو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,3Use SyncBatchNorm (click to expand)
يمكن أن تزيد SyncBatchNorm من الدقة للتدريب على وحدات معالجة رسومية متعددة، لكنها تبطئ التدريب بشكل ملحوظ. وهي متاحة فقط لتدريب DistributedDataParallel على وحدات معالجة رسومية متعددة.
تكون أفضل استخداماً عندما يكون حجم الدفعة على كل وحدة معالجة رسوميات صغيراً (<= 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-bnUse 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 لـ حقبة واحدة لـ COCO.
Profiling code
# 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| وحدات معالجة الرسومات A100 | حجم الدفعة | ذاكرة CUDA الجهاز 0 (G) | COCO تدريب | COCO تحقق |
|---|---|---|---|---|
| 1x | 16 | 26GB | 20:39 | 0:55 |
| 2x | 32 | 26GB | 11:43 | 0:57 |
| 4x | 64 | 26GB | 5:57 | 0:55 |
| 8x | 128 | 26GB | 3:09 | 0:57 |
كما هو موضح في النتائج، فإن استخدام DistributedDataParallel مع وحدات معالجة رسومية متعددة يوفر تحجيماً خطياً تقريباً في سرعة التدريب. مع 8 وحدات معالجة رسوميات، يكتمل التدريب بشكل أسرع بحوالي 6.5 مرة مقارنة بوحدة معالجة رسوميات واحدة، مع الحفاظ على نفس استهلاك الذاكرة لكل جهاز.
البيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقاً بالتبعيات الأساسية مثل CUDA، وCUDNN، وPython، وPyTorch، لبدء مشاريعك بسرعة.
- دفاتر ملاحظات مجانية لوحدات معالجة الرسومات:
- Google Cloud: GCP Quickstart Guide
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: Docker Quickstart Guide
حالة المشروع#
تشير هذه الشارة إلى أن جميع اختبارات التكامل المستمر (CI) لـ YOLOv5 GitHub Actions تمر بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداء YOLOv5 عبر جوانب رئيسية مختلفة: training، وvalidation، وinference، وexport، وbenchmarks. وهي تضمن تشغيلاً متسقاً وموثوقاً على أنظمة macOS وWindows وUbuntu، مع إجراء اختبارات كل 24 ساعة ومع كل عملية commit جديدة.
شكر وتقدير#
نود أن نشكر @MagicFrogSJTU، الذي قام بجميع الأعمال الشاقة، و @glenn-jocher لتوجيهنا على طول الطريق.
شاهد أيضًا#
- وضع التدريب - تعرف على تدريب نماذج YOLO باستخدام Ultralytics
- ضبط المعلمات الفائقة - تحسين أداء نموذجك
- دليل البدء السريع لـ Docker - إعداد بيئة Docker الخاصة بك للتدريب
الأسئلة الشائعة#
اقرأ قائمة المراجعة أدناه قبل فتح إصدار (issue) - غالبًا ما يوفر ذلك الوقت.
Checklist (click to expand)
- هل قرأت هذا الدليل من البداية إلى النهاية؟
- هل قمت بإعادة استنساخ قاعدة الكود؟ تتغير الأكواد يوميًا.
- هل بحثت عن رسالة الخطأ؟ ربما واجه شخص آخر نفس المشكلة وشارك حلاً لها.
- هل قمت بتثبيت جميع المتطلبات (بما في ذلك إصدارات Python و PyTorch الصحيحة)؟
- هل جربت إحدى البيئات المدعومة المدرجة أعلاه؟
- هل جربت مجموعة بيانات أصغر مثل
coco128أوcoco2017لعزل السبب الجذري؟
إذا كان كل ما سبق صحيحًا، فافتح إصدارًا (Issue) بأكبر قدر ممكن من التفاصيل، باتباع النموذج المخصص.