Buckets:

hf-doc-build/doc / diffusers /main /ko /modular_diffusers /loop_sequential_pipeline_blocks.md
mishig's picture
|
download
raw
5.17 kB

LoopSequentialPipelineBlocks

LoopSequentialPipelineBlocks는 다른 ModularPipelineBlocks를 루프 안에서 조합하는 멀티 블록 유형입니다. 데이터는 inputs와 intermediate_outputs를 사용하여 순환적으로 흐르며, 각 블록은 반복적으로 실행됩니다. 이는 기본적으로 반복적인 디노이징 루프를 생성하는 데 일반적으로 사용됩니다.

이 가이드에서는 LoopSequentialPipelineBlocks를 만드는 방법을 보여줍니다.

루프 래퍼

LoopSequentialPipelineBlocks는 루프 구조, 반복 변수 및 구성을 정의하기 때문에 loop wrapper로도 알려져 있습니다. loop wrapper 안에는 다음 변수가 필요합니다.

  • loop_inputs는 사용자가 제공한 값이며 inputs와 동일합니다.
  • loop_intermediate_outputs는 블록에 의해 새로 생성되어 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

loop wrapper는 현재 반복 인덱스 같은 추가 인수를 루프 블록에 전달할 수 있습니다.

루프 블록

루프 블록은 ModularPipelineBlocks이지만 __call__ 메서드의 동작 방식이 다릅니다.

  • 반복 변수를 루프 래퍼에서 수신합니다.
  • It works directly with the BlockState instead of the PipelineState.
  • BlockState를 가져오거나 업데이트할 필요가 없습니다.

Loop 블록은 루프의 각 반복에서 값이 누적되고 변경될 수 있도록 동일한 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_state

LoopSequentialPipelineBlocks

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 함수를 실행하는 블록을 추가하려면, 콜백 가이드의 모듈형 파이프라인을 참고하세요.

Xet Storage Details

Size:
5.17 kB
·
Xet hash:
2e92e6b04ede66e219cea6d86daa24db8bd04e39d845245f7e1bba9425e8ee7c

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.