Diffusers documentation

AutoPipelineBlocks

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

AutoPipelineBlocks

AutoPipelineBlocks는 서로 다른 워크플로를 지원하는 블록을 포함하는 멀티 블록 유형입니다. 런타임에 제공된 입력을 기반으로 실행할 서브 블록을 자동으로 선택합니다. 이는 일반적으로 텍스트-이미지 생성, 이미지-이미지 변환, 인페인팅과 같은 여러 워크플로를 편의를 위해 단일 파이프라인으로 패키징하는 데 사용됩니다.

이 가이드는 AutoPipelineBlocks를 만드는 방법을 보여줍니다.

텍스트-이미지, 이미지-이미지, 인페인팅을 위한 세 개의 ModularPipelineBlocks를 생성합니다. 이들은 파이프라인에서 사용할 수 있는 다양한 워크플로를 나타냅니다.

텍스트-이미지
이미지-이미지
인페인팅
import torch
from diffusers.modular_pipelines import ModularPipelineBlocks, InputParam, OutputParam

class TextToImageBlock(ModularPipelineBlocks):
    model_name = "text2img"

    @property
    def inputs(self):
        return [InputParam(name="prompt")]

    @property
    def intermediate_outputs(self):
        return []

    @property
    def description(self):
        return "I'm a text-to-image workflow!"

    def __call__(self, components, state):
        block_state = self.get_block_state(state)
        print("running the text-to-image workflow")
        # Add your text-to-image logic here
        # For example: generate image from prompt
        self.set_block_state(state, block_state)
        return components, state

AutoPipelineBlocks 클래스를 생성하여 서브 블록 클래스 목록과 해당 블록 이름을 포함합니다.

block_trigger_inputs도 포함해야 합니다. 이는 해당 블록을 트리거하는 입력 이름의 목록입니다. 런타임에 트리거 입력이 제공되면 해당 블록이 실행될 블록으로 선택됩니다. 트리거 입력이 감지되지 않는 경우 실행할 기본 블록을 지정하려면 None을 사용하세요.

마지막으로, 어떤 입력이 어떤 워크플로를 트리거하는지 명확히 설명하는 description을 포함하는 것이 중요합니다. 이를 통해 사용자가 특정 워크플로를 실행하는 방법을 이해할 수 있습니다.

from diffusers.modular_pipelines import AutoPipelineBlocks

class AutoImageBlocks(AutoPipelineBlocks):
    # List of sub-block classes to choose from
    block_classes = [InpaintBlock, ImageToImageBlock, TextToImageBlock]
    # Names for each block in the same order
    block_names = ["inpaint", "img2img", "text2img"]
    # Trigger inputs that determine which block to run
    # - "mask" triggers inpaint workflow
    # - "image" triggers img2img workflow (but only if mask is not provided)
    # - if none of above, runs the text2img workflow (default)
    block_trigger_inputs = ["mask", "image", None]

    @property
    def description(self):
        return (
            "Pipeline generates images given different types of conditions!\n"
            + "This is an auto pipeline block that works for text2img, img2img and inpainting tasks.\n"
            + " - inpaint workflow is run when `mask` is provided.\n"
            + " - img2img workflow is run when `image` is provided (but only when `mask` is not provided).\n"
            + " - text2img workflow is run when neither `image` nor `mask` is provided.\n"
        )

블록을 실행하는 방법과 필요한 입력이 무엇인지에 대한 혼란을 피하려면 description을 포함하는 것이 매우 중요합니다. AutoPipelineBlocks는 편리하지만, 제대로 설명되지 않으면 조건부 로직을 파악하기 어려울 수 있습니다.

AutoImageBlocks의 인스턴스를 생성합니다.

auto_blocks = AutoImageBlocks()

중첩된 AutoPipelineBlocks 블록이 더 큰 파이프라인의 하위 블록으로 사용되는 경우와 같이 더 복잡한 구성에서는, 입력에 따라 실제로 실행되는 블록을 추출하기 위해 get_execution_blocks() 메서드를 사용하세요.

auto_blocks.get_execution_blocks(mask=True)

ConditionalPipelineBlocks

AutoPipelineBlocks는 ConditionalPipelineBlocks의 특수한 경우입니다. AutoPipelineBlocks는 트리거 입력이 제공되었는지에 따라 블록을 선택하는 반면, ConditionalPipelineBlocks는 select_block 메서드에 제공된 사용자 정의 선택 로직에 따라 블록을 선택할 수 있습니다.

다음은 ConditionalPipelineBlocks를 직접 사용하여 작성한 동일한 예시입니다:

from diffusers.modular_pipelines import ConditionalPipelineBlocks

class AutoImageBlocks(ConditionalPipelineBlocks):
    block_classes = [InpaintBlock, ImageToImageBlock, TextToImageBlock]
    block_names = ["inpaint", "img2img", "text2img"]
    block_trigger_inputs = ["mask", "image"]
    default_block_name = "text2img"

    @property
    def description(self):
        return (
            "Pipeline generates images given different types of conditions!\n"
            + "This is an auto pipeline block that works for text2img, img2img and inpainting tasks.\n"
            + " - inpaint workflow is run when `mask` is provided.\n"
            + " - img2img workflow is run when `image` is provided (but only when `mask` is not provided).\n"
            + " - text2img workflow is run when neither `image` nor `mask` is provided.\n"
        )

    def select_block(self, mask=None, image=None) -> str | None:
        if mask is not None:
            return "inpaint"
        if image is not None:
            return "img2img"
        return None  # falls back to default_block_name ("text2img")

block_trigger_inputs에 나열된 입력은 select_block()의 키워드 인수로 전달됩니다. select_block이 None을 반환하면 default_block_name으로 폴백됩니다. default_block_name도 None인 경우, 해당 조건 블록 전체가 건너뜁니다. 이는 특정 입력이 제공될 때만 실행되어야 하는 선택적 처리 단계에 유용합니다.

워크플로

조건 블록(AutoPipelineBlocks 또는 ConditionalPipelineBlocks)을 포함하는 파이프라인은 여러 워크플로를 지원할 수 있습니다. 예를 들어, 저희 SDXL 모듈형 파이프라인은 하나의 파이프라인에서 12개의 워크플로를 지원합니다. 하지만 이는 사용자가 어떤 워크플로가 지원되는지, 그리고 어떻게 실행하는지 파악하기 어렵게 만들 수도 있습니다. 파이프라인 빌더의 관점에서는 특정 워크플로에 관련되는 블록만 추출할 수 있는 기능이 유용합니다.

각 워크플로에 이름을 부여하고 필요한 입력을 명시적으로 나열하도록 _workflow_map을 정의하는 것을 권장합니다.

from diffusers.modular_pipelines import SequentialPipelineBlocks

class MyPipelineBlocks(SequentialPipelineBlocks):
    block_classes = [TextEncoderBlock, AutoImageBlocks, DecodeBlock]
    block_names = ["text_encoder", "auto_image", "decode"]

    _workflow_map = {
        "text2image": {"prompt": True},
        "image2image": {"image": True, "prompt": True},
        "inpaint": {"mask": True, "image": True, "prompt": True},
    }

모든 내장 모듈형 파이프라인에는 사전 정의된 워크플로가 포함되어 있습니다. available_workflows 속성은 지원되는 모든 워크플로를 나열합니다:

pipeline_blocks = MyPipelineBlocks()
pipeline_blocks.available_workflows
# ['text2image', 'image2image', 'inpaint']

get_workflow를 사용하여 특정 워크플로를 가져와 워크플로를 실행하는 특정 블록을 검사하고 디버깅합니다.

pipeline_blocks.get_workflow("inpaint")
Update on GitHub