States

Blocks rely on the [~modular_pipelines.PipelineState] and [~modular_pipelines.BlockState] data structures for communicating and sharing data.

State Description
[~modular_pipelines.PipelineState] Maintains the overall data required for a pipeline’s execution and allows blocks to read and update its data.
[~modular_pipelines.BlockState] Allows each block to perform its computation with the necessary data from inputs

This guide explains how states work and how they connect blocks.

PipelineState

The [~modular_pipelines.PipelineState] is a global state container for all blocks. It maintains the complete runtime state of the pipeline and provides a structured way for blocks to read from and write to shared data.

There are two dict’s in [~modular_pipelines.PipelineState] for structuring data.

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

The [~modular_pipelines.BlockState] is a local view of the relevant variables an individual block needs from [~modular_pipelines.PipelineState] for performing it’s computations.

Access these variables directly as attributes like block_state.image.

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

When a block’s __call__ method is executed, it retrieves the [BlockState] with self.get_block_state(state), performs it’s operations, and updates [~modular_pipelines.PipelineState] with self.set_block_state(state, block_state).

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

State interaction

[~modular_pipelines.PipelineState] and [~modular_pipelines.BlockState] interaction is defined by a block’s inputs, and intermediate_outputs.