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

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

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

## مولّد

تعتمد خطوط الأنابيب على [torch.randn](https://pytorch.org/docs/stable/generated/torch.randn.html)، الذي يستخدم بذرة عشوائية مختلفة في كل مرة، لإنشاء الموترات الضوضائية الأولية. ولتوليد نفس المخرجات على وحدة المعالجة المركزية أو وحدة معالجة الرسوميات، استخدم [Generator](https://docs.pytorch.org/docs/stable/generated/torch.Generator.html) لإدارة كيفية توليد القيم العشوائية.

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

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

عند تمرير `Generator` يعمل على المعالج المركزي (CPU)، تقوم دالة [randn_tensor()](/docs/diffusers/v0.43.0/ar/api/utilities#diffusers.utils.torch_utils.randn_tensor) في مكتبة Diffusers بسحب العينات على المعالج المركزي ثم نقل المصفوفة (tensor) إلى وحدة معالجة الرسوميات (GPU) داخل خط الأنابيب. أنت لا تستدعي `randn_tensor` أو `.to("cuda")` بنفسك. أما `Generator` الذي يعمل على وحدة معالجة الرسوميات فيسحب العينات على الجهاز مباشرة، وقد تختلف نتائجه عن نتائج المعالج المركزي.

استخدم [manual_seed](https://docs.pytorch.org/docs/stable/generated/torch.manual_seed.html) لضبط البذرة.

```py
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](https://docs.pytorch.org/docs/stable/generated/torch.Generator.html#torch.Generator.manual_seed).

```py
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` جديدًا قبل كل استدعاء عندما تحتاج إلى استخدام البذرة نفسها مرة أخرى.

```py
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 الخوارزميات الحتمية](https://docs.pytorch.org/docs/stable/notes/randomness.html#avoiding-nondeterministic-algorithms) (حيما توفرت) لعمليات معينة بحيث تُنتج النتائج نفسها. قد تكون الخوارزميات الحتمية أبطأ وتُقلل من الأداء.

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

```py
from diffusers.utils.torch_utils import enable_full_determinism

enable_full_determinism()
```

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

- ضبط متغير البيئة `CUDA_LAUNCH_BLOCKING` على `1`
- ضبط متغير البيئة [CUBLAS_WORKSPACE_CONFIG](https://docs.nvidia.com/cuda/cublas/index.html#results-reproducibility) على `: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 حول [إمكانية إعادة الإنتاج](https://docs.pytorch.org/docs/stable/notes/randomness.html). يمكنك محاولة الحد من العشوائية، لكنها ليست *مضمونة* حتى مع استخدام بذرة متطابقة.

