Diffusers documentation

状态

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
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