Transformers documentation

FP8 الدقيق

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

FP8 الدقيق

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

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

يتيح التكميم FP8 دعم DeepSeek-V3 و DeepSeek-R1.

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

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

pip install --upgrade accelerate torch

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

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() لحفظ النموذج المُكمَّم، ثم أعد تحميله باستخدام from_pretrained().

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 من kernels-community/deep-gemm عندما تكون weight_block_size=(128, 128) وactivation_scheme="dynamic". تكون DeepGEMM أسرع بمقدار 3 إلى 6 أضعاف مقارنةً بـ Triton fallback. قم بتثبيت حزمة kernels أو ترقيةً لتمكينها.

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().

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

صيغة مقياس 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 دون الحاجة إلى تحويل. راجع دليل خلفيات الخبراء لمعرفة خيارات خلفية الخبراء.

Update on GitHub