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

Link to this sectionوحدة معالجة رسومية (GPU) واحدة#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0Link to this sectionوضع DataParallel لوحدات معالجة رسومية متعددة (⚠️ غير مستحسن)#
مرر معرفات متعددة لوحدات معالجة الرسومات إلى --device لتمكين وضع DataParallel:
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1يعد DataParallel بطيئًا ولا يسرع التدريب بشكل ملحوظ مقارنة باستخدام وحدة معالجة رسومية واحدة.
Link to this sectionوضع 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. يتم عرض المخرجات فقط على الجهاز الرئيسي.
Link to this sectionملاحظات#
-
دعم 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 ...
Link to this sectionالنتائج#
DDP profiling results on an AWS EC2 P4d instance with 8x A100 SXM4-40GB for YOLOv5l for 1 COCO epoch.
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| وحدات معالجة الرسومات 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 مرة مقارنة باستخدام وحدة معالجة رسومية واحدة، مع الحفاظ على نفس استخدام الذاكرة لكل جهاز.
Link to this sectionالأسئلة الشائعة#
اقرأ قائمة المراجعة أدناه قبل فتح إصدار (issue) - غالبًا ما يوفر ذلك الوقت.
Checklist (click to expand)
- هل قرأت هذا الدليل من البداية إلى النهاية؟
- هل قمت بإعادة استنساخ قاعدة الكود؟ تتغير الأكواد يوميًا.
- هل بحثت عن رسالة الخطأ؟ ربما واجه شخص آخر نفس المشكلة وشارك حلاً لها.
- هل قمت بتثبيت جميع المتطلبات (بما في ذلك إصدارات Python و PyTorch الصحيحة)؟
- هل جربت إحدى البيئات المدعومة المدرجة أدناه؟
- هل جربت مجموعة بيانات أصغر مثل
coco128أوcoco2017لعزل السبب الجذري؟
إذا كان كل ما سبق صحيحًا، فافتح إصدارًا (Issue) بأكبر قدر ممكن من التفاصيل، باتباع النموذج المخصص.
Link to this sectionالبيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، حيث يتم تثبيت التبعيات الأساسية مسبقًا مثل CUDA، و CUDNN، و Python، و PyTorch، لبدء مشاريعك.
- دفاتر ملاحظات مجانية لوحدات معالجة الرسومات:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
Link to this sectionحالة المشروع#
تشير هذه الشارة إلى أن جميع اختبارات التكامل المستمر (CI) الخاصة بـ YOLOv5 GitHub Actions تمر بنجاح. تقوم اختبارات CI هذه بفحص دقة وأداء YOLOv5 عبر جوانب رئيسية مختلفة بشكل صارم: التدريب، والتحقق، والاستدلال، والتصدير، والمقاييس. وهي تضمن تشغيلًا متسقًا وموثوقًا على macOS و Windows و Ubuntu، مع إجراء الاختبارات كل 24 ساعة ومع كل التزام (commit) جديد.
Link to this sectionشكر وتقدير#
نود أن نشكر @MagicFrogSJTU، الذي قام بجميع الأعمال الشاقة، و @glenn-jocher لتوجيهنا على طول الطريق.
Link to this sectionشاهد أيضًا#
- وضع التدريب - تعرف على تدريب نماذج YOLO باستخدام Ultralytics
- ضبط المعلمات الفائقة - قم بتحسين أداء نموذجك
- دليل البدء السريع لـ Docker - قم بإعداد بيئة Docker الخاصة بك للتدريب