Diffusers documentation

LoopSequentialPipelineBlocks

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

LoopSequentialPipelineBlocks

LoopSequentialPipelineBlocks هي نوع متعدد الكتل يجمع كتل ModularPipelineBlocks أخرى معًا في حلقة. تتدفق البيانات بشكل دائري باستخدام inputs وintermediate_outputs، وتُنفَّذ كل كتلة بشكل تكراري. يُستخدم هذا عادةً لإنشاء حلقة إزالة الضوضاء (denoising loop) التي تكون تكرارية افتراضيًا.

يُظهر لك هذا الدليل كيفية إنشاء LoopSequentialPipelineBlocks.

غلاف الحلقة

LoopSequentialPipelineBlocks، يُعرف أيضًا بـ loop wrapper لأنه يحدد بنية الحلقة ومتغيرات التكرار والإعدادات. داخل الـ loop wrapper، تحتاج إلى المتغيرات التالية.

  • loop_inputs هي قيم يوفّرها المستخدم وتُكافئ inputs.
  • loop_intermediate_outputs هي متغيرات وسيطة جديدة ينشئها الكتلة وتُضاف إلى PipelineState. وهي مكافئة لـ intermediate_outputs.
  • تعرف طريقة __call__ بنية الحلقة ومنطق التكرار.
import torch
from diffusers.modular_pipelines import LoopSequentialPipelineBlocks, ModularPipelineBlocks, InputParam, OutputParam

class LoopWrapper(LoopSequentialPipelineBlocks):
    model_name = "test"
    @property
    def description(self):
        return "I'm a loop!!"
    @property
    def loop_inputs(self):
        return [InputParam(name="num_steps")]
    @torch.no_grad()
    def __call__(self, components, state):
        block_state = self.get_block_state(state)
        # Loop structure - can be customized to your needs
        for i in range(block_state.num_steps):
            # loop_step executes all registered blocks in sequence
            components, block_state = self.loop_step(components, block_state, i=i)
        self.set_block_state(state, block_state)
        return components, state

يمكن لغلّف الحلقة تمرير حِجج إضافية، مثل فهرس التكرار الحالي، إلى كتل الحلقة.

كتل الحلقات

كتلة الحلقة هي ModularPipelineBlocks، لكن طريقة __call__ تتصرف بشكل مختلف.

  • يستقبل متغير التكرار من غلاف الحلقة.
  • يعمل مباشرة مع BlockState بدلاً من PipelineState.
  • لا يتطلب استرداد BlockState أو تحديثه.

تشارك كتل الحلقات نفس BlockState للسماح بتراكم القيم وتغييرها في كل تكرار داخل الحلقة.

class LoopBlock(ModularPipelineBlocks):
    model_name = "test"
    @property
    def inputs(self):
        return [InputParam(name="x")]
    @property
    def intermediate_outputs(self):
        # outputs produced by this block
        return [OutputParam(name="x")]
    @property
    def description(self):
        return "I'm a block used inside the `LoopWrapper` class"
    def __call__(self, components, block_state, i: int):
        block_state.x += 1
        return components, block_state

LoopSequentialPipelineBlocks

استخدم طريقة from_blocks_dict() لإضافة كتلة الحلقة إلى غلاف الحلقة لإنشاء LoopSequentialPipelineBlocks.

loop = LoopWrapper.from_blocks_dict({"block1": LoopBlock})

أضِف المزيد من كتل الحلقات لتنفيذها داخل كل تكرار باستخدام from_blocks_dict(). يتيح لك ذلك تعديل الكتل دون تغيير منطق الحلقة نفسه.

loop = LoopWrapper.from_blocks_dict({"block1": LoopBlock(), "block2": LoopBlock})

لإضافة كتلة حلقة إلى حلقة إزالة الضوضاء في خط أنابيب قائم، على سبيل المثال كتلة تُنفّذ دالة callback_on_step_end في كل خطوة، راجع خطوط الأنابيب المعيارية في دليل الاستدعاءات.

Update on GitHub