Diffusers documentation
LoopSequentialPipelineBlocks
快速入门
推理
使用扩散流水线
适配器与个性化
优化与扩展
模块化 Diffusers
概述快速入门来自 DiffusionPipeline状态ModularPipelineBlocksSequentialPipelineBlocksLoopSequentialPipelineBlocksAutoPipelineBlocksModularPipeline引导者ComponentsManager自动文档字符串和参数模板构建自定义块使用 Mellon 搭配自定义块
训练与微调
资源
贡献
API
LoopSequentialPipelineBlocks
LoopSequentialPipelineBlocks 是一种多块类型,用于在循环中组合其他 ModularPipelineBlocks。数据以循环方式流动,使用 inputs 和 intermediate_outputs,并且每个块都会迭代执行。这通常用于创建去噪循环,该循环默认是迭代的。
本指南将向您展示如何创建 LoopSequentialPipelineBlocks。
循环包装器
LoopSequentialPipelineBlocks,也称为循环包装器,因为它定义了循环结构、迭代变量和配置。在循环包装器中,您需要以下变量。
loop_inputs是用户提供的值,等同于inputs。loop_intermediate_outputs是由该 block 创建并添加到 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 函数,请参阅回调指南中的 模块化流水线。