Transformers documentation

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

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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

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

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

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

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

إن استنتاج الحدود من position_ids ليس النهج المفضّل، ولا يعمل إلا مع نماذج الانتباه القياسية. تتجاهل نماذج الانتباه الخطي مثل Qwen3-Next وQwen3.5 (Gated DeltaNet) والنماذج القائمة على الالتفاف حدود position_ids وتتطلب مُجمِّع البيانات. راجع نماذج الانتباه الخطي والالتفاف.

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

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

استخدم DataCollatorWithFlattening لتسطيح كل دفعة وإرجاع معلومات الحدود. اضبط return_flash_attn_kwargs=True حتى يقوم المُجمِّع بحساب الحدود مسبقًا بدلاً من تركها لتُستنتج من position_ids وقت التشغيل. مرّره إلى Trainer ولا تضف attention_mask، لأن الدفعة المسطّحة ترمّز الحدود بالفعل، والقناع يتعارض مع التخطيط المُحزَّم.

يعتمد Padding-free على تطبيق FlashAttention لنماذج الانتباه القياسية، لأن نوى FlashAttention فقط هي التي تكشف عن مسار الطول المتغير الذي تحتاجه الدفعة المسطحة.

قم بتثبيت مكتبة kernels، والتي تقوم بجلب نواة FlashAttention جاهزة مسبقاً دون الحاجة إلى بناء محلي. كما تعمل كبديل احتياطي عندما لا تكون flash-attn مثبتة محلياً. حمّل النموذج باستخدام attn_implementation="kernels-community/flash-attn2".

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) الخيار المدعوم الوحيد لهذه النماذج.

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

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

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، بينما تستخدم نماذج Mamba مثل Bamba حزمة mamba-ssm. وتعتمد الحزمتان على causal-conv1d للعمليات التلافيفية. وفي غياب النوى المناسبة، يلجأ النموذج إلى تنفيقات مرجعية تتجاهل معاملات الحدود (boundary kwargs) وتخلط بين الرموز عبر العينات المختلفة.

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

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

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

Update on GitHub