# Quark

[Quark](https://quark.docs.amd.com/latest/) هو مجموعة أدوات لتكميم التعلم العميق مصممة لتكون مستقلة عن أنواع البيانات والخوارزميات والأجهزة المحددة. يمكن دمج استراتيجيات ما قبل المعالجة والخوارزميات وأنواع البيانات المختلفة في Quark.

تستهدف دمج دعم PyTorch من خلال 🤗 Transformers بشكل أساسي معالجات AMD ووحدات معالجة الرسوميات، وهي مخصصة في المقام الأول لأغراض التقييم. على سبيل المثال، يمكن استخدام [lm-evaluation-harness](https://github.com/EleutherAI/lm-evaluation-harness) مع واجهة 🤗 Transformers الخلفية لتقييم مجموعة واسعة من النماذج المُكمّمة عبر Quark بسلاسة.

يمكن للمستخدمين المهتمين بـ Quark الرجوع إلى [توثيقه](https://quark.docs.amd.com/latest/) للبدء في تكميم النماذج واستخدامها في المكتبات مفتوحة المصدر المدعومة!

على الرغم من أن Quark يملك صيغة نقطة تفتيش / [تكوين خاصة به](https://huggingface.co/amd/Llama-3.1-8B-Instruct-FP8-KV-Quark-test/blob/main/config.json#L26)، فإن المكتبة تدعم أيضاً إنتاج نماذج بتخطيط تسلسل متوافق مع تطبيقات التكميم/الوقت التشغيلي الأخرى ([AutoAWQ](./awq)، [fp8 الأصلية في 🤗 Transformers](./finegrained_fp8)).

لتمكين تحميل نماذج Quark المُكمّاة في Transformers، يجب أولاً تثبيت المكتبة:

```bash
pip install amd-quark
```

## مصفوفة الدعم

تدعم النماذج المُكمّمة عبر Quark مجموعة واسعة من الميزات التي يمكن دمجها معًا. كما يمكن إعادة تحميل جميع النماذج المُكمّمة، بغض النظر عن إعداداتها، بسلاسة عبر `PretrainedModel.from_pretrained`.

تُظهر الجدول أدناه بعض الميزات المدعومة في Quark:

| **الميزة**                     | **المجموعة الفرعية المدعومة في Quark**                                                                             |   |
|---------------------------------|-----------------------------------------------------------------------------------------------------------|---|
| أنواع البيانات                      | int8, int4, int2, bfloat16, float16, fp8_e5m2, fp8_e4m3, fp6_e3m2, fp6_e2m3, fp4, OCP MX, MX6, MX9, bfp16 |   |
| تحويل ما قبل التكميم | SmoothQuant، QuaRot، SpinQuant، AWQ                                                                       |   |
| خوارزمية التكميم          | GPTQ                                                                                                      |   |
| المشغّلات المدعومة             | ``nn.Linear``, ``nn.Conv2d``, ``nn.ConvTranspose2d``, ``nn.Embedding``, ``nn.EmbeddingBag``               |   |
| حجم الحبيبات                     | لكل موصل، لكل قناة، لكل كتلة، لكل طبقة، نوع لكل طبقة                                             |   |
| ذاكرة التخزين المؤقت KV                        | fp8                                                                                                       |   |
| معايرة التفعيل          | MinMax / النسبة المئوية / MSE                                                                                 |   |
| استراتيجية التكميم           | بأوزان فقط، ثابت، ديناميكي، مع أو بدون تكميم للإخراج                                         |   |

## النماذج على Hugging Face Hub

يمكن العثور على النماذج العامة التي تستخدم تسلسل Quark الأصلي على https://huggingface.co/models?other=quark.

على الرغم من أن Quark يدعم أيضًا [النماذج التي تستخدم `quant_method="fp8"`](https://huggingface.co/models?other=fp8) و[النماذج التي تستخدم `quant_method="awq"`](https://huggingface.co/models?other=awq)، فإن Transformers يحمّل هذه النماذج من خلال [AutoAWQ](./awq) أو يستخدم [دعم fp8 الأصلي في 🤗 Transformers](./finegrained_fp8).

## استخدام نماذج Quark في Transformers

فيما يلي مثال على كيفية تحميل نموذج Quark في Transformers:

```python
from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "EmbeddedLLM/Llama-3.1-8B-Instruct-w_fp8_per_channel_sym"
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")

print(model.model.layers[0].self_attn.q_proj)
# QParamsLinear(
#   (weight_quantizer): ScaledRealQuantizer()
#   (input_quantizer): ScaledRealQuantizer()
#   (output_quantizer): ScaledRealQuantizer()
# )

tokenizer = AutoTokenizer.from_pretrained(model_id)
inp = tokenizer("Where is a good place to cycle around Tokyo?", return_tensors="pt")
inp = inp.to(model.device)

res = model.generate(**inp, min_new_tokens=50, max_new_tokens=100)

print(tokenizer.batch_decode(res)[0])
# <|begin_of_text|>Where is a good place to cycle around Tokyo? There are several places in Tokyo that are suitable for cycling, depending on your skill level and interests. Here are a few suggestions:
# 1. Yoyogi Park: This park is a popular spot for cycling and has a wide, flat path that's perfect for beginners. You can also visit the Meiji Shrine, a famous Shinto shrine located in the park.
# 2. Imperial Palace East Garden: This beautiful garden has a large, flat path that's perfect for cycling. You can also visit the
```

