Diffusers documentation
LoopSequentialPipelineBlocks
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_inputslà các giá trị do người dùng cung cấp và tương đương vớiinputs.loop_intermediate_outputslà 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ớiintermediate_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, stateBộ 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_stateLoopSequentialPipelineBlocks
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.