Diffusers documentation

LoopSequentialPipelineBlocks

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.43.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

LoopSequentialPipelineBlocks

LoopSequentialPipelineBlocks là một kiểu đa khối, kết hợp các ModularPipelineBlocks khác lại với nhau trong một vòng lặp. Dữ liệu chảy theo hình tròn, sử dụng inputs và intermediate_outputs, và mỗi khối được chạy lặp đi lặp lại. Kiểu này thường được dùng để tạo ra một vòng lặp khử nhiễu, vốn mặc định là lặp.

Hướng dẫn này cho bạn cách tạo LoopSequentialPipelineBlocks.

Vòng lặp bao bọc

LoopSequentialPipelineBlocks, còn được gọi là loop wrapper vì nó định nghĩa cấu trúc vòng lặp, các biến lặp và cấu hình. Bên trong loop wrapper, bạn cần các biến sau.

  • loop_inputs là các giá trị do người dùng cung cấp và tương đương với inputs.
  • loop_intermediate_outputs là các biến trung gian mới được tạo bởi khối và được thêm vào PipelineState. Nó tương đương với intermediate_outputs.
  • Phương thức __call__ định nghĩa cấu trúc vòng lặp và logic lặp.
import torch
from diffusers.modular_pipelines import LoopSequentialPipelineBlocks, ModularPipelineBlocks, InputParam, OutputParam

class LoopWrapper(LoopSequentialPipelineBlocks):
    model_name = "test"
    @property
    def description(self):
        return "I'm a loop!!"
    @property
    def loop_inputs(self):
        return [InputParam(name="num_steps")]
    @torch.no_grad()
    def __call__(self, components, state):
        block_state = self.get_block_state(state)
        # Loop structure - can be customized to your needs
        for i in range(block_state.num_steps):
            # loop_step executes all registered blocks in sequence
            components, block_state = self.loop_step(components, block_state, i=i)
        self.set_block_state(state, block_state)
        return components, state

Bộ bọc vòng lặp có thể truyền các đối số bổ sung, chẳng hạn như chỉ số lặp hiện tại, đến các khối vòng lặp.

Khối lặp

Một khối vòng lặp là một ModularPipelineBlocks, nhưng phương thức __call__ hoạt động khác.

  • Nó nhận biến lặp từ vòng lặp bao ngoài.
  • Nó hoạt động trực tiếp với BlockState thay vì PipelineState.
  • Nó không yêu cầu truy xuất hoặc cập nhật BlockState.

Các khối vòng lặp chia sẻ cùng một BlockState để cho phép các giá trị tích lũy và thay đổi cho mỗi lần lặp trong vòng lặp.

class LoopBlock(ModularPipelineBlocks):
    model_name = "test"
    @property
    def inputs(self):
        return [InputParam(name="x")]
    @property
    def intermediate_outputs(self):
        # outputs produced by this block
        return [OutputParam(name="x")]
    @property
    def description(self):
        return "I'm a block used inside the `LoopWrapper` class"
    def __call__(self, components, block_state, i: int):
        block_state.x += 1
        return components, block_state

LoopSequentialPipelineBlocks

Sử dụng phương thức from_blocks_dict() để thêm khối vòng lặp vào bộ bao vòng lặp nhằm tạo ra LoopSequentialPipelineBlocks.

loop = LoopWrapper.from_blocks_dict({"block1": LoopBlock})

Thêm các khối vòng lặp khác để chạy trong mỗi lần lặp bằng from_blocks_dict(). Điều này cho phép bạn sửa đổi các khối mà không cần thay đổi chính logic của vòng lặp.

loop = LoopWrapper.from_blocks_dict({"block1": LoopBlock(), "block2": LoopBlock})

Để thêm một khối vòng lặp vào vòng lặp khử nhiễu của một pipeline hiện có, chẳng hạn như một khối chạy hàm callback_on_step_end ở mỗi bước, hãy xem Pipeline dạng module trong hướng dẫn về callback.

Update on GitHub