# البدء

تركز عملية الكمّ (Quantization) على تمثيل البيانات بعدد أقل من البتات مع السعي في الوقت نفسه للحفاظ على دقة البيانات الأصلية. وغالبًا ما يعني ذلك تحويل نوع البيانات لتمثيل المعلومات نفسها بعدد أقل من البتات. على سبيل المثال، إذا كانت أوزان النموذج مخزنة كنقاط عائمة بدقة 32 بت وتم كمّها إلى نقاط عائمة بدقة 16 بت، فإن ذلك يُقلّص حجم النموذج إلى النصف، مما يسهّل تخزينه ويقلّل من استهلاك الذاكرة. كما يمكن أن يؤدي انخفاض الدقة إلى تسريع الاستدلال (Inference) لأن إجراء العمليات الحسابية بعدد أقل من البتات يستغرق وقتًا أقصر.

يدعم Diffusers عدة محركات (backends) للكمّية (quantization) لجعل نماذج الانتشار الكبيرة مثل [Flux](../api/pipelines/flux) أكثر قابلية للوصول. يوضح هذا الدليل كيفية استخدام فئة [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/ar/api/quantization#diffusers.PipelineQuantizationConfig) لكمّية (quantize) خط الأنابيب (pipeline) أثناء تهيئته من نقطة تحقق (checkpoint) مُدرَّبة مسبقًا أو غير مُكمَّاة.

## التكميم على مستوى خط الأنابيب

هناك طريقتان لاستخدام [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/ar/api/quantization#diffusers.PipelineQuantizationConfig) اعتمادًا على مقدار التخصيص الذي ترغب في تطبيقه على إعدادات التكميم.

- لحالات الاستخدام الأساسية، عرّف الحجج `quant_backend` و`quant_kwargs` و`components_to_quantize`
- للحصول على تحكم دقيق في التكميم، عرّف `quant_mapping` يوفر إعدادات التكميم لمكونات النموذج الفردية

### التكميم الأساسي

قم بتهيئة [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/ar/api/quantization#diffusers.PipelineQuantizationConfig) باستخدام المعلمات التالية.

- `quant_backend` يحدد أي خلفية تكميم (quantization backend) يجب استخدامها. تشمل الخلفيات المدعومة حاليًا: `bitsandbytes_4bit`، `bitsandbytes_8bit`، `gguf`، `quanto`، و`torchao`.
- `quant_kwargs` يحدد حُجج التكميم (quantization) التي يجب استخدامها.

> [!TIP]
> تختلف هذه الحجة `quant_kwargs` باختلاف كل إطار تشغيل. راجع وثائق [Quantization API](../api/quantization) للاطلاع على الحجج الخاصة بكل إطار تشغيل.

- `components_to_quantize` يحدد المكوّن أو المكوّنات من خط الأنابيب التي يجب تكميمها. عادةً، يجب تكميم المكوّنات الأكثر استهلاكًا للحسابات مثل transformer. يُعدّ text encoder مكوّنًا آخر يُنظر في تكميمه إذا كان خط الأنابيب يحتوي على أكثر من مكوّن واحد، كما هو الحال في [FluxPipeline](/docs/diffusers/v0.43.0/ar/api/pipelines/flux#diffusers.FluxPipeline). يكمّم المثال أدناه text encoder الخاص بـ T5 في [FluxPipeline](/docs/diffusers/v0.43.0/ar/api/pipelines/flux#diffusers.FluxPipeline) مع إبقاء نموذج CLIP كما هو.

   يقبل `components_to_quantize` إما قائمة لعدة نماذج أو نصًا لنموذج واحد.

يحمّل المثال أدناه واجهة bitsandbytes باستخدام الحُجج التالية من [BitsAndBytesConfig](/docs/diffusers/v0.43.0/ar/api/quantization#diffusers.BitsAndBytesConfig)، وهي `load_in_4bit` و`bnb_4bit_quant_type` و`bnb_4bit_compute_dtype`.

```py
import torch
from diffusers import DiffusionPipeline
from diffusers.quantizers import PipelineQuantizationConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_backend="bitsandbytes_4bit",
    quant_kwargs={"load_in_4bit": True, "bnb_4bit_quant_type": "nf4", "bnb_4bit_compute_dtype": torch.bfloat16},
    components_to_quantize=["transformer", "text_encoder_2"],
)
```

مرّر `pipeline_quant_config` إلى [from_pretrained()](/docs/diffusers/v0.43.0/ar/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) لتكميم خط الأنابيب.

```py
pipe = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("photo of a cute dog").images[0]
```

### التكميم المتقدم

توفر حجة `quant_mapping` خيارات إضافية لكيفية تكميم كل مكوّن فردي في خط الأنابيب، مثل دمج واجهات تكميم مختلفة.

قم بتهيئة [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/ar/api/quantization#diffusers.PipelineQuantizationConfig) وقم بتمرير `quant_mapping` إليه. يتيح لك `quant_mapping` تحديد خيارات التكميم لكل مكوّن في خط الأنابيب، مثل المحوّل (transformer) ومشفّر النص (text encoder).

يستخدم المثال أدناه واجهتي برمجة خلفية (backends) للكمّية، وهما [QuantoConfig](/docs/diffusers/v0.43.0/ar/api/quantization#diffusers.QuantoConfig) و[transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/v5.22.2/en/main_classes/quantization#transformers.BitsAndBytesConfig)، للمحوّل (transformer) ومشفّر النص (text encoder).

```py
import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers.quantization_config import QuantoConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": QuantoConfig(weights_dtype="int8"),
        "text_encoder_2": TransformersBitsAndBytesConfig(
            load_in_4bit=True, compute_dtype=torch.bfloat16
        ),
    }
)
```

يوجد مُنفّذ (backend) منفصل لـ bitsandbytes في [Transformers](https://huggingface.co/docs/transformers/main_classes/quantization#transformers.BitsAndBytesConfig). تحتاج إلى استيراد واستخدام [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/v5.22.2/en/main_classes/quantization#transformers.BitsAndBytesConfig) للمكوّنات القادمة من Transformers. على سبيل المثال، `text_encoder_2` في [FluxPipeline](/docs/diffusers/v0.43.0/ar/api/pipelines/flux#diffusers.FluxPipeline) هو [T5EncoderModel](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/t5#transformers.T5EncoderModel) من Transformers، لذا عليك استخدام [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/v5.22.2/en/main_classes/quantization#transformers.BitsAndBytesConfig) بدلاً من [diffusers.BitsAndBytesConfig](/docs/diffusers/v0.43.0/ar/api/quantization#diffusers.BitsAndBytesConfig).

> [!TIP]
> استخدم طريقة [التكميم الأساسية](#basic-quantization) المذكورة أعلاه إذا كنت لا ترغب في إدارة هذه الاستيرادات المختلفة أو إذا لم تكن متأكداً من مصدر كل مكوّن في خط المعالجة.

```py
import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16),
        "text_encoder_2": TransformersBitsAndBytesConfig(
            load_in_4bit=True, compute_dtype=torch.bfloat16
        ),
    }
)
```

مرّر `pipeline_quant_config` إلى [from_pretrained()](/docs/diffusers/v0.43.0/ar/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) لتكميم خط الأنابيب.

```py
pipe = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("photo of a cute dog").images[0]
```

## تحميل نقاط التفتيش المُسبقة التكميم

تدعم بعض واجهات التكميم (quantization backends) تحميل نقاط التفتيش (checkpoints) التي تم تكميمها مسبقًا ورفعها إلى الـ Hub. في هذه الحالة، يتم تخزين إعدادات التكميم في ملف `config.json` الخاص بالنموذج وتُقرأ تلقائيًا — فلا حاجة إلى إنشاء [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/ar/api/quantization#diffusers.PipelineQuantizationConfig) أو تمرير معامل `quantization_config`.

```py
import torch
from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(
    "rootonchair/ERNIE-Image-Turbo-nunchaku-lite-nvfp4",
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"
```

تدعم الخوادم الخلفية التالية تحميل نقاط التفتيش المُسبقة الكمّية دون أي إعداد إضافي.

| الواجهة الخلفية | ملاحظات |
|---|---|
| [bitsandbytes](./bitsandbytes) | يتم حفظ Config في `config.json`؛ لا حاجة إلى أي حُجج إضافية. يدعم أيضًا التكميم أثناء التشغيل، وكذلك تحميل نقاط التفتيش المُكمَّمة مسبقًا. |
| [torchao](./torchao) | نفس ما سبق. |
| [GGUF](./gguf) | يستخدم `from_single_file` مع فئات النموذج؛ ولا يُدعم التحميل على مستوى خط الأنابيب. |
| [BFL](./bfl) | يحمّل نقاط التفتيش أحادية الملف من Black Forest Labs بصيغتي `fp8r` و`nvfp4` باستخدام `from_single_file`؛ ولا يُدعم التحميل على مستوى خط الأنابيب. |
| [AutoRound](./autoround) | يُؤمَّن التحميل فقط؛ قم بتكميم النموذج أولاً باستخدام واجهة سطر الأوامر AutoRound CLI أو واجهة برمجة التطبيقات Python API. |
| [نونتشاكو لايت](./nunchaku) | يُحفظ Config في `config.json`؛ ويتطلب الحزمة `kernels`. يتم دعم التحميل فقط. |
| [ModelOpt](./modelopt) | يُؤيَّد تحميل النماذج المُكمَّاة مسبقًا فقط. |
| [SDNQ](./sdnq) | يدعم كلًا من التكميم أثناء التشغيل وتحميل النماذج المُكمَّمة مسبقًا؛ ويتطلب حزمة `sdnq`. |

## الموارد

اطّلع على الموارد أدناه لمعرفة المزيد حول التكميم.

- إذا كنتَ جديدًا في مجال التكميم، فننصحك بالاطلاع على الدورات التعليمية التالية المصممة للمبتدئين والمقدمة بالتعاون مع DeepLearning.AI.

    - [أساسيات التكميم مع Hugging Face](https://www.deeplearning.ai/short-courses/quantization-fundamentals-with-hugging-face/)
    - [التكميم بالتفصيل](https://www.deeplearning.ai/short-courses/quantization-in-depth/)

- راجع [دليل المساهمة في إضافة طريقة تكميم جديدة](https://huggingface.co/docs/transformers/main/en/quantization/contribute) إذا كنت مهتمًا بإضافة طريقة تكميم جديدة.

- توفر نظرة عامة على التكميم في [Transformers](https://huggingface.co/docs/transformers/quantization/overview#when-to-use-what) نظرة شاملة على مزايا وعيوب مختلف أنظمة التكميم.

- اقرأ منشور المدونة [استكشاف واجهات التكميم في Diffusers](https://huggingface.co/blog/diffusers-quantization) للحصول على مقدمة موجزة لكل واجهة تكميم، وكيفية اختيار واجهة، ودمج التكميم مع تحسينات الذاكرة الأخرى.

