Diffusers documentation
إمكانية إعادة الإنتاج
إمكانية إعادة الإنتاج
عملية الانتشار هي عملية عشوائية تولّد مخرجات مختلفة في كل مرة. وفي حالات الاستخدام مثل الاختبار وتكرار النتائج، ترغب في توليد النتيجة نفسها في كل مرة، عبر الإصدارات والمنصات ضمن نطاق سماحية معين.
ستُظهر لك هذه الدليل كيفية التحكم في مصادر العشوائية وتفعيل الخوارزميات الحتمية.
مولّد
تعتمد خطوط الأنابيب على 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 على المعالج المركزي (CPU) واطلب بذرة باستخدام 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]مرّر كائن 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