Diffusers documentation
ModularPipelineBlocks
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.
inputsadalah 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 (sepertiimage_latentsyang telah dienkod).Gunakan
InputParamuntuk mendefinisikaninputs.
class ImageEncodeStep(ModularPipelineBlocks):
...
@property
def inputs(self):
return [
InputParam(name="image", type_hint="PIL.Image", required=True, description="raw input image to process"),
]
...intermediate_outputsadalah nilai baru yang dibuat oleh sebuah blok dan ditambahkan ke PipelineState.intermediate_outputstersedia sebagaiinputsuntuk blok berikutnya atau tersedia sebagai output akhir dari eksekusi pipeline.Gunakan
OutputParamuntuk mendefinisikanintermediate_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
namedari komponen tersebut dan idealnya sebuahtype_hintyang 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.
- Ambil BlockState untuk mendapatkan tampilan lokal dari
inputs. - Implementasikan logika komputasi pada
inputs. - Perbarui PipelineState untuk mendorong perubahan dari BlockState lokal kembali ke PipelineState global.
- 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, stateMenggabungkan 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, stateSetiap 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