Diffusers documentation

状态

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

状态

Blocks 依赖 PipelineState 和 BlockState 数据结构来通信和共享数据。

状态描述
PipelineState维护管道执行所需的整体数据,并允许各个块读取和更新其数据。
BlockState允许每个块使用 inputs 中的必要数据来执行其计算

本指南将解释状态如何工作,以及它们如何连接各个块。

PipelineState

PipelineState 是所有 block 的全局状态容器。它维护流水线的完整运行时状态,并为 block 读写共享数据提供了一种结构化的方式。

PipelineState 将所有数据存储在一个 values 字典中,该字典是一个可变的状态,包含用户提供的输入值以及由各个 block 生成的中间输出值。如果某个 block 修改了某个 input,在调用 set_block_state 之后,该修改将反映在 values 字典中。

PipelineState(
  values={
    'prompt': 'a cat'
    'guidance_scale': 7.0
    'num_inference_steps': 25
    'prompt_embeds': Tensor(dtype=torch.float32, shape=torch.Size([1, 1, 1, 1]))
    'negative_prompt_embeds': None
  },
)

BlockState

BlockState 是单个 block 从 PipelineState 中获取执行其计算所需的相关变量的局部视图。

像 block_state.image 这样,直接将这些变量作为属性访问。

BlockState(
    image: <PIL.Image.Image image mode=RGB size=512x512 at 0x7F3ECC494640>
)

当某个块的 __call__ 方法被执行时,它会通过 self.get_block_state(state) 获取 BlockState,执行其操作,并通过 self.set_block_state(state, block_state) 更新 PipelineState。

def __call__(self, components, state):
    # retrieve BlockState
    block_state = self.get_block_state(state)

    # computation logic on inputs

    # update PipelineState
    self.set_block_state(state, block_state)
    return components, state

状态交互

PipelineState 与 BlockState 之间的交互由块的 inputs 和 intermediate_outputs 定义。

  • inputs,一个 block 可以修改某个输入(例如 block_state.image),并通过调用 set_block_state 将该更改全局传播到 PipelineState。
  • intermediate_outputs 是某个 block 创建的新变量。它会被添加到 PipelineState 的 values 字典中,供后续的 block 使用,也可以由用户作为 pipeline 的最终输出进行访问。
Update on GitHub