# التحقق من النقاط

عادةً ما يخزّن التمرير الأمامي جميع التفعيلات الوسيطة مؤقتًا لإعادة استخدامها في التمرير الخلفي. ومع ذلك، تتناسب التفعيلات مع حجم الدفعة وطول التسلسل. لا يحفظ فحص التدرجات سوى تفعيلات معينة ويتخلص من الباقي. وهذا يجبر التمرير الخلفي على إعادة حساب بعض التفعيلات على الفور عند الحاجة إليها.

```text
Normal training:
  Forward:   [L1]→[L2]→[L3]→[L4]   (save ALL activations)
  Backward:  ←uses cached activations everywhere

Gradient checkpointing:
  Forward:   [L1]→[L2]→[L3]→[L4]   (save only at checkpoints, discard the rest)
  Backward:  ←reaches L2, recomputes L2→L3 from scratch, uses it, discards it
```

يكون التدريب عادةً أبطأ لأن مسار الرجوع يعيد حساب التفعيلات المُتخلَّ عنها، لكن الفحص النقطة (checkpointing) يقلل من ذاكرة التفعيلات.

اضبط `gradient_checkpointing=True` لتفعيله.

> [!TIP]
> استخدمه مع [تراكم التدرجات](./grad_accumulation) لتقليل استهلاك الذاكرة بشكل أكبر.

```py
from transformers import TrainingArguments

args = TrainingArguments(
    ...,
    gradient_checkpointing=True,
)
```

## التحقق الجزئي

يعيد Full gradient checkpointing حساب كل طبقة قابلة للنقطة. إذا كان لديك مساحة ذاكرة متاحة، فقم بتقليل عدد الطبقات التي يتم تطبيق النقطة عليها لتبادل بعض توفير الذاكرة مقابل زيادة السرعة.

مرّر `every_n_layers` إلى [gradient_checkpointing_enable()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.gradient_checkpointing_enable) لاختيار فترة إنشاء نقاط التفتيش.

```text
every_n_layers=2

Forward:   input  -> [L1] -> [L2] -> [L3] -> [L4] -> [L5] -> [L6]
                      CP     keep     CP     keep     CP     keep

Backward:  output <- [L6] <- [L5] <- [L4] <- [L3] <- [L2] <- [L1]
                     keep   rerun    keep   rerun    keep   rerun
```

عند استخدام `every_n_layers=2`، يتم إنشاء نقاط تفتيش للطبقة الأولى ولكل طبقة ثانية تليها. تتخلّى طبقات التفتيش عن تنشيطاتها أثناء المرور الأمامي وتعيد حسابها أثناء المرور الخلفي، بينما تحتفظ الطبقات الأخرى بتنشيطاتها في الذاكرة.

```py
model.gradient_checkpointing_enable(every_n_layers=2)
```

القيمة الافتراضية، `every_n_layers=1`، تحفظ نقاط التفتيش لكل طبقة. القيم الأكبر تحفظ نقطة التفتيش للطبقة الأولى ثم كل `n` طبقات بعدها، مع إبقاء تفعيلات الطبقات الأخرى في الذاكرة. على سبيل المثال، `every_n_layers=2` يحفظ نقاط التفتيش للطبقات 1 و3 و5 وما إلى ذلك. تُحسب فقط الوحدات التي ترث من [GradientCheckpointingLayer](/docs/transformers/main/ar/internal/modeling_utils#transformers.GradientCheckpointingLayer). تبقى الوحدات الأخرى التي تدعم نقطة تفتيش التدرج مفعّلة.

للاستخدام الجزئي لنقطة التفتيش للتدرج مع [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer)، اضبط `every_n_layers` في `gradient_checkpointing_kwargs`.

```py
from transformers import TrainingArguments

args = TrainingArguments(
    ...,
    gradient_checkpointing=True,
    gradient_checkpointing_kwargs={"every_n_layers": 4},
)
```

  

## تفريغ التفعيلات المحفوظة

يحافظ Gradient checkpointing على تنشيط واحد لكل طبقة مُفعَّلة في الـ GPU. عند أطوال التسلسلات الطويلة، قد يستهلك ذلك ذاكرة كبيرة (تقريبًا `layers x sequence x hidden x bytes_per_element`). اضبط `offload` لتخزين تلك التنشيطات في ذاكرة المضيف المثبّتة بدلاً من ذلك، على حساب نسخ من الجهاز إلى المضيف أثناء المرور الأمامي ونسخ من المضيف إلى الجهاز أثناء المرور الخلفي.

```py
from transformers import TrainingArguments

args = TrainingArguments(
    ...,
    gradient_checkpointing=True,
    gradient_checkpointing_kwargs={"offload": True},
)
```

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

## الخطوات التالية

- اقرأ وثيقة [استخدام ذاكرة وحدة معالجة الرسوميات](./model_memory_anatomy) لفهم ما الذي يدفع إلى استخدام الذاكرة على وحدة معالجة الرسوميات أثناء التدريب.
- اطّلع على دليل [التدريب بدقة مختلطة](./mixed_precision_training) لمعرفة كيفية استخدام أنواع بيانات بدقة أقل لتقليل الذاكرة بشكل أكبر وتسريع التدريب.
- اطّلع على دليل [Kernels](./kernels) لمعرفة كيفية تسريع التدريب باستخدام نواة مدمجة مخصصة.

