Diffusers documentation
SequentialPipelineBlocks
SequentialPipelineBlocks
SequentialPipelineBlocks adalah tipe multi-blok yang menyusun beberapa ModularPipelineBlocks lainnya secara berurutan. Data mengalir secara linear dari satu blok ke blok berikutnya menggunakan inputs dan intermediate_outputs. Setiap blok dalam SequentialPipelineBlocks biasanya mewakili satu langkah dalam pipeline, dan dengan menggabungkannya, Anda secara bertahap membangun sebuah pipeline.
Panduan ini menunjukkan cara menghubungkan dua blok menjadi SequentialPipelineBlocks.
Buat dua ModularPipelineBlocks. Blok pertama, InputBlock, menghasilkan nilai batch_size dan blok kedua, ImageEncoderBlock menggunakan batch_size sebagai inputs.
from diffusers.modular_pipelines import ModularPipelineBlocks, InputParam, OutputParam
class InputBlock(ModularPipelineBlocks):
@property
def inputs(self):
return [
InputParam(name="prompt", type_hint=list, description="list of text prompts"),
InputParam(name="num_images_per_prompt", type_hint=int, description="number of images per prompt"),
]
@property
def intermediate_outputs(self):
return [
OutputParam(name="batch_size", description="calculated batch size"),
]
@property
def description(self):
return "A block that determines batch_size based on the number of prompts and num_images_per_prompt argument."
def __call__(self, components, state):
block_state = self.get_block_state(state)
batch_size = len(block_state.prompt)
block_state.batch_size = batch_size * block_state.num_images_per_prompt
self.set_block_state(state, block_state)
return components, stateimport torch
from diffusers.modular_pipelines import ModularPipelineBlocks, InputParam, OutputParam
class ImageEncoderBlock(ModularPipelineBlocks):
@property
def inputs(self):
return [
InputParam(name="image", type_hint="PIL.Image", description="raw input image to process"),
InputParam(name="batch_size", type_hint=int),
]
@property
def intermediate_outputs(self):
return [
OutputParam(name="image_latents", description="latents representing the image"),
]
@property
def description(self):
return "Encode raw image into its latent presentation"
def __call__(self, components, state):
block_state = self.get_block_state(state)
# Simulate processing the image
# This will change the state of the image from a PIL image to a tensor for all blocks
block_state.image = torch.randn(1, 3, 512, 512)
block_state.batch_size = block_state.batch_size * 2
block_state.image_latents = torch.randn(1, 4, 64, 64)
self.set_block_state(state, block_state)
return components, stateHubungkan kedua blok tersebut dengan mendefinisikan SequentialPipelineBlocks. Daftarkan instance blok di block_classes dan nama yang sesuai di block_names. Blok-blok tersebut dieksekusi sesuai urutan kemunculannya di block_classes, dan data mengalir dari satu blok ke blok berikutnya melalui PipelineState.
class ImageProcessingStep(SequentialPipelineBlocks):
"""
# auto_docstring
"""
model_name = "my_model"
block_classes = [InputBlock(), ImageEncoderBlock()]
block_names = ["input", "image_encoder"]
@property
def description(self):
return (
"Process text prompts and images for the pipeline. It:\n"
" - Determines the batch size from the prompts.\n"
" - Encodes the image into latent space."
)Saat Anda membuat SequentialPipelineBlocks, properti seperti inputs, intermediate_outputs, dan expected_components secara otomatis diagregasi dari sub-blok, sehingga tidak perlu mendefinisikannya lagi.
Ada beberapa properti yang perlu Anda atur:
description: Kami merekomendasikan untuk menambahkan deskripsi pada blok yang dirakit untuk menjelaskan apa yang dilakukan oleh langkah gabungan tersebut.model_name: Ini diturunkan secara otomatis dari sub-blok, tetapi tidak selalu benar, sehingga Anda mungkin perlu menimpanya.outputs: Secara default, ini sama denganintermediate_outputs, tetapi Anda dapat menyetelnya secara manual untuk mengontrol nilai mana yang muncul di dokumen. Ini berguna untuk menampilkan hanya output akhir, bukan semua nilai perantara.
Properti-properti ini, bersama dengan inputs, intermediate_outputs, dan expected_components yang telah diagregasi, digunakan untuk secara otomatis menghasilkan properti doc.
Cetak blok ImageProcessingStep untuk memeriksa sub-bloknya, dan gunakan doc untuk ringkasan lengkap mengenai input, output, dan komponen blok tersebut.
blocks = ImageProcessingStep()
print(blocks)
print(blocks.doc)