Diffusers documentation

ModularPipelineBlocks

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

ModularPipelineBlocks

ModularPipelineBlocks adalah blok dasar untuk membangun ModularPipeline. Blok ini mendefinisikan komponen, input/output, dan komputasi yang harus dilakukan oleh sebuah blok untuk langkah tertentu dalam pipeline. Sebuah ModularPipelineBlocks terhubung dengan blok lain, menggunakan state, untuk memungkinkan konstruksi modular dari alur kerja.

ModularPipelineBlocks secara mandiri tidak dapat dieksekusi. Ini adalah cetak biru tentang apa yang harus dilakukan oleh sebuah langkah dalam pipeline. Untuk benar-benar menjalankan dan mengeksekusi pipeline, ModularPipelineBlocks perlu dikonversi menjadi ModularPipeline.

Panduan ini akan menunjukkan cara membuat ModularPipelineBlocks.

Input dan output

Lihat panduan States jika Anda belum familiar dengan cara kerja state di Modular Diffusers.

ModularPipelineBlocks membutuhkan inputs dan intermediate_outputs.

  • inputs adalah nilai yang dibaca sebuah blok dari PipelineState untuk melakukan komputasinya. Nilai-nilai ini dapat berupa nilai yang disediakan oleh pengguna (seperti prompt atau gambar) atau nilai yang dihasilkan oleh blok sebelumnya (seperti image_latents yang telah dienkod).

    Gunakan InputParam untuk mendefinisikan inputs.

class ImageEncodeStep(ModularPipelineBlocks):
    ...

    @property
    def inputs(self):
        return [
            InputParam(name="image", type_hint="PIL.Image", required=True, description="raw input image to process"),
        ]
    ...
  • intermediate_outputs adalah nilai baru yang dibuat oleh sebuah blok dan ditambahkan ke PipelineState. intermediate_outputs tersedia sebagai inputs untuk blok berikutnya atau tersedia sebagai output akhir dari eksekusi pipeline.

    Gunakan OutputParam untuk mendefinisikan intermediate_outputs.

class ImageEncodeStep(ModularPipelineBlocks):
    ...

    @property
    def intermediate_outputs(self):
        return [
            OutputParam(name="image_latents", description="latents representing the image"),
        ]

    ...

Input dan output antara berbagi data untuk menghubungkan blok. Keduanya dapat diakses kapan saja, memungkinkan Anda melacak kemajuan alur kerja.

Komponen dan konfigurasi

Komponen dan konfigurasi tingkat pipeline yang dibutuhkan sebuah blok ditentukan dalam ComponentSpec dan ConfigSpec.

  • ComponentSpec berisi komponen-komponen yang diharapkan digunakan oleh sebuah blok. Anda memerlukan name dari komponen tersebut dan idealnya sebuah type_hint yang menentukan secara persis apa komponen tersebut.
  • ConfigSpec berisi pengaturan tingkat pipeline yang mengontrol perilaku di semua blok.
class ImageEncodeStep(ModularPipelineBlocks):
    ...

    @property
    def expected_components(self):
        return [
            ComponentSpec(name="vae", type_hint=AutoencoderKL),
        ]

    @property
    def expected_configs(self):
        return [
            ConfigSpec("force_zeros_for_empty_prompt", True),
        ]

    ...

Ketika blok dikonversi menjadi pipeline, komponen menjadi tersedia untuk blok sebagai argumen pertama di __call__.

Logika komputasi

Komputasi yang dilakukan oleh blok didefinisikan dalam metode __call__ dan mengikuti struktur tertentu.

  1. Ambil BlockState untuk mendapatkan tampilan lokal dari inputs.
  2. Implementasikan logika komputasi pada inputs.
  3. Perbarui PipelineState untuk mendorong perubahan dari BlockState lokal kembali ke PipelineState global.
  4. Kembalikan komponen dan state yang menjadi tersedia untuk blok berikutnya.
class ImageEncodeStep(ModularPipelineBlocks):

    def __call__(self, components, state):
        # Get a local view of the state variables this block needs
        block_state = self.get_block_state(state)

        # Your computation logic here
        # block_state contains all your inputs
        # Access them like: block_state.image, block_state.processed_image

        # Update the pipeline state with your updated block_states
        self.set_block_state(state, block_state)
        return components, state

Menggabungkan semuanya

Berikut adalah blok lengkap dengan semua bagian yang terhubung.

from diffusers import ComponentSpec, AutoencoderKL
from diffusers.modular_pipelines import InputParam, ModularPipelineBlocks, OutputParam


class ImageEncodeStep(ModularPipelineBlocks):

    @property
    def description(self):
        return "Encode an image into latent space."

    @property
    def expected_components(self):
        return [
            ComponentSpec(name="vae", type_hint=AutoencoderKL),
        ]

    @property
    def inputs(self):
        return [
            InputParam(name="image", type_hint="PIL.Image", required=True, description="raw input image to process"),
        ]

    @property
    def intermediate_outputs(self):
        return [
            OutputParam(name="image_latents", type_hint="torch.Tensor", description="latents representing the image"),
        ]

    def __call__(self, components, state):
        block_state = self.get_block_state(state)
        block_state.image_latents = components.vae.encode(block_state.image)
        self.set_block_state(state, block_state)
        return components, state

Setiap blok memiliki properti doc yang dihasilkan secara otomatis dari properti yang Anda definisikan di atas. Properti ini menyediakan ringkasan deskripsi, komponen, input, dan output blok.

block = ImageEncoderStep()
print(block.doc)
class ImageEncodeStep

  Encode an image into latent space.

  Components:
      vae (`AutoencoderKL`)

  Inputs:
      image (`PIL.Image`):
          raw input image to process

  Outputs:
      image_latents (`torch.Tensor`):
          latents representing the image
Update on GitHub