LeRobot documentation

مسرّعات PyTorch

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

مسرّعات PyTorch

يدعم LeRobot خيارات تسريع متعددة للأجهزة لكلٍّ من التدريب والاستدلال.

تشمل هذه الخيارات:

  • CPU: يقوم المعالج المركزي بتنفيذ جميع العمليات الحسابية، دون استخدام أي معالج تسريع مخصص
  • CUDA: تسريع باستخدام معالجات NVIDIA الرسومية، وبواسطة ROCm باستخدام معالجات AMD الرسومية (انظر معالجات AMD الرسومية)
  • MPS: تسريع باستخدام وحدات معالجة الرسوميات في Apple Silicon
  • XPU: تسريع باستخدام وحدات معالجة الرسوميات المدمجة والمستقلة من Intel

البدء

لاستخدام معالج تسريع معين، يجب تثبيت إصدار مناسب من PyTorch.

لواجهات CPU وCUDA وMPS، اتبع التعليمات المقدمة في صفحة تثبيت PyTorch. لواجهة XPU، اتبع التعليمات الواردة في توثيق PyTorch.

بطاقات AMD الرسومية (ROCm)

تُعرّض إصدارات PyTorch الخاصة بـ ROCم وقت التشغيل HIP عبر مساحة الأسماء torch.cuda، لذا فإن --policy.device=cuda يختار معالج رسومات من AMD دون الحاجة إلى أي تغيير على جانب LeRobot. يُفضَّل استخدام HIP_VISIBLE_DEVICES بدلاً من CUDA_VISIBLE_DEVICES عند اختيار بطاقات محددة.

يتطلب تثبيت LeRobot فوق بيئة ROCm PyTorch موجودة مسبقًا عناية: فحدود الحزم torch وtorchvision وnumpy في LeRobot قد تختلف عما توفره صورة ROCm، كما أن التثبيت العادي يجلب torch من PyPI، حيث تكون عجلات Linux الخاصة به مبنية لـ CUDA، وبالتالي فإن التثبيت غير المقيد يستبدل نسخة ROCم ويترك وحدات المعالجة الرسومية غير قابلة للاستخدام. قم بتثبيت هذه الحزم مع تحديد إصداراتها باستخدام uv pip install --override حتى يتم حل بقية الشجرة بشكل طبيعي. يقوم docker/Dockerfile.rocm بذلك وهو أسرع طريقة للحصول على بيئة عاملة؛ راجع docker/README.md لمعرفة أعلام التشغيل التي تتطلبها ROCm.

التحقق من التثبيت

بعد التثبيت، يمكن التحقق من توفر المُسرِّع من خلال تشغيل

import torch
print(torch.<backend_name>.is_available())  # <backend_name> is cuda, mps, or xpu

كيفية تشغيل التدريب أو التقييم

لانتقاء المُسرِّع المطلوب، استخدم علم --policy.device عند تشغيل lerobot-train أو lerobot-eval. على سبيل المثال، لاستخدام MPS على Apple Silicon، شغّل:

lerobot-train \
    --policy.device=mps ...
lerobot-eval \
    --policy.device=mps ...

ومع ذلك، في معظم الحالات، يتم اكتشاف وجود مُسرِّع تلقائيًا ويمكن إهمال معامل policy.device من أوامر سطر الأوامر.

الدقة المختلطة

تُدار دقة التدريب بواسطة --accelerator.mixed_precision، والذي يقبل no (الافتراضي)، وbf16، وfp16:

lerobot-train \
    --policy.type=act \
    --accelerator.mixed_precision=bf16 ...

يتطلب fp16 معالج تسريع: يتم رفضه عند استخدام --policy.device=cpu، حيث لا يبني accelerate مُقيِّم خسارة (loss scaler) وسيعود التنفيذ بصمت إلى الدقة الكاملة. أما bf16 فيقوم بالتحويل التلقائي (autocast) على وحدة المعالجة المركزية أيضًا، لذا فهو غير مقيد.

يتطلب bf16 دعمًا من العتاد (Ampere أو أحدث على وحدات معالجة الرسوميات من NVIDIA). على المعجلات الأقدم مثل V100 أو T4، استخدم fp16.

fp16 ومقياس الخسارة

يتميز fp16 بنطاق أُس أصغر بكثير من bf16، لذا يتم تكبير التدرجات قبل المرور العكسي ثم تصغيرها مرة أخرى قبل خطوة المُحسِّن. تفوّض LeRobot هذه المهمة إلى GradScaler الخاص بـ accelerate، والذي يكشف أيضًا عن التدرجات المتجاوزة ويتخطى تحديثات المُحسِّن تلك. في التدريب المجزأ، تكون التدرجات من نوع DTensor، ويقلل PyTorch علم التجاوز عبر شبكة الأجهزة، بحيث يؤدي التجاوز في رتبة واحدة إلى تخطي التحديث في جميع الرتب.

تُعدّ التحديثات المتخطاة أمرًا طبيعيًا، لا سيما في الخطوات الأولى أثناء ضبط المقياس نزولًا من قيمته الأولية. يمكن ملاحظة ذلك في السجلات من خلال انخفاض مقياس scale. يُحفظ المقياس مع كل نقطة تحقق (training_state/scaler_state.json) ويُستعاد عند الاستئناف، لذا لا يحتاج التشغيل المستأنف إلى إعادة الضبط.

يمكن ضبط المُقيِّم إذا لم تكن القيم الافتراضية مناسبة لسياسة معينة:

lerobot-train \
    --policy.type=act \
    --accelerator.mixed_precision=fp16 \
    --accelerator.grad_scaler.init_scale=1024 \
    --accelerator.grad_scaler.growth_interval=2000 ...

TF32

على وحدات معالجة الرسوميات NVIDIA من طراز Ampere والأحدث، يجعل LeRobot عمليات ضرب المصفوفات float32 والتحويلات باستخدام cuDNN تستخدم TF32 افتراضيًا (--tf32=true). استخدم --tf32=false للحفاظ عليها بدقة float32 الكاملة، ويترك --tf32=null الإعدادات الافتراضية لـ PyTorch.

Update on GitHub