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

وحدة GPU واحدة#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0وضع DataParallel باستخدام وحدات GPU متعددة (⚠️ غير موصى به)#
مرّر معرّفات وحدات GPU متعددة إلى --device لتمكين وضع DataParallel:
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1يُعد DataParallel بطيئًا، ولا يسرّع التدريب إلا قليلًا مقارنةً باستخدام وحدة GPU واحدة.
وضع DistributedDataParallel باستخدام وحدات 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 (أو أي قائمة أخرى) قبل التشغيل.
Use specific GPUs (click to expand)
مرّر --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,3Use SyncBatchNorm (click to expand)
يمكن أن يزيد 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-bnUse Multiple machines (click to expand)
يتوفر هذا فقط لتدريب 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 مزود بـ 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| وحدات GPU A100 | حجم الدفعة | CUDA_mem device0 (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 مع وحدات GPU متعددة يوفر تحجيمًا شبه خطي في سرعة التدريب. ومع 8 وحدات GPU، يكتمل التدريب بسرعة أكبر بنحو 6.5 مرات مقارنةً بوحدة GPU واحدة، مع الحفاظ على استخدام الذاكرة نفسه لكل جهاز.
البيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقًا مع التبعيات الأساسية مثل CUDA وCUDNN وPython وPyTorch، لبدء مشاريعك.
- دفاتر ملاحظات GPU مجانية:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع#
تشير هذه الشارة إلى اجتياز جميع اختبارات إجراءات YOLOv5 على GitHub الخاصة بـالتكامل المستمر (CI) بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف YOLOv5 وأدائه عبر جوانب رئيسية متنوعة: التدريب والتحقق والاستدلال والتصدير والمعايير. وتضمن التشغيل المتسق والموثوق على macOS وWindows وUbuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل التزام جديد.
الشكر والتقدير#
نتوجه بالشكر إلى @MagicFrogSJTU، الذي تولى معظم العمل الشاق، وإلى @glenn-jocher على إرشادنا طوال الطريق.
انظر أيضًا#
- وضع التدريب - تعرّف على تدريب نماذج YOLO باستخدام Ultralytics
- ضبط المعلمات الفائقة - حسّن أداء نموذجك
- دليل البدء السريع لـ Docker - أعد إعداد بيئة Docker الخاصة بك للتدريب
الأسئلة الشائعة#
اقرأ قائمة التحقق أدناه قبل فتح مشكلة — فهي غالبًا ما توفر الوقت.
Checklist (click to expand)
- هل قرأت هذا الدليل من أوله إلى آخره؟
- هل أعدت استنساخ قاعدة الشفرة؟ تتغير الشفرة يوميًا.
- هل بحثت عن رسالة الخطأ؟ ربما واجه شخص ما المشكلة نفسها وشارك حلًا لها.
- هل ثبّت جميع المتطلبات (بما في ذلك الإصدارين الصحيحين من Python وPyTorch)؟
- هل جربت إحدى البيئات المدعومة المذكورة أعلاه؟
- هل جربت مجموعة بيانات أصغر مثل
coco128أوcoco2017لعزل السبب الجذري؟
إذا اجتازت جميع النقاط أعلاه الفحص، فافتح مشكلة مع تقديم أكبر قدر ممكن من التفاصيل، باتباع القالب.