# LoopSequentialPipelineBlocks

[LoopSequentialPipelineBlocks](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks) là một kiểu đa khối, kết hợp các [ModularPipelineBlocks](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.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](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks).

## Vòng lặp bao bọc

[LoopSequentialPipelineBlocks](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.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](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.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.

```py
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](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.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](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) thay vì [PipelineState](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState).
- Nó không yêu cầu truy xuất hoặc cập nhật [BlockState](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState).

Các khối vòng lặp chia sẻ cùng một [BlockState](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.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.

```py
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()](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks.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](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks).

```py
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()](/docs/diffusers/main/vi/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks.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.

```py
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](../using-diffusers/callback#modular-pipelines) trong hướng dẫn về callback.

