Diffusers documentation

Tekrarlanabilirlik

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

and get access to the augmented documentation experience

to get started

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 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 kullanın.

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

GPU
CPU

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() 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 kullanın.

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]

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.

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ı destekler. Deterministik algoritmalar daha yavaş olabilir ve performansı düşürebilir.

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

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

Update on GitHub