# FP8 الدقيق

تقوم عملية التكميم الدقيق FP8 بتكميم الأوزان والتفعيلات إلى fp8.

- تُكمَّم الأوزان إلى 8 بتات لكل كتلة ثنائية الأبعاد (`weight_block_size=(128, 128)`).
- تُكمَّم التفعيلات إلى 8 بتات لكل مجموعة لكل رمز. ويتطابق حجم المجموعة مع الأوزان في قناة الإدخال (128 افتراضياً).

يتيح التكميم FP8 دعم [DeepSeek-V3](https://hf.co/papers/2412.19437) و DeepSeek-R1.

    

> [!TIP]
> تحتاج إلى وحدة معالجة رسومية (GPU) بقدرة حسابية >=9 (H100)، وتثبيت إصدار من PyTorch متوافق مع إصدار CUDA الخاص بوحدة المعالجة الرسومية لديك.

قم بتثبيت Accelerate والتحديث إلى أحدث إصدار من PyTorch.

```bash
pip install --upgrade accelerate torch
```

أنشئ فئة [FineGrainedFP8Config](/docs/transformers/main/ar/main_classes/quantization#transformers.FineGrainedFP8Config) وقم بتمريرها إلى [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لأغراض التكميم. يتم تحميل الأوزان بدقة كاملة (`torch.float32`) افتراضياً بغض النظر عن نوع البيانات الفعلي الذي تُخزَّن فيه الأوزان. اضبط `dtype="auto"` لتحميل الأوزان بنوع البيانات المعرّف في ملف `config.json` الخاص بالنموذج، وذلك لتحميل نوع البيانات الأكثر كفاءة في استخدام الذاكرة تلقائياً.

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

model_name = "meta-llama/Meta-Llama-3-8B"
quantization_config = FineGrainedFP8Config()
quantized_model = AutoModelForCausalLM.from_pretrained(model_name, dtype="auto", device_map="auto", quantization_config=quantization_config)

tokenizer = AutoTokenizer.from_pretrained(model_name)
input_text = "What are we having for dinner?"
input_ids = tokenizer(input_text, return_tensors="pt").to(quantized_model.device.type)

output = quantized_model.generate(**input_ids, max_new_tokens=10)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

استخدم [save_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.save_pretrained) لحفظ النموذج المُكمَّم، ثم أعد تحميله باستخدام [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained).

```py
quant_path = "/path/to/save/quantized/model"
quantized_model.save_pretrained(quant_path)
model = AutoModelForCausalLM.from_pretrained(quant_path, device_map="auto")
```

## مسار DeepGEMM السريع

على وحدات معالجة الرسوميات Hopper (SM90+) وBlackwell (SM100+)، تُوجَّه كل عمليات الضرب الخطي FP8 تلقائيًا إلى نواة [DeepGEMM](https://github.com/deepseek-ai/DeepGEMM) من [kernels-community/deep-gemm](https://huggingface.co/kernels-community/deep-gemm) عندما تكون `weight_block_size=(128, 128)` و`activation_scheme="dynamic"`. تكون DeepGEMM أسرع بمقدار 3 إلى 6 أضعاف مقارنةً بـ Triton fallback. قم بتثبيت حزمة [kernels](https://github.com/huggingface/kernels) أو ترقيةً لتمكينها.

```bash
pip install -U kernels
```

يقوم DeepGEMM بتجميع نواته (kernels) بشكل JIT باستخدام `nvcc` الخاص بالنظام، لذا يجب تثبيت مجموعة أدوات CUDA كاملة. لن يعمل التثبيت الذي يعتمد على وقت التشغيل فقط (مكتبات CUDA دون `nvcc`). يعتمد الحد الأدنى لإصدار مجموعة الأدوات على العتاد: 12.3 أو أحدث على Hopper (SM90)، و12.9 أو أحدث على Blackwell (SM100).

يبحث Transformers عن مجموعة الأدوات بالتحقق من `CUDA_HOME`، ثم `CUDA_PATH`، ثم `nvcc` في `PATH` الخاص بك، ثم `/usr/local/cuda`. اضبط `CUDA_HOME` على جذر مجموعة الأدوات إذا لم يتم اكتشاف `nvcc`.

إذا تعذّر تحميل النواة (بسبب غياب `kernels`، أو عدم دعم بطاقة الرسوميات، أو عدم توفر مجموعة أدوات CUDA، أو أن إصدار `nvcc` أقدم من الإصدار المطلوب)، يسجّل Transformers تحذيراً مرة واحدة ثم يعود إلى نواة Triton الخاصة بتكميم fp8 الدقيق. ويبقى تكميم التفعيل الثابت دائماً على مسار Triton.

لإجبار استخدام بديل `TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1` حتى عندما يكون DeepGEMM متاحًا، اضبط `TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1`. يؤثر هذا فقط على توزيع خطي FP8 ويترك خلفية الخبراء `"deepgemm"` دون تغيير، والتي يتم التبديل إليها عبر [set_experts_implementation()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.set_experts_implementation).

لخبراء MoE، مسار DeepGEMM اختياري. مرّر `experts_implementation="deepgemm"` (أو `"deepgemm_megamoe"` على Blackwell) عند التحميل لتوجيه عمليات ضرب المصفوفات للخبراء عبر DeepGEMM. راجع دليل [واجهات الخبراء](../experts_interface) للاطلاع على مجموعة الخيارات الكاملة.

## صيغة مقياس UE8M0

تُخزّن نقاط التفتيش بنمط DeepSeek V4 مقاييس الأوزان بصيغة FP8 في الصيغة المعبّأة `float8_e8m0fnu` بدلاً من `float32`. هذه النقاط التفتيش مُكمّاة مسبقاً وتُعيّن `scale_fmt="ue8m0"` في إعدادات التكميم الخاصة بها. تقرأ نواة DeepGEMM ونواة Triton مقاييس UE8M0، لذا تعمل هذه النقاط التفتيش على أيٍّ من المسارين.

على Blackwell (SM100+)، تدعم نواة DeepGEMM الخاصة بالخبراء مقاييس UE8M0 فقط. يؤدي استخدام نقطة تفتيش بمقاييس `float32` عادية (`scale_fmt="float"`) إلى رفع `ValueError`. استخدم نقطة تفتيش بمقاييس `scale_fmt="ue8m0"`، أو شغّل الخبراء باستخدام `grouped_mm` أو `batched_mm`، والتي تدعم مقاييس `float32` مباشرةً. يدعم Hopper (SM90+) مقاييس `float32` على مسار DeepGEMM دون الحاجة إلى تحويل. راجع دليل [خلفيات الخبراء](../experts_interface) لمعرفة خيارات خلفية الخبراء.

