# GPTQ

يُنفّذ مشروع [GPT-QModel](https://github.com/ModelCloud/GPTQModel) (حزمة بايثون `gptqmodel`) خوارزمية GPTQ، وهي تقنية تكميم بعد التدريب يتم فيها تكميم كل صف من مصفوفة الأوزان بشكل مستقل للعثور على نسخة من الأوزان تُقلّل الخطأ إلى أدنى حد. يتم تكميم هذه الأوزان إلى int4، لكنها تُستعاد إلى fp16 على الفور أثناء الاستدلال. يمكن أن يوفر ذلك 4 أضعاف من استهلاك الذاكرة لأن أوزان int4 تُفكّ تكميمها في نواة مدمجة بدلاً من الذاكرة العامة للوحدة الرسومية. كما يكون الاستدلال أسرع لأن عرض بت أقل يستغرق وقتاً أقل للتواصل.

لم يعد AutoGPTQ مدعوماً في Transformers. قم بتثبيت GPT-QModel بدلاً من ذلك.

قم بتثبيت Accelerate وTransformers وOptimum أولاً.

```bash
pip install --upgrade accelerate optimum transformers
```

ثمّ نفّذ الأمر أدناه لتثبيت GPT-QModel.

```bash
pip install gptqmodel --no-build-isolation
```

أنشئ فئة [GPTQConfig](/docs/transformers/main/ar/main_classes/quantization#transformers.GPTQConfig) وحدد عدد البتات التي سيتم التكميم إليها، ومجموعة بيانات لمعايرة الأوزان للتكميم، ومُرمّز (tokenizer) لتحضير مجموعة البيانات.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m")
gptq_config = GPTQConfig(bits=4, dataset="c4", tokenizer=tokenizer)
```

يمكنك تمرير مجموعة بياناتك الخاصة كقائمة من النصوص، لكن يُوصى بشدة باستخدام نفس مجموعة البيانات الواردة في ورقة GPTQ.

```py
dataset = ["gptqmodel is an easy-to-use model quantization library with user-friendly apis, based on the GPTQ algorithm."]
gptq_config = GPTQConfig(bits=4, dataset=dataset, tokenizer=tokenizer)
```

Load a model to quantize and pass [GPTQConfig](/docs/transformers/main/ar/main_classes/quantization#transformers.GPTQConfig) to [from_pretrained()](/docs/transformers/main/ar/model_doc/auto#transformers.AutoModel.from_pretrained). Set `device_map="auto"` to automatically offload the model to a CPU to help fit the model in memory, and allow the model modules to be moved between the CPU and GPU for quantization.

```py
quantized_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m", device_map="auto", quantization_config=gptq_config)
```

إذا كنت تستنفد الذاكرة لأن مجموعة البيانات كبيرة جداً (لا يُدعم تفريغ القرص)، فحاول تمرير معامل `max_memory` لتخصيص كمية الذاكرة المراد استخدامها على جهازك (وحدة معالجة الرسوميات GPU ومعالج CPU).

```py
quantized_model = AutoModelForCausalLM.from_pretrained(
    "facebook/opt-125m",
    device_map="auto",
    max_memory={0: "30GiB", 1: "46GiB", "cpu": "30GiB"},
    quantization_config=gptq_config
)
```

> [!WARNING]
> قد يستغرق تكميم نموذج من الصفر بعض الوقت اعتماداً على العتاد الخاص بك. على سبيل المثال، يستغرق تكميم نموذج [facebook/opt-350m](https://huggingface.co/facebook/opt-350m) حوالي 5 دقائق على وحدة معالجة رسومية (GPU) في فئة Google Colab المجانية، بينما يستغرق تكميم نموذج يحتوي على 175 مليار معامل حوالي 4 ساعات على وحدة NVIDIA A100. قبل تكميم نموذج، يُنصح بالتحقق من Hub لمعرفة ما إذا كانت هناك نسخة مُكمّمة باستخدام GPTQ من النموذج موجودة بالفعل.

بمجرد تكميم النموذج، يمكنك استخدام [push_to_hub()](/docs/transformers/main/ar/main_classes/model#transformers.utils.PushToHubMixin.push_to_hub) لدفع النموذج ومجزئ الرموز إلى Hub حيث يمكن مشاركته والوصول إليه بسهولة. وهذا يحفظ [GPTQConfig](/docs/transformers/main/ar/main_classes/quantization#transformers.GPTQConfig).

```py
quantized_model.push_to_hub("opt-125m-gptq")
tokenizer.push_to_hub("opt-125m-gptq")
```

يحفظ [save_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.save_pretrained) النموذج المُكمَّم محليًا. إذا تم كمّ النموذج باستخدام معامل `device_map`، فتأكد من نقل النموذج بالكامل إلى وحدة معالجة رسومية (GPU) أو وحدة معالجة مركزية (CPU) قبل حفظه. يحفظ المثال أدناه النموذج على وحدة المعالجة المركزية.

```py
quantized_model.save_pretrained("opt-125m-gptq")
tokenizer.save_pretrained("opt-125m-gptq")

# if quantized with device_map set
quantized_model.to("cpu")
quantized_model.save_pretrained("opt-125m-gptq")
```

أعد تحميل نموذج مُكمَّم باستخدام [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained)، واضبط `device_map="auto"` لتوزيع النموذج تلقائيًا على جميع وحدات معالجة الرسوميات المتاحة، مما يتيح تحميل النموذج بشكل أسرع دون استخدام ذاكرة أكثر من اللازم.

```py
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto")
```

## Marlin

[Marlin](https://github.com/IST-DASLab/marlin) هو نواة CUDA مخصصة حصريًا للكمّية 4-بت، مُحسّنة بشكل كبير لمعمارية GPU من NVIDIA A100 (Ampere). عمليات التحميل، وفكّ الكمّية، وتنفيذ الأوزان بعد فكّ الكمّية مُوازاة إلى حدٍّ كبير، مما يوفر تحسينًا كبيرًا في الاستدلال مقارنةً بنواة CUDA GPTQ الأصلية. يتوفر Marlin للاستدلال المُكمّى فقط، ولا يدعم كمّية النموذج.

يمكن تفعيل استنتاج Marlin باستخدام معامل `backend` في [GPTQConfig](/docs/transformers/main/ar/main_classes/quantization#transformers.GPTQConfig).

```py

from transformers import AutoModelForCausalLM, GPTQConfig

model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto", quantization_config=GPTQConfig(bits=4, backend="marlin"))
```

## GPT-QModel

GPT-QModel هو الخلفية (backend) التي يتم صيانتها بنشاط لـ GPTQ في Transformers. تم استنساخه (fork) في الأصل من AutoGPTQ، لكنه انبثق منذ ذلك الحين مع تحسينات كبيرة مثل التكميم (quantization) الأسرع، واستخدام أقل للذاكرة، وإعدادات افتراضية أكثر دقة.

يوفر GPT-QModel تكميمًا غير متماثل، مما قد يُقلّل من أخطاء التكميم مقارنةً بالتكميم المتماثل. وهو غير متوافق مع نقاط التفتيش القديمة لـ AutoGPTQ، كما أن جميع النوى (Marlin) لا تدعم التكميم غير المتماثل.

يتمتع GPT-QModel أيضاً بدعم أوسع لأحدث نماذج LLM، والنماذج متعددة الوسائط (Qwen2-VL وOvis1.6-VL)، والمنصات (Linux، وmacOS، وWindows 11)، والأجهزة (AMD ROCm، وApple Silicon، ومعالجات Intel/AMD، وبطاقات الرسوميات Intel Datacenter Max/Arc، وغيرها).

تم تحديث نواة Marlin أيضاً لبطاقات A100 الرسومية، كما تم تحديث النوى الأخرى لتشمل التوسيط التلقائي (auto-padding) للنماذج القديمة والنماذج ذات ميزات الإدخال/الإخراج غير المنتظمة.

## الموارد

شغّل كميّة GPTQ باستخدام دفتر ملاحظات [notebook](https://colab.research.google.com/drive/1_TIrmuKOFhuRRiTWN94iLKUFu6ZX4ceb?usp=sharing) الخاص بـ PEFT للحصول على تجربة عملية.

