# Tekrarlanabilirlik

Diffusion, her çalıştırmada farklı bir çıktı üreten rastgele bir süreçtir. Test ve sonuçların yeniden üretimi gibi kullanım senaryolarında, belirli bir tolerans aralığı içinde, sürümler ve platformlar arasında her seferinde aynı sonucu üretmek istersiniz.

Bu kılavuz, rastgelelik kaynaklarını nasıl kontrol edeceğinizi ve deterministik algoritmaları nasıl etkinleştireceğinizi gösterecektir.

## Generator

Pipelines, başlangıç gürültülü tensörlerini oluşturmak için her seferinde farklı bir rastgele tohum kullanan [torch.randn](https://pytorch.org/docs/stable/generated/torch.randn.html) işlevine dayanır. Bir CPU veya GPU üzerinde aynı çıktıyı üretmek için rastgele değerlerin nasıl üretileceğini yönetmek üzere bir [Generator](https://docs.pytorch.org/docs/stable/generated/torch.Generator.html) kullanın.

> [!TIP]
> Tekrarlanabilirlik önemliyse, bir CPU `Generator` kullanmalısınız. Performans kaybı genellikle önemsizdir ve daha benzer değerler üretirsiniz.

Tekrarlanabilirlik sizin için önemliyse `Generator` için bir CPU kullanın. CPU RNG, makineler arasında daha kararlıdır.

CPU `Generator` geçirdiğinizde, Diffusers’ın [randn_tensor()](/docs/diffusers/main/tr/api/utilities#diffusers.utils.torch_utils.randn_tensor) fonksiyonu örneklemeyi CPU üzerinde yapar ve tensörü pipeline içinde GPU’ya taşır. `randn_tensor` veya `.to("cuda")` çağrılarını kendiniz yapmazsınız. GPU `Generator` ise örneklemeyi doğrudan cihaz üzerinde gerçekleştirir ve sonuçlar CPU sonuçlarından farklılık gösterebilir.

Bir tohum ayarlamak için [manual_seed](https://docs.pytorch.org/docs/stable/generated/torch.manual_seed.html) kullanın.

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda"  # or "mps", "xpu", "cpu"
)
generator = torch.manual_seed(0)
image = pipeline(
    prompt="a red apple on a wooden table",
    generator=generator,
    num_inference_steps=4,
).images[0]
```

CPU `Generator` oluşturun ve [Generator.manual_seed](https://docs.pytorch.org/docs/stable/generated/torch.Generator.html#torch.Generator.manual_seed) ile bir tohum ayarlayın.

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cpu"
)
generator = torch.Generator(device="cpu").manual_seed(0)
image = pipeline(
    prompt="a red apple on a wooden table",
    generator=generator,
    num_inference_steps=4,
).images[0]
```

Tamsay bir tohum yerine pipeline'a bir `Generator` nesnesi iletin. `Generator`, kullanıldığında tüketilen ve güncellenen bir rastgele durum tutar. Bu durum değiştiği için, aynı nesne sonraki çağrılarda, pipeline'lar arasında bile olsa, farklı sonuçlar üretir. Aynı tohumu tekrar kullanmanız gerektiğinde, her çağrıdan önce yeniden tohumlayın veya yeni bir `Generator` oluşturun.

```py
import torch

prompt = "a red apple on a wooden table"

for _ in range(5):
    generator = torch.manual_seed(0)
    image = pipeline(prompt, generator=generator, num_inference_steps=4).images[0]
```

## Belirleyici algoritmalar

PyTorch, belirli işlemlerin aynı sonuçları üretmesi için (müsaitse) [deterministik algoritmaları](https://docs.pytorch.org/docs/stable/notes/randomness.html#avoiding-nondeterministic-algorithms) destekler. Deterministik algoritmalar daha yavaş olabilir ve performansı düşürebilir.

Deterministik algoritmaları etkinleştirmek için Diffusers'ın `enable_full_determinism()` fonksiyonunu kullanın.

```py
from diffusers.utils.torch_utils import enable_full_determinism

enable_full_determinism()
```

`enable_full_determinism` şu şekilde çalışır:

- Ortam değişkeni `CUDA_LAUNCH_BLOCKING`'in `1` olarak ayarlanması
- cuBLAS'ın çalışma zamanında sabit bir çalışma alanı düzeni kullanması için [CUBLAS_WORKSPACE_CONFIG](https://docs.nvidia.com/cuda/cublas/index.html#results-reproducibility) ortam değişkenini `:16:8` olarak ayarlayın
- `torch.use_deterministic_algorithms(True)` çağrısı
- `torch.backends.cudnn.deterministic = True` ayarlanıyor
- cuDNN'un her çalıştırmada farklı bir konvolüsyon algoritması seçmemesi için `torch.backends.cudnn.benchmark = False` ayarlanıyor
- Daha hassas tam hassasiyetli matmul lehine `torch.backends.cuda.matmul.allow_tf32 = False` ile TensorFloat32 (TF32)'yi devre dışı bırakma

## Sonraki adımlar

PyTorch'un [Tekrarlanabilirlik](https://docs.pytorch.org/docs/stable/notes/randomness.html) hakkındaki geliştirici notlarını okumanız gerekir. Rastgeleliği sınırlamayı deneyebilirsiniz, ancak aynı tohum kullanılsa bile bu *garantili* değildir.

