# نماذج الاتساق

قُدِّمت نماذج الاتساق في [Consistency Models](https://huggingface.co/papers/2303.01469) بواسطة Yang Song وPrafulla Dhariwal وMark Chen وIlya Sutskever.

ملخص الورقة البحثية هو:

*حقّقت نماذج الانتشار تقدماً كبيراً في مجالات توليد الصور والصوت والفيديو، لكنها تعتمد على عملية أخذ عينات تكرارية تسبب بطئاً في التوليد. للتغلب على هذه القيود، نقترح نماذج الاتساق، وهي عائلة جديدة من النماذج تولّد عينات عالية الجودة عن طريق خرائط الضوضاء مباشرةً إلى البيانات. فهي تدعم التوليد السريع بخطوة واحدة بالتصميم، مع السماح في الوقت نفسه بأخذ عينات متعددة الخطوات لتبادل الحسابات مقابل جودة العينة. كما تدعم تحرير البيانات بدون تدريب مسبق، مثل ملء الصور (inpainting)، والتلوين، والدقة الفائقة، دون الحاجة إلى تدريب صريح على هذه المهام. يمكن تدريب نماذج الاتساق إما عن طريق تقطير نماذج الانتشار المدربة مسبقاً، أو كنماذج توليدية مستقلة تماماً. من خلال تجارب شاملة، نثبت أنها تتفوق على تقنيات التقطير الحالية لنماذج الانتشار في أخذ العينات بخطوة واحدة وبضع خطوات، محققةً أحدث مستوى من الأداء (state-of-the-art) بمقياس FID قدره 3.55 على CIFAR-10 و6.20 على ImageNet 64x64 للتوليد بخطوة واحدة. عند تدريبها بشكل منفصل، تصبح نماذج الاتساق عائلة جديدة من النماذج التوليدية يمكن أن تتفوق على النماذج التوليدية الحالية بخطوة واحدة وغير العدائية على المعايير القياسية مثل CIFAR-10 وImageNet 64x64 وLSUN 256x256.*

يمكن العثور على قاعدة الكود الأصلية في [openai/consistency_models](https://github.com/openai/consistency_models)، وتتاح نقاط التفتيش الإضافية في [openai](https://huggingface.co/openai).

تمت مساهمة خط المعالجة بواسطة [dg845](https://github.com/dg845) و [ayushtues](https://huggingface.co/ayushtues). ❤️

## نصائح

لتحقيق تسريع إضافي، استخدم `torch.compile` لتوليد عدة صور في أقل من ثانية واحدة:

```diff
  import torch
  from diffusers import ConsistencyModelPipeline

  device = "cuda"  # or "mps", "xpu", "cpu"
  # Load the cd_bedroom256_lpips checkpoint.
  model_id_or_path = "openai/diffusers-cd_bedroom256_lpips"
  pipe = ConsistencyModelPipeline.from_pretrained(model_id_or_path, dtype=torch.float16)
  pipe.to(device)

+ pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)

  # Multistep sampling
  # Timesteps can be explicitly specified; the particular timesteps below are from the original GitHub repo:
  # https://github.com/openai/consistency_models/blob/main/scripts/launch.sh#L83
  for _ in range(10):
      image = pipe(timesteps=[17, 0]).images[0]
      image.show()
```

## ConsistencyModelPipeline[[diffusers.ConsistencyModelPipeline]]

#### diffusers.ConsistencyModelPipeline[[diffusers.ConsistencyModelPipeline]]

```python
diffusers.ConsistencyModelPipeline(unet: UNet2DModel, scheduler: CMStochasticIterativeScheduler)
```

[المصدر](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/consistency_models/pipeline_consistency_models.py#L67)

**المعاملات:**

unet ([UNet2DModel](/docs/diffusers/v0.43.0/ar/api/models/unet2d#diffusers.UNet2DModel)) : نموذج `UNet2DModel` لإزالة الضوضاء من الكامنات المُرمّزة للصورة.

scheduler ([SchedulerMixin](/docs/diffusers/v0.43.0/ar/api/schedulers/overview#diffusers.SchedulerMixin)) : مُجدول يُستخدم بالاقتران مع `unet` لإزالة الضوضاء من الكامنات المُرمّزة للصورة. حاليًا، يتوافق فقط مع [CMStochasticIterativeScheduler](/docs/diffusers/v0.43.0/ar/api/schedulers/cm_stochastic_iterative#diffusers.CMStochasticIterativeScheduler).

خط أنابيب لتوليد الصور غير الشرطية أو الشرطية على أساس الفئة.

يرث هذا النموذج من [DiffusionPipeline](/docs/diffusers/v0.43.0/ar/api/pipelines/overview#diffusers.DiffusionPipeline). راجع توثيق الفئة الأصلية لمعرفة الطرق العامة المُنفَّذة لجميع خطوط الأنابيب (التنزيل، الحفظ، التشغيل على جهاز معين، إلخ).

#### __call__[[diffusers.ConsistencyModelPipeline.__call__]]

```python
__call__(batch_size: int = 1, class_labels: typing.Union[torch.Tensor, list[int], int, NoneType] = None, num_inference_steps: int = 1, timesteps: list[int] = None, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, callback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = None, callback_steps: int = 1)
```

[المصدر](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/consistency_models/pipeline_consistency_models.py#L171)

**المعاملات:**

batch_size (`int`، *اختياري*، القيمة الافتراضية 1) : عدد الصور التي سيتم توليدها.

class_labels (`torch.Tensor` أو `list[int]` أو `int`، *اختياري*) : تسميات فئات اختيارية لنماذج الاتساق الشرطي على الفئة. لا تُستخدم إذا لم يكن النموذج شرطياً على الفئة.

num_inference_steps (`int`، *اختياري*، القيمة الافتراضية 1) : عدد خطوات إزالة الضوضاء. تؤدي زيادة عدد خطوات إزالة الضوضاء عادةً إلى صورة ذات جودة أعلى على حساب بطء الاستدلال.

timesteps (`list[int]`، *اختياري*) : خطوات زمنية مخصصة لاستخدامها في عملية إزالة الضوضاء. إذا لم تُعرَّف، تُستخدم خطوات زمنية متساوية التباعد بعدد `num_inference_steps`. يجب أن تكون مرتبة تنازليًا.

generator (`torch.Generator`، *اختياري*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) لجعل التوليد حتميًا.

latents (`torch.Tensor`، *اختياري*) : كامنات ضجيج مُولّدة مسبقًا، مُستخرجة من توزيع غاوسي، تُستخدم كمدخلات لتوليد الصور. يمكن استخدامها لتعديل نفس التوليد باستخدام أوامر مختلفة. إذا لم تُقدَّم، يتم توليد كامنات من خلال الاستخراج باستخدام `generator` العشوائي المُقدَّم.

output_type (`str`، *اختياري*، الافتراضي `"pil"`) : صيغة الصورة المولّدة. اختر بين `PIL.Image` أو `np.array`.

return_dict (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب إرجاع [ImagePipelineOutput](/docs/diffusers/v0.43.0/ar/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) بدلاً من tuple عادي.

callback (`Callable`، *اختياري*) : دالة تُستدعى كل `callback_steps` خطوات أثناء الاستدلال. تُستدعى الدالة بالحجج التالية: `callback(step: int, timestep: int, latents: torch.Tensor)`.

callback_steps (`int`، *اختياري*، القيمة الافتراضية 1) : التكرار الذي تُستدعى فيه دالة `callback`. إذا لم يُحدد، تُستدعى الدالة في كل خطوة.

**يعيد:** [ImagePipelineOutput](/docs/diffusers/v0.43.0/ar/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) أو `tuple`

إذا كان `return_dict` هو `True`، يُعاد [ImagePipelineOutput](/docs/diffusers/v0.43.0/ar/api/pipelines/consistency_models#diffusers.ImagePipelineOutput)، وإلا يُعاد `tuple` يكون عنصره الأول قائمة بالصور المولّدة.

أمثلة:
```py
>>> import torch

>>> from diffusers import ConsistencyModelPipeline

>>> device = "cuda"
>>> # Load the cd_imagenet64_l2 checkpoint.
>>> model_id_or_path = "openai/diffusers-cd_imagenet64_l2"
>>> pipe = ConsistencyModelPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16)
>>> pipe.to(device)

>>> # Onestep Sampling
>>> image = pipe(num_inference_steps=1).images[0]
>>> image.save("cd_imagenet64_l2_onestep_sample.png")

>>> # Onestep sampling, class-conditional image generation
>>> # ImageNet-64 class label 145 corresponds to king penguins
>>> image = pipe(num_inference_steps=1, class_labels=145).images[0]
>>> image.save("cd_imagenet64_l2_onestep_sample_penguin.png")

>>> # Multistep sampling, class-conditional image generation
>>> # Timesteps can be explicitly specified; the particular timesteps below are from the original GitHub repo:
>>> # https://github.com/openai/consistency_models/blob/main/scripts/launch.sh#L77
>>> image = pipe(num_inference_steps=None, timesteps=[22, 0], class_labels=145).images[0]
>>> image.save("cd_imagenet64_l2_multistep_sample_penguin.png")
```

## ImagePipelineOutput[[diffusers.ImagePipelineOutput]]

#### diffusers.ImagePipelineOutput[[diffusers.ImagePipelineOutput]]

```python
diffusers.ImagePipelineOutput(images: list[PIL.Image.Image] | numpy.ndarray)
```

[المصدر](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/pipeline_utils.py#L135)

**المعاملات:**

images (`List[PIL.Image.Image]` أو `np.ndarray`) : قائمة من صور PIL منزوعة الضوضاء بطول `batch_size` أو مصفوفة NumPy بأبعاد `(batch_size, height, width, num_channels)`.

فئة الإخراج لخطوط أنابيب الصور.

