Diffusers documentation
Reprodusibilitas
Reprodusibilitas
Diffusion adalah proses acak yang menghasilkan output berbeda setiap kali. Untuk kasus penggunaan seperti pengujian dan replikasi hasil, Anda ingin menghasilkan hasil yang sama setiap kali, di antara rilis dan platform dalam rentang toleransi tertentu.
Panduan ini akan menunjukkan cara Anda mengendalikan sumber keacakan dan mengaktifkan algoritma deterministik.
Generator
Pipelines bergantung pada torch.randn, yang menggunakan seed acak yang berbeda setiap kali, untuk membuat tensor berisik awal. Untuk menghasilkan output yang sama di CPU atau GPU, gunakan Generator untuk mengelola cara nilai acak dihasilkan.
Jika reproduktibilitas penting, Anda sebaiknya menggunakan
GeneratorCPU. Penurunan kinerja sering kali dapat diabaikan dan Anda akan menghasilkan nilai yang lebih mirip.
Gunakan Generator CPU ketika Anda mengutamakan reproduktibilitas. RNG CPU lebih stabil di antara berbagai mesin.
Saat Anda meneruskan Generator CPU, randn_tensor() Diffusers mengambil sampel di CPU dan memindahkan tensor ke GPU di dalam pipeline. Anda tidak perlu memanggil randn_tensor atau .to("cuda") sendiri. Generator GPU mengambil sampel langsung di perangkat dan dapat menghasilkan hasil yang berbeda dari CPU.
Gunakan manual_seed untuk mengatur seed.
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]Buat Generator CPU dan atur seed dengan Generator.manual_seed.
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]Lewatkan objek Generator ke pipeline alih-alih seed integer. Generator menyimpan keadaan acak yang dikonsumsi dan diperbarui saat Anda menggunakannya. Setelah itu, objek yang sama menghasilkan hasil yang berbeda pada pemanggilan berikutnya, bahkan di antara pipeline, karena keadaannya telah berubah. Set ulang seed-nya atau buat Generator baru sebelum setiap pemanggilan ketika Anda membutuhkan seed yang sama lagi.
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]Algoritma deterministik
PyTorch mendukung algoritma deterministik (jika tersedia) untuk operasi tertentu agar menghasilkan hasil yang sama. Algoritma deterministik mungkin lebih lambat dan menurunkan kinerja.
Gunakan enable_full_determinism() dari Diffusers untuk mengaktifkan algoritma deterministik.
from diffusers.utils.torch_utils import enable_full_determinism
enable_full_determinism()enable_full_determinism bekerja dengan cara:
- Mengatur variabel lingkungan
CUDA_LAUNCH_BLOCKINGmenjadi1 - Mengatur variabel lingkungan CUBLAS_WORKSPACE_CONFIG menjadi
:16:8agar cuBLAS menggunakan tata letak workspace tetap saat runtime - Memanggil
torch.use_deterministic_algorithms(True) - Mengatur
torch.backends.cudnn.deterministic = True - Mengatur
torch.backends.cudnn.benchmark = Falseagar cuDNN tidak memilih algoritma konvolusi yang berbeda pada setiap eksekusi - Menonaktifkan TensorFloat32 (TF32) dengan
torch.backends.cuda.matmul.allow_tf32 = Falsedemi matmul presisi penuh yang lebih akurat
Langkah selanjutnya
Anda sebaiknya membaca catatan pengembang PyTorch tentang Reproducibility. Anda dapat mencoba membatasi keacakan, tetapi hal ini tidak terjamin bahkan dengan seed yang identik.
Update on GitHub