Transformers documentation
توازي التسلسل في Ulysses
توازي التسلسل في 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.
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
شغّل الأمر accelerate config وأجب عن الأسئلة المتعلقة بمكوناتك المادية وإعداد التدريب لإنشاء ملف default_config.yaml في ذاكرتك المؤقتة.
distributed_type: DEEPSPEED
deepspeed_config:
deepspeed_config_file: path/to/ds_config.json
machine_rank: 0
num_machines: 1
num_processes: 4
parallelism_config:
parallelism_config_sp_size: 4
parallelism_config_dp_replicate_size: 1
parallelism_config_sp_backend: deepspeed
parallelism_config_sp_seq_length_is_variable: true
parallelism_config_sp_attn_implementation: flash_attention_2شغّل accelerate launch مع سكربت مبني على Trainer.
accelerate launch --config_file alst_config.yaml 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",
),
)الخطوات التالية
- التوازي السياقي مع FSDP2 (
cp_size) منفصل عن Ulysses (sp_size). راجع التقييم مع التوازي السياقي. - يتناول دليل التسلسل المتوازي Sequence Parallelism في Accelerate تنفيذ Ulysses بتفصيل أكبر، ويوضح كيفية كتابة حلقة تدريب مخصصة.
- يتناول دليل DeepSpeed ALST نظام ALST بالكامل، بما في ذلك TiledMLP وإفراغ نقاط التفتيش التفعيل.
- يوضح دليل طرق التوازي كيفية دمج توازي التسلسل مع استراتيجيات أخرى مثل ZeRO.
- يشرح منشور المدونة Ulysses Sequence Parallelism: Training with Million-Token Contexts كيفية عمل Ulysses وكيفية دمجه في Accelerate وTrainer وSFTTrainer.