Diffusers documentation
التوازي
التوازي
تساعد استراتيجيات التوازي في تسريع محولات الانتشار (diffusion transformers) من خلال توزيع العمليات الحسابية على عدة أجهزة، مما يتيح أوقات استدلال/تدريب أسرع. راجع دليل الاستدلال الموزّع لمعرفة المزيد.
ParallelConfig
فئة diffusers.ParallelConfig
< source >( context_parallel_config: diffusers.models._modeling_parallel.ContextParallelConfig | None = Nonetensor_parallel_config: diffusers.models._modeling_parallel.TensorParallelConfig | None = None_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None )
إعدادات لتطبيق أنواع مختلفة من التوازي.
ContextParallelConfig
فئة diffusers.ContextParallelConfig
< source >( ring_degree: int | None = Noneulysses_degree: int | None = Noneconvert_to_fp32: bool = Truerotate_method: typing.Literal['allgather', 'alltoall'] = 'allgather'mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = Noneulysses_anything: bool = Falsering_anything: bool = False_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None_flattened_mesh: DeviceMesh = None_ring_mesh: DeviceMesh = None_ulysses_mesh: DeviceMesh = None_ring_local_rank: int = None_ulysses_local_rank: int = None )
المعاملات
- ring_degree (
int, اختياري، القيمة الافتراضية1) — عدد الأجهزة المستخدمة لـ Ring Attention. يتم تقسيم التسلسل عبر الأجهزة. تحسب كل جهاز الانتباه بين Q المحلي لديها وقطع KV التي تُمرَّر تسلسليًا حول الحلقة. ذاكرة أقل (تحتفظ فقط بـ 1/N من KV في كل مرة)، وتُدمج الحساب مع الاتصال، لكنها تتطلب N تكرارات لرؤية جميع الرموز. الأفضل للتسلسلات الطويلة مع ذاكرة/عرض نطاق محدود. عدد الأجهزة المستخدمة لـ ring attention داخل منطقة التوازي السياقي. يجب أن يكون قاسمًا لعدد الأجهزة الإجمالي في شبكة التوازي السياقي. - ulysses_degree (
int، اختياري، القيمة الافتراضية1) — عدد الأجهزة المستخدمة لـ Ulysses Attention. يتم تقسيم التسلسل عبر الأجهزة. تحسب كل جهاز QKV المحلي، ثم تجمع جميع مقاطع KV عبر all-gather لحساب الانتباه الكامل في مسار واحد. يتطلب ذاكرة أعلى (تخزين جميع KV) واتصالات all-to-all عالية النطاق الترددي، لكنه يوفر زمن استجابة أقل. يُعد الخيار الأفضل للتسلسلات المتوسطة مع نطاق ترددي جيد للتوصيل بين الأجهزة. - convert_to_fp32 (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان سيتم تحويل المخرجات و LSE إلى float32 من أجل الاستقرار العددي في ring attention. - rotate_method (
str، اختياري، القيمة الافتراضية"allgather") — الطريقة المستخدمة لتدوير حالات المفتاح/القيمة عبر الأجهزة في ring attention. حاليًا، يتم دعم"allgather"فقط. - ulysses_anything (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان سيتم تفعيل وضع “Ulysses Anything” الذي يدعم أطوال تسلسلات وعدد رؤوس عشوائية لا تقبل القسمة بالتساوي علىulysses_degree. عند التفعيل، يجب أن يكونulysses_degreeأكبر من 1 وأن يكونring_degreeمساوياً لـ 1. - ring_anything (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان سيتم تفعيل وضع “Ring Anything” الذي يدعم أطوال تسلسلات غير محددة. عند التفعيل، يجب أن يكونring_degreeأكبر من 1 وأن يكونulysses_degreeمساوياً لـ 1. - mesh (
torch.distributed.device_mesh.DeviceMesh، اختياري) — شبكة أجهزة مخصصة لاستخدامها في توازي السياق. إذا تم تقديمها، فسيتم استخدام هذه الشبكة بدلاً من إنشاء شبكة جديدة. وهذا مفيد عند دمج توازي السياق مع استراتيجيات توازي أخرى (مثل FSDP، وتوازي الموترات) التي تتشارك نفس شبكة الأجهزة. يجب أن تحتوي الشبكة على بُعدين هما “ring” و “ulysses”. استخدم الحجم 1 للأبعاد غير المستخدمة (على سبيل المثال،mesh_shape=(2, 1, 4)معmesh_dim_names=("ring", "ulysses", "fsdp")لتوازي الحلقة فقط مع FSDP).
إعدادات للتوازي السياقي.
diffusers.hooks.apply_context_parallel
< source >( module: Moduleparallel_config: ContextParallelConfigplan: dict )
تطبيق توازٍ سياقي على نموذج.
TensorParallelConfig
فئة diffusers.TensorParallelConfig
< source >( tp_degree: int = 1mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = None_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None_tp_degree: int = None )
المعاملات
- tp_degree (
int، القيمة الافتراضية1) — عدد الأجهزة التي سيتم تقسيم النموذج عليها. يجب أن يكون قاسماً لعدد رؤوس الانتباه (والأبعاد المخفية لشبكة FFN) في النموذج المُوازى. - mesh (
torch.distributed.device_mesh.DeviceMesh، اختياري) — شبكة أجهزة مخصصة للاستخدام. إذا تم تقديمها، يُستنتجtp_degreeمنmesh.size()ويُتجاهل الحُجّة. مفيد عند دمج TP مع استراتيجيات توازٍ أخرى (مثل CP) التي تتشارك نفس الشبكة.
إعدادات للتوازي على مستوى الموترات.
يقوم توازي الموترات بتقسيم مصفوفات الأوزان (عمودياً وصفوفياً) عبر الأجهزة. يحسب كل جهاز نتيجة جزئية؛ ثم يعيد AllReduce/AllGather عند حدود الطبقات بناء المخرجات الكاملة. يستخدم torch.distributed.tensor.parallelize_module مع أنماط التقسيم ColwiseParallel / RowwiseParallel. أنواع الأجهزة المدعومة هي "cuda"، "neuron" و"tpu".
diffusers.hooks.apply_tensor_parallel
< source >( model: Moduleconfig: TensorParallelConfigtp_plan: dictweights_already_sharded: bool = False )
المعاملات
- model (
torch.nn.Module) — النموذج الذي سيتم تقسيمه في مكانه. - config (
TensorParallelConfig) — إعدادات التوازي على مستوى المصفوفات. يجب أن تكون شبكة الأجهزة الخاصة بها مُهيأة مسبقًا باستخدامconfig.setup(...). - tp_plan (
dict) — تعيين مسطّح من أنماط أسماء الوحدات إلى نمط"colwise"/"rowwise"(أو نسخة مضغوطة)، وهو عادةً_tp_planالخاص بالنموذج. - weights_already_sharded (
bool، القيمة الافتراضيةFalse) — ما إذا كانت المعاملات المخططة هي بالفعل شتاتDTensor، كما هي بعد تحميلfrom_pretrainedبالتدفق. إذا كانتTrue، يتم تسجيل خطافات الأمامية فقط. يتم تمرير هذا بشكل صريح بدلاً من اكتشافه، لأن معاملًا مخططًا مفقودًا من نقطة الفحص سيظل متجهًا افتراضيًا (meta tensor) وسيجعل الاكتشاف يقول “غير مجزأ” لنموذج هو في الواقع مجزأ جزئيًا.
تطبيق توازي الموترات على نموذج من _tp_plan المسطّح الخاص به.