# التدريب دون حشو

يتضمن التدريب بدون حشو (المعروف أيضًا بالتجميع) دمج عدة عينات في تسلسل واحد بدلاً من حشو كل عينة على حدة إلى طول ثابت. يحتاج النموذج إلى معرفة مكان انتهاء كل عينة حتى لا تخلط الانتباه (الخطي) الرموز بين العينات المختلفة.

هناك طريقتان لتوفير تلك الحدود.

- جهّزها مسبقًا باستخدام مُجمِّع بيانات.
- استنتجها من `position_ids` وقت التشغيل.

النهج الموصى به هو مُجمِّع البيانات (data collator). يشرح هذا الدليل السبب، ويتناول محاذير مسار `position_ids`.

> [!WARNING]
> إن استنتاج الحدود من `position_ids` ليس النهج المفضّل، ولا يعمل إلا مع نماذج الانتباه القياسية. تتجاهل نماذج الانتباه الخطي مثل Qwen3-Next وQwen3.5 (Gated DeltaNet) والنماذج القائمة على الالتفاف حدود `position_ids` وتتطلب مُجمِّع البيانات. راجع [نماذج الانتباه الخطي والالتفاف](#linear-attention-and-convolution-models).

## تجهيز الحدود باستخدام مُجمِّع بيانات

إعداد معاملات boundary kwargs مسبقًا يُزيل المشكلات المذكورة أعلاه، ويتصرف بشكل متطابق سواء قمت بالتجميع أم لم تقم به.

استخدم [DataCollatorWithFlattening](/docs/transformers/main/ar/main_classes/data_collator#transformers.DataCollatorWithFlattening) لتسطيح كل دفعة وإرجاع معلومات الحدود. اضبط `return_flash_attn_kwargs=True` حتى يقوم المُجمِّع بحساب الحدود مسبقاً بدلاً من تركها لتُستنتج من `position_ids` وقت التشغيل. مرّره إلى [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) ولا تضف `attention_mask`، لأن الدفعة المسطّحة ترمّز الحدود بالفعل، والقناع يتعارض مع التخطيط المُجمَّع.

> [!TIP]
> يعتمد Padding-free على تطبيق FlashAttention لنماذج الانتباه القياسية، لأن نوى FlashAttention فقط هي التي تكشف عن مسار الطول المتغير الذي تحتاجه الدفعة المسطحة.
>
> قم بتثبيت مكتبة [kernels](./kernels)، والتي تستخرج نواة FlashAttention جاهزة مسبقًا دون الحاجة إلى بناء محلي. كما تعمل كبديل احتياطي عندما لا تكون [flash-attn](https://github.com/Dao-AILab/flash-attention) مثبتة محليًا. حمّل النموذج باستخدام `attn_implementation="kernels-community/flash-attn2"`.

```python
import torch
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer, DataCollatorWithFlattening, Trainer, TrainingArguments

model_id = "meta-llama/Llama-3.2-1B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    attn_implementation="flash_attention_2",
    device_map="auto",
)

dataset = load_dataset("Salesforce/wikitext", "wikitext-2-raw-v1", split="train")
dataset = dataset.map(
    lambda example: tokenizer(example["text"], truncation=True, max_length=512),
    remove_columns=dataset.column_names,
)

# return_flash_attn_kwargs=True precomputes the sequence boundaries
data_collator = DataCollatorWithFlattening(return_flash_attn_kwargs=True)

trainer = Trainer(
    model=model,
    args=TrainingArguments(output_dir="padding-free-llama"),
    train_dataset=dataset,
    data_collator=data_collator,
)
trainer.train()
```

## استنتاج الحدود من position_ids

يمكن لـ FlashAttention اكتشاف الدفعات الخالية من الحشو من `position_ids` وحدها، وتبقى من أجل التوافق العكسي، لأن أطر العمل التابعة لها مثل TRL تعتمد عليها.

يعتمد استخدام `position_ids` على مشكلتين.

- إن اكتشاف التسلسلات المعبأة من `position_ids` هو فحص ديناميكي يعتمد على البيانات. يعمل دون تجميع، لكن تحت `torch.compile` يتسبب في انقطاع الرسم البياني. حاليًا، يُقيَّد هذا الفحص بـ `batch_size == 1` لتقليل تكرار تشغيله، نظرًا لأن أحجام الدفعات الفعلية عادةً ما تكون أكبر.
- يفرض FlashAttention المُجمَّع أن تكون بعض معاملات kwargs أعدادًا صحيحة من نوع `int` في بايثون. استنتاجها من `position_ids` وقت التشغيل يفرض مزامنة من الجهاز إلى المضيف، وفي إصدارات PyTorch الأقدم، كسرًا إضافيًا للرسوم البيانية ناتجًا عن تحويل المصفوفة إلى عدد صحيح.

## نماذج الانتباه الخطي والتموّج

لا يتوفر مسار يعتمد على `position_ids` وحدها، وذلك بتصميم مقصود، لطبقات Gated DeltaNet (GDN) وطبقات الانتباه الخطي الأخرى واللافحات السببية. يعدّ تجهيز البيانات باستخدام مُجمِّع البيانات (collator) الخيار المدعوم الوحيد لهذه النماذج.

> [!WARNING]
> لا تعتمد على `position_ids` وحدها في نماذج GDN أو الانتباه الخطي أو التحويلات التكرارية السببية. جهّز معاملات الحدود (boundary kwargs)، بما في ذلك `seq_idx`، باستخدام مُجمِّع البيانات (data collator).

لنماذج هذه، اضبط كلًا من `return_flash_attn_kwargs=True` و`return_seq_idx=True`.

```python
from transformers import DataCollatorWithFlattening

data_collator = DataCollatorWithFlattening(
    return_flash_attn_kwargs=True,
    return_seq_idx=True,
)
```

تعتمد حزم النواة الدقيقة على التنفيذ الأصلي للنموذج. فأنماذج Gated DeltaNet مثل Qwen3-Next وQwen3.5 تستخدم [flash-linear-attention](https://github.com/fla-org/flash-linear-attention)، بينما تستخدم نماذج Mamba مثل Bamba حزمة [mamba-ssm](https://github.com/state-spaces/mamba). وتعتمد الحزمتان على [causal-conv1d](https://github.com/Dao-AILab/causal-conv1d) للعمليات التلافيفية. وفي غياب النوى المناسبة، يلجأ النموذج إلى تنفيقات مرجعية تتجاهل معاملات الحدود (boundary kwargs) وتخلط بين الرموز عبر العينات المختلفة.

> [!TIP]
> تتوفر العديد من هذه النوى أيضًا عبر مكتبة [kernels](./kernels)، والتي يمكنها جلب نسخة متوافقة لك. عادةً ما لا يزال تثبيت flash-linear-attention يتطلب تثبيتًا مباشرًا.

عند غياب معاملات الحدود (boundary kwargs)، تعامل النوى (kernels) على نحو صامت مع الدفعة (batch) بأكملها على أنها تسلسل واحد. لا يُطلق أي خطأ أو تحذير، لأن الفحص في وقت التشغيل سيضيف فرعًا يعتمد على البيانات، مما يتعارض مع `torch.compile`.

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

- راجع دليل [منسّقي البيانات](./data_collators) للاطّلاع على منسّقات أخرى.
- تصفّح مرجع واجهة برمجة التطبيقات الخاص بـ [DataCollatorWithFlattening](/docs/transformers/main/ar/main_classes/data_collator#transformers.DataCollatorWithFlattening) للاطلاع على المجموعة الكاملة من الحُجج.
- اقرأ [تحسين كفاءة التدريب في Hugging Face من خلال التعبئة باستخدام Flash Attention](https://huggingface.co/blog/packing-with-FA2) للاطلاع على معايير الأداء وشرح أعمق.

