Diffusers documentation

إمكانية إعادة الإنتاج

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

إمكانية إعادة الإنتاج

عملية الانتشار هي عملية عشوائية تولّد مخرجات مختلفة في كل مرة. وفي حالات الاستخدام مثل الاختبار وتكرار النتائج، ترغب في توليد النتيجة نفسها في كل مرة، عبر الإصدارات والمنصات ضمن نطاق سماحية معين.

ستُظهر لك هذه الدليل كيفية التحكم في مصادر العشوائية وتفعيل الخوارزميات الحتمية.

مولّد

تعتمد خطوط الأنابيب على torch.randn، الذي يستخدم بذرة عشوائية مختلفة في كل مرة، لإنشاء الموترات الضوضائية الأولية. ولتوليد نفس المخرجات على وحدة المعالجة المركزية أو وحدة معالجة الرسوميات، استخدم Generator لإدارة كيفية توليد القيم العشوائية.

إذا كانت قابلية إعادة الإنتاج مهمة، فينبغي عليك استخدام مولّد Generator على المعالج المركزي. غالبًا ما تكون خسارة الأداء ضئيلة، وستقوم بتوليد قيم أكثر تشابهًا.

وحدة معالجة الرسوميات
وحدة المعالجة المركزية

استخدم Generator على المعالج المركزي (CPU) عندما تكون قابلية إعادة الإنتاج أولوية لديك. فمولّد الأرقام العشوائية على المعالج المركزي أكثر استقرارًا عبر الأجهزة المختلفة.

عند تمرير Generator يعمل على المعالج المركزي (CPU)، تقوم دالة randn_tensor() في مكتبة Diffusers بسحب العينات على المعالج المركزي ثم نقل المصفوفة (tensor) إلى وحدة معالجة الرسوميات (GPU) داخل خط الأنابيب. أنت لا تستدعي randn_tensor أو .to("cuda") بنفسك. أما Generator الذي يعمل على وحدة معالجة الرسوميات فيسحب العينات على الجهاز مباشرة، وقد تختلف نتائجه عن نتائج المعالج المركزي.

استخدم manual_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]

مرّر كائن Generator إلى خط الأنابيب بدلاً من بذرة عددية صحيحة. يحافظ كائن Generator على حالة عشوائية تُستهلك وتُحدَّث عند استخدامه. بعد ذلك، ينتج الكائن نفسه نتائج مختلفة في الاستدعاءات اللاحقة، حتى عبر خطوط أنابيب متعددة، لأن حالته قد تغيّرت. أعد تهيئة البذرة أو أنشئ كائن Generator جديدًا قبل كل استدعاء عندما تحتاج إلى استخدام البذرة نفسها مرة أخرى.

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]

الخوارزميات الحتمية

يدعم PyTorch الخوارزميات الحتمية (حيما توفرت) لعمليات معينة بحيث تُنتج النتائج نفسها. قد تكون الخوارزميات الحتمية أبطأ وتُقلل من الأداء.

استخدم enable_full_determinism() في Diffusers لتفعيل الخوارزميات الحتمية.

from diffusers.utils.torch_utils import enable_full_determinism

enable_full_determinism()

يعمل enable_full_determinism من خلال:

  • ضبط متغير البيئة CUDA_LAUNCH_BLOCKING على 1
  • ضبط متغير البيئة CUBLAS_WORKSPACE_CONFIG على :16:8 بحيث يستخدم cuBLAS تخطيط مساحة عمل ثابتة وقت التشغيل
  • استدعاء torch.use_deterministic_algorithms(True)
  • إعداد torch.backends.cudnn.deterministic = True
  • إعداد torch.backends.cudnn.benchmark = False حتى لا يختار cuDNN خوارزمية تلاف مختلفة في كل تشغيل
  • تعطيل TensorFloat32 (TF32) باستخدام torch.backends.cuda.matmul.allow_tf32 = False لصالح عمليات ضرب المصفوفات بدقة كاملة أعلى دقة

الخطوات التالية

يجب عليك قراءة ملاحظات مطوري PyTorch حول إمكانية إعادة الإنتاج. يمكنك محاولة الحد من العشوائية، لكنها ليست مضمونة حتى مع استخدام بذرة متطابقة.

Update on GitHub