Diffusers documentation
Tekrarlanabilirlik
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
Generatorkullanmalı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() 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]CPU Generator oluşturun ve Generator.manual_seed ile bir tohum ayarlayın.
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.
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'in1olarak 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:8olarak ayarlayın torch.use_deterministic_algorithms(True)çağrısıtorch.backends.cudnn.deterministic = Trueayarlanıyor- cuDNN'un her çalıştırmada farklı bir konvolüsyon algoritması seçmemesi için
torch.backends.cudnn.benchmark = Falseayarlanıyor - Daha hassas tam hassasiyetli matmul lehine
torch.backends.cuda.matmul.allow_tf32 = Falseile 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