Buckets:

mishig's picture
|
download
raw
7.57 kB
# ModularPipelineBlocks
[ModularPipelineBlocks](/docs/diffusers/main/id/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) adalah blok dasar untuk membangun [ModularPipeline](/docs/diffusers/main/id/api/modular_diffusers/pipeline#diffusers.ModularPipeline). Blok ini mendefinisikan komponen, input/output, dan komputasi yang harus dilakukan oleh sebuah blok untuk langkah tertentu dalam pipeline. Sebuah [ModularPipelineBlocks](/docs/diffusers/main/id/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) terhubung dengan blok lain, menggunakan [state](./modular_diffusers_states), untuk memungkinkan konstruksi modular dari alur kerja.
[ModularPipelineBlocks](/docs/diffusers/main/id/api/modular_diffusers/pipeline_blocks#diffusers.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](/docs/diffusers/main/id/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) perlu dikonversi menjadi [ModularPipeline](/docs/diffusers/main/id/api/modular_diffusers/pipeline#diffusers.ModularPipeline).
Panduan ini akan menunjukkan cara membuat [ModularPipelineBlocks](/docs/diffusers/main/id/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks).
## Input dan output
> [!TIP]
> Lihat panduan [States](./modular_diffusers_states) jika Anda belum familiar dengan cara kerja state di Modular Diffusers.
[ModularPipelineBlocks](/docs/diffusers/main/id/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) membutuhkan `inputs` dan `intermediate_outputs`.
- `inputs` adalah nilai yang dibaca sebuah blok dari [PipelineState](/docs/diffusers/main/id/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.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`.
```py
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](/docs/diffusers/main/id/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState). `intermediate_outputs` tersedia sebagai `inputs` untuk blok berikutnya atau tersedia sebagai output akhir dari eksekusi pipeline.
Gunakan `OutputParam` untuk mendefinisikan `intermediate_outputs`.
```py
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](/docs/diffusers/main/id/api/modular_diffusers/pipeline_components#diffusers.ComponentSpec) dan [ConfigSpec](/docs/diffusers/main/id/api/modular_diffusers/pipeline_components#diffusers.ConfigSpec).
- [ComponentSpec](/docs/diffusers/main/id/api/modular_diffusers/pipeline_components#diffusers.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](/docs/diffusers/main/id/api/modular_diffusers/pipeline_components#diffusers.ConfigSpec) berisi pengaturan tingkat pipeline yang mengontrol perilaku di semua blok.
```py
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](/docs/diffusers/main/id/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) untuk mendapatkan tampilan lokal dari `inputs`.
2. Implementasikan logika komputasi pada `inputs`.
3. Perbarui [PipelineState](/docs/diffusers/main/id/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) untuk mendorong perubahan dari [BlockState](/docs/diffusers/main/id/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) lokal kembali ke [PipelineState](/docs/diffusers/main/id/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) global.
4. Kembalikan komponen dan state yang menjadi tersedia untuk blok berikutnya.
```py
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.
```py
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.
```py
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
```

Xet Storage Details

Size:
7.57 kB
·
Xet hash:
7af6b9c7319ab6d079715d9fc519ec2969bd191a2461d3426d87ad5a22ec1cc3

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