Diffusers documentation
Состояния
Состояния
Блоки полагаются на структуры данных PipelineState и BlockState для обмена и общего использования данных.
| Состояние | Описание |
|---|---|
| PipelineState | Хранит общие данные, необходимые для выполнения конвейера, и позволяет блокам читать и обновлять эти данные. |
| BlockState | Позволяет каждому блоку выполнять свои вычисления с необходимыми данными из inputs |
В этом руководстве объясняется, как работают состояния и как они связывают блоки.
PipelineState
PipelineState — это глобальный контейнер состояния для всех блоков. Он хранит полное состояние конвейера во время выполнения и предоставляет структурированный способ для блоков читать и записывать общие данные.
PipelineState хранит все данные в словаре values, который представляет собой изменяемое состояние, содержащее входные значения, предоставленные пользователем, и промежуточные выходные значения, генерируемые блоками. Если блок изменяет input, это изменение отразится в словаре values после вызова set_block_state.
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 представляет собой локальный вид тех переменных, которые отдельному блоку необходимы из PipelineState для выполнения вычислений.
Обращайтесь к этим переменным напрямую как к атрибутам, например block_state.image.
BlockState(
image: <PIL.Image.Image image mode=RGB size=512x512 at 0x7F3ECC494640>
)Когда выполняется метод __call__ блока, он получает BlockState с помощью self.get_block_state(state), выполняет свои операции и обновляет PipelineState с помощью 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Взаимодействие состояния
Взаимодействие PipelineState и BlockState определяется параметрами inputs и intermediate_outputs блока.
inputs, блок может изменить входной параметр — например,block_state.image— и это изменение может быть глобально передано в PipelineState с помощью вызоваset_block_state.intermediate_outputs— это новая переменная, создаваемая блоком. Она добавляется в словарьvaluesобъекта PipelineState и доступна для последующих блоков или может быть получена пользователем в качестве итогового вывода конвейера.