# LoopSequentialPipelineBlocks

[LoopSequentialPipelineBlocks](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks), diğer [ModularPipelineBlocks](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) öğelerini bir döngü içinde bir araya getiren çoklu blok türüdür. Veri, `inputs` ve `intermediate_outputs` kullanılarak dairesel olarak akar ve her blok yinelemeli olarak çalıştırılır. Bu, varsayılan olarak yinelemeli olan bir gürültü azaltma döngüsü oluşturmak için tipik olarak kullanılır.

Bu kılavuz, [LoopSequentialPipelineBlocks](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks) oluşturmayı gösterir.

## Döngü sarmalayıcısı

[LoopSequentialPipelineBlocks](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks), döngü yapısını, yineleme değişkenlerini ve yapılandırmayı tanımladığı için *döngü sarmalayıcısı* olarak da bilinir. Döngü sarmalayıcısı içinde aşağıdaki değişkenlere ihtiyacınız vardır.

- `loop_inputs`, kullanıcı tarafından sağlanan değerlerdir ve `inputs` ile eşdeğerdir.
- `loop_intermediate_outputs`, blok tarafından oluşturulan ve [PipelineState](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState)'e eklenen yeni ara değişkenlerdir. `intermediate_outputs` ile eşdeğerdir.
- `__call__` metodu, döngü yapısını ve yineleme mantığını tanımlar.

```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
```

Döngü sarmalayıcısı, döngü bloklarına, mevcut yineleme indeksi gibi ek argümanlar iletebilir.

## Döngü blokları

Bir döngü bloğu bir [ModularPipelineBlocks](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks)'tür ancak `__call__` metodu farklı davranır.

- Döngü sarmalayıcısından yineleme değişkenini alır.
- It works directly with the [BlockState](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) instead of the [PipelineState](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState).
- [BlockState](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) almayı veya güncellemeyi gerektirmez.

Loop blokları, döngüdeki her yinelemede değerlerin birikmesine ve değişmesine izin vermek için aynı [BlockState](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState)'i paylaşır.

```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

Döngü bloğunu döngü sarmalayıcısına ekleyerek [LoopSequentialPipelineBlocks](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks) oluşturmak için [from_blocks_dict()](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks.from_blocks_dict) yöntemini kullanın.

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

Her yinelemede çalışacak şekilde daha fazla döngü bloğu eklemek için [from_blocks_dict()](/docs/diffusers/main/tr/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks.from_blocks_dict) kullanın. Bu, döngü mantığının kendisini değiştirmeden blokları düzenlemenizi sağlar.

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

Mevcut bir pipeline'ın gürültü azaltma döngüsüne bir döngü bloğu eklemek için, örneğin her adımda `callback_on_step_end` fonksiyonunu çalıştıran bir blok için, callback kılavuzundaki [Modüler pipeline'lar](../using-diffusers/callback#modular-pipelines) bölümüne bakın.

