Diffusers documentation
LoopSequentialPipelineBlocks
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_stateLoopSequentialPipelineBlocks
استخدم طريقة 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 في كل خطوة، راجع خطوط الأنابيب المعيارية في دليل الاستدعاءات.