Transformers documentation

توازي التسلسل في Ulysses

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

توازي التسلسل في Ulysses

Ulysses sequence parallelism (SP) trains on very long sequences by splitting them across multiple GPUs. To compute attention correctly, an all-to-all collective swaps the sharding dimension from sequence to attention heads. Each GPU then has the full sequence and computes attention locally over a subset of heads. A second all-to-all returns to the sequence-sharded layout so the rest of the forward pass continues locally on each chunk.

                        GPU 0                       GPU 1
                   ┌───────────────┐          ┌───────────────┐
  forward          │ tokens 0..N/2 │          │ tokens N/2..N │  ← each GPU holds half the sequence
  (seq-sharded)    │  all H heads  │          │  all H heads  │
                   └───────┬───────┘          └───────┬───────┘
                           └───────── all-to-all ──────┘
                   ┌───────────────┐          ┌───────────────┐
  attention        │ all N tokens  │          │ all N tokens  │  ← now each GPU has the full sequence
  (head-sharded)   │ heads 0..H/2  │          │ heads H/2..H  │  ← but only half the heads
                   └───────┬───────┘          └───────┬───────┘
                           └───────── all-to-all ──────┘
                   ┌───────────────┐          ┌───────────────┐
  forward          │ tokens 0..N/2 │          │ tokens N/2..N │  ← back to seq-sharded
  (seq-sharded)    │  all H heads  │          │  all H heads  │
                   └───────────────┘          └───────────────┘

يتناول هذا الدليل مكوّن موازاة التسلسل Ulysses ضمن ALST (تدريب التسلسلات الطويلة القطبية). كما يتضمن نظام ALST الكامل مكوّني TiledMLP وإفراغ نقاط التفتيش للتفعيل، وهما غير متوفرين في Transformers. راجع دليل DeepSpeed ALST للاطلاع على النظام الكامل.

إعداد

يتطلب توازي التسلسل (Sequence parallelism) إصدار Accelerate v1.12.0 وبطاقتي GPU على الأقل. قم بإعداد توازي التسلسل في ParallelismConfig الخاص بـ Accelerate وقم بتمريره إلى parallelism_config أو إلى ملف إعدادات Accelerate.

parallelism_config
ملف إعدادات Accelerate
from accelerate.utils import ParallelismConfig, DeepSpeedSequenceParallelConfig

parallelism_config = ParallelismConfig(
    sp_backend="deepspeed",
    sp_size=4,
    dp_replicate_size=1,
    sp_handler=DeepSpeedSequenceParallelConfig(
        sp_seq_length_is_variable=True,
        sp_attn_implementation="flash_attention_2",
    ),
)

training_args = TrainingArguments(
    ...,
    deepspeed="path/to/deepspeed_config.json",
    parallelism_config=parallelism_config,
)

شغّل accelerate launch مع سكربت مبني على Trainer.

accelerate launch --num_processes 4 train.py \
--output_dir output_dir \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 1

الحقول التالية مهمة لإعداد توازي التسلسل.

يتولى Trainer تلقائيًا معالجة تقسيم DataLoader، وتوليد position_ids، وإزاحة التسميات، وتجميع الخسارة عبر رتب SP. إذا كنت تكتب حلقة تدريب مخصصة، فراجع دليل Sequence Parallelism الخاص بـ Accelerate بدلاً من ذلك.

  • يجب تعيين sp_backend إلى "deepspeed" لاستخدام موازاة تسلسل Ulysses.

  • sp_size هو عدد وحدات معالجة الرسوميات التي تعالج تسلسلاً واحداً بالتوازي. يستقبل كل رتبة SP تدفّق بيانات فريداً من DataLoader، على عكس توازي الموترات حيث تستقبل جميع الرتب بيانات متطابقة. الحجم الفعّال هو dp_world_size = world_size / sp_size، لذا مع 4 وحدات معالجة رسوميات وsp_size=4، يكون dp_world_size=1 لحسابات حجم الدفعة. يجب أيضاً ملء التسلسلات إلى مضاعف لـsp_size. اضبط pad_to_multiple_of في مجمّع البيانات الخاص بك وفقاً لذلك.

    يجب أن يكون عدد رؤوس الانتباه قابلاً للقسمة على sp_size. يدعم النموذج الذي يحتوي على 32 رأساً قيم sp_size التالية: 1، 2، 4، 8، 16، أو 32.

    from transformers import DataCollatorForLanguageModeling
    
    data_collator = DataCollatorForLanguageModeling(
        tokenizer=tokenizer,
        mlm=False,
        pad_to_multiple_of=sp_size,
    )
  • يتحكم sp_seq_length_is_variable في معالجة طول التسلسل المتغير. اضبطه على True (موصى به) عند وجود أطوال متغيرة بين الدفعات. اضبطه على False عندما تكون جميع التسلسلات ممتلئة حتى طول ثابت محدد بواسطة sp_seq_length.

  • sp_attn_implementation يحدد واجهة معالجة الانتباه. القيم المدعومة هي "sdpa" أو "flash_attention_2" أو "flash_attention_3". يُنصح باستخدام FlashAttention، خاصة عند حزم عينات متعددة في دفعة واحدة. قد يؤدي SDPA إلى معالجة انتباه غير صحيحة عبر حدود العينات عند حزمها. لا يتم دعم الانتباه الفوري (Eager attention) لأن قناع الانتباه ذي الأبعاد الأربعة attention_mask يُستبعد لأسباب تتعلق بالذاكرة والتوسع.

الجمع مع توازي البيانات

تستخدم موازاة التسلسل وموازاة البيانات نفس وحدات معالجة الرسوميات، ولا تتطلب موازاة التسلسل أي أجهزة إضافية. لتشغيل كلا النوعين، اضبط dp_replicate_size أو dp_shard_size بحيث يساوي dp_replicate_size × dp_shard_size × sp_size إجمالي عدد وحدات معالجة الرسوميات لديك.

على سبيل المثال، مع 8 وحدات معالجة رسومية وsp_size=4، اضبط dp_replicate_size=2 (2 × 1 × 4 = 8).

parallelism_config = ParallelismConfig(
    sp_backend="deepspeed",
    sp_size=4,
    dp_replicate_size=2,
    sp_handler=DeepSpeedSequenceParallelConfig(
        sp_seq_length_is_variable=True,
        sp_attn_implementation="flash_attention_2",
    ),
)

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

Update on GitHub