# ضبط دقيق فعّال من حيث المعلمات باستخدام 🤗 PEFT

[🤗 PEFT](https://github.com/huggingface/peft) (Parameter-Efficient Fine-Tuning) هي مكتبة لتكييف النماذج المُسبقة التدريب الكبيرة بكفاءة، مثل سياسات التدريب المسبق (مثل SmolVLA، π₀، ...)، لمهام جديدة دون تدريب جميع معاملات النموذج، مع تحقيق أداء مماثل.

قم بتثبيت الحزمة الاختيارية `lerobot[peft]` لتفعيل دعم PEFT.

للقراءة عن جميع طرق التكيف الممكنة، يُرجى الرجوع إلى [وثائق 🤗 PEFT](https://huggingface.co/docs/peft/index).

## تدريب SmolVLA

في هذا القسم سنُظهر لك كيفية تدريب سياسة SmolVLA المُدرَّبة مسبقًا باستخدام PEFT على مجموعة بيانات libero. ولإيجاز الأمر، سنقوم بالتدريب على مجموعة الفرع `libero_spatial` فقط. سنستخدم `lerobot/smolvla_base` كنموذج للضبط الدقيق بكفاءة المعلمات:

```
lerobot-train \
 --policy.path=lerobot/smolvla_base \
 --policy.repo_id=your_hub_name/my_libero_smolvla \
 --dataset.repo_id=HuggingFaceVLA/libero \
 --policy.output_features=null \
 --policy.input_features=null \
 --policy.optimizer_lr=1e-3 \
 --policy.scheduler_decay_lr=1e-4 \
 --env.type=libero \
 --env.task=libero_spatial \
 --steps=100000 \
 --batch_size=32 \
 --peft.method_type=LORA \
 --peft.r=64 \
 --peft.lora_alpha=64
```

لاحظ معامل `--peft.method_type` الذي يتيح لك اختيار طريقة PEFT التي تريد استخدامها. هنا نستخدم [LoRA](https://huggingface.co/docs/peft/main/en/package_reference/lora) (Low-Rank Adapter) وهي على الأرجح أكثر طرق الضبط الدقيق شيوعاً حتى الآن. تعني التكيّف منخفض الرتبة أننا نضبط مصفوفة ذات رتبة منخفضة نسبياً بدلاً من مصفوفة الأوزان الكاملة. يمكن تحديد هذه الرتبة باستخدام معامل `--peft.r`، ومعامل توسيع LoRA باستخدام `--peft.lora_alpha` (حيث `scaling = lora_alpha / r`). كلما زادت الرتبة، اقتربت أكثر من الضبط الدقيق الكامل

توجد طرق أكثر تعقيدًا تحتوي على عدد أكبر من المعاملات. هذه الطرق غير مدعومة بعد، فلا تتردد في فتح مشكلة إذا كنت ترغب في رؤية دعم لطريقة PEFT محددة.

بشكل افتراضي، يستهدف PEFT طبقات `q_proj` و`v_proj` الخاصة بخبير نموذج اللغة في SmolVLA. كما يستهدف مصفوفات الإسقاط للحالة والإجراء، نظراً لأنها الأكثر احتمالاً لأن تكون معتمدة على المهمة. إذا كنت بحاجة إلى استهداف طبقات مختلفة، يمكنك استخدام `--peft.target_modules` لتحديد الطبقات المراد استهدافها. يمكنك الرجوع إلى توثيق طريقة PEFT المعنية لمعرفة المدخلات المدعومة، (على سبيل المثال، [توثيق target_modules الخاص بـ LoRA](https://huggingface.co/docs/peft/main/en/package_reference/lora#peft.LoraConfig.target_modules)). عادةً ما يتم دعم قائمة من لاحقات الأسماء أو تعبير نمطي. على سبيل المثال، لاستهداف وحدات MLP الخاصة بـ `lm_expert` بدلاً من إسقاطات `q` و`v`، استخدم:

```
--peft.target_modules='(model\.vlm_with_expert\.lm_expert\..*\.(down|gate|up)_proj|.*\.(state_proj|action_in_proj|action_out_proj|action_time_mlp_in|action_time_mlp_out))'
```

في حال كنت بحاجة إلى ضبط كامل لطبقة بدلاً من مجرد تكييفها، يمكنك تقديم قائمة لاحقات الطبقات إلى معامل `--peft.full_training_modules`:

```
--peft.full_training_modules='["state_proj"]'
```

يمكن عادةً توسيع معدل التعلم ومعدل التعلم المستهدف المجدول بمعامل 10 مقارنةً بمعدل التعلم المستخدم في الضبط الدقيق الكامل (على سبيل المثال، 1e-4 بشكل طبيعي، وبالتالي 1e-3 عند استخدام LoRA).

يعمل PEFT أيضاً مع التدريب المتعدد المعالجات (FSDP2 و HSDP)، راجع [التدريب متعدد المعالجات](./multi_gpu_training#peft).

## سياسات أخرى

تعمل أعلام `--peft.*` نفسها مع أي سياسة مُدرَّبة مسبقًا. بعض السياسات (مثل SmolVLA وπ₀ وπ₀.₅ وMolmoAct2) تأتي مع `target_modules` افتراضية مدمجة، لذا يكفي استخدام `--peft.method_type=LORA`. أما الأخرى فلا تأتي بها، وستطلب منك تمرير `--peft.target_modules` صراحةً، على سبيل المثال LingBot-VA، حيث تُوثَّق أهدافها الموصى بها في [دليلها المخصص](./lingbot_va#training--fine-tuning).

استخدام `--policy.use_peft=true` بمفرده يعادل استخدام `--peft.method_type=LORA` مع الإعدادات الافتراضية.

