Transformers documentation

مفاهيم التكميم

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

مفاهيم التكميم

لا يمكن للعدد المُكمَّم أن يأخذ سوى قيمة واحدة من مجموعة صغيرة من القيم، وهي 256 قيمة لنوع int8 و16 قيمة لنوع int4، لذا فإن كل طريقة تكميم تُدخل خطأً في التقريب. تختلف الطرق في كيفية منع هذا الخطأ من الإضرار بمخرجات النموذج. تشرح هذه الصفحة الخيارات الكامنة وراء تلك الاختلافات: كيفية تعيين الأعداد إلى تلك المجموعة الصغيرة، وأيُّ الموترات (tensors) تخضع للتكميم، وأنواع البيانات المستخدمة، ومتى يحدث التكميم.

إذا كنت جديدًا في التكميم في Transformers، فابدأ بـ نظرة عامة.

تعيين القيم إلى عدد أقل من البتات

تُحوّل عملية التكميم نطاقاً من القيم عالية الدقة إلى مجموعة صغيرة من الأعداد الصحيحة التي يمكن لنوع ذي عدد بتات منخفض تمثيلها. يمكن لنوع int8 تمثيل 256 عدداً صحيحاً، [-128, 127]، بينما يمكن لنوع int4 تمثيل 16 عدداً صحيحاً.

التكميم الأفيني هو التحويل الأكثر شيوعاً. يقوم بأخذ القيم الدنيا والعليا لمُتجه (tensor) ومدّ نطاق الأعداد الصحيحة عليها. في المثال أدناه، يُحوَّل مُتجه تتراوح قيمه بين -1.8 و 2.4 إلى int8، حيث تقع القيمة 0.0 عند -19.

bf16  -1.8             0.0                    2.4
       ├────────────────┼──────────────────────┤
       ▼                ▼                      ▼
int8  -128             -19                    127

يحدد معاملان عملية الإسناد.

  • القيمة scale S هي حجم خطوة عددية صحيحة واحدة في الوحدات الأصلية. S=valmax−valminqmax−qmin S = \frac{val_{max} - val_{min}}{q_{max} - q_{min}}

  • النقطة الصفرية Z هي العدد الصحيح الذي يمثل 0.0. Z=qmin−round(valminS) Z = q_{min} - round\left(\frac{val_{min}}{S}\right)

قيمة x تُكمَّم إلى العدد الصحيح q بقسمة القيمة على معامل المقياس وإزاحتها بمقدار نقطة الصفر. q=round(xS+Z) q = round\left(\frac{x}{S} + Z\right)

تُعيد عملية إلغاء التكميم (Dequantization) عكس عملية الخرائط وتُرجع تقريبًا لـ x. الفرق بين x وتقريبه هو خطأ التقريب. x≈S⋅(q−Z) x \approx S \cdot (q - Z)

في المثال أعلاه، S يساوي تقريبًا 0.0165 وZ يساوي -19. القيمة 0.5 تُكمَّم إلى 11، و11 تُفكَّ كمًّا إلى حوالي 0.494، أي خطأ تقريب قدره 0.006.

┌─────┐  quantize   ┌────┐ dequantize   ┌───────┐
│ 0.5 │ ──────────▶ │ 11 │ ───────────▶ │ 0.494 │
└─────┘             └────┘              └───────┘

تأتي الكمية الأفينية (Affine quantization) في شكلين.

  • تستخدم عملية التكميم غير المتماثل الصيغ المذكورة أعلاه. فهي تُطابق المدى الدقيق، مما يمنع هدر القيم القابلة للتعبير عندما لا تكون الأوزان متمركزة حول الصفر.
  • يفترض التكميم المتماثل أن المدى هو [-a, a] ويثبّت Z عند 0، لذا يُخزَّن المقياس فقط. الحسابات أرخص، لكن بعض القيم القابلة للتعبير تبقى غير مستخدمة عندما تميل الأوزان إلى جانب واحد من الصفر.

اختر مستوى التفصيل

تُخزَّن مقياس واحد لكل متجه كامل بتكلفة منخفضة، لكن أي قيمة شاذة كبيرة واحدة تُوسّع المدى وتُبعّد القيم القابلة للتعبير عن بعضها البعض لجميع الأوزان الأخرى. تمنح المجموعات الأصغر كل مقياس مدى أضيق يجب تغطيته.

  • يستخدم Per-tensor مقياسًا واحدًا ونقطة صفر واحدة للمصفوفة بأكملها.
  • يستخدم Per-channel مقياسًا واحدًا لكل قناة مخرجات، وهي كل صف من مصفوفة الأوزان.
  • يستخدم الترميز على مستوى المجموعة، أو على مستوى الكتلة، مقياسًا واحدًا لكل مجموعة من القيم المتتالية، مثل 128 وزنًا. وتكلّف كل مجموعة تخزينًا إضافيًا لمقياسها.

يُظهر المخطط أدناه الخيارات الثلاثة على مصفوفة أوزان تحتوي على ثلاثة صفوف. كل s يمثل مقياسًا واحدًا.

per-tensor        per-channel           per-group
┌────────────┐    ┌────────────┐        ┌──────┬──────┐
│            │    │            │ s0     │  s0  │  s1  │
│            │    ├────────────┤        ├──────┼──────┤
│     s      │    │            │ s1     │  s2  │  s3  │
│            │    ├────────────┤        ├──────┼──────┤
│            │    │            │ s2     │  s4  │  s5  │
└────────────┘    └────────────┘        └──────┴──────┘

تعتمد معظم طرق البت المنخفض على التكميم لكل مجموعة. افتراضيًا، يستخدم GPTQ مجموعات من 128 وزنًا، بينما يستخدم Fine-grained FP8 افتراضيًا كتلًا بحجم 128x128. أما صيغ FP4 الواردة في Data types فتدمج حجم الكتلة في الصيغة ذاتها.

كمّية الأوزان أو التنشيطات

تختلف الأساليب في الموترات التي تُكمّتها، وهذا ما يحدد مكان تنفيذ عملية ضرب المصفوفات.

  • تُخزّن طرق Weight-only الأوزان بدقة منخفضة، وتُبقي التنشيطات في bf16 أو fp16. قبل كل عملية ضرب مصفوفي، يقوم النواة بإلغاء تكميم الأوزان إلى نوع بيانات حساب بدقة أعلى. تعمل bitsandbytes 4-bit وAWQ وGPTQ وHQQ بهذه الطريقة. في bitsandbytes، يحدد bnb_4bit_compute_dtype نوع بيانات الحساب هذا.
  • تقوم طرق الوزن والتفعيل بتكميم التفعيلات أيضاً، وتُنفَّذ عملية ضرب المصفوفات مباشرةً بدقة منخفضة. وهذا يتطلب أجهزة تدعم ضرب المصفوفات بدقة منخفضة، مثل FP8 على وحدات معالجة الرسوميات الحديثة. وغالباً ما يُكتب هذا المخطط على أنه W8A8 للإشارة إلى أوزان وتفعيلات بدقة 8 بت.

توفّر طرق التكميم على مستوى الأوزان فقط من الذاكرة، لكنها لا تعمل بالضرورة بشكل أسرع، لأن فك التكميم يضيف عملاً إضافياً إلى كل عملية ضرب مصفوفي. وتُسهم هذه الطرق في تسريع التوليد عندما يكون النموذج مقيّداً بالذاكرة. فعند توليد رمز واحد في كل مرة، يقضي المعالج الرسومي (GPU) معظم كل خطوة في قراءة الأوزان من الذاكرة بدلاً من إجراء العمليات الحسابية. وقراءة أوزان بدقة 4 بت تنقل ربع حجم البيانات التي تنقلها أوزان بدقة bf16، وقد يتجاوز هذا التوفير تكلفة فك التكميم.

تساعد طرق الأوزان والتفعيلات عندما يكون النموذج مقيّدًا بالحوسبة، كما هو الحال في مرحلة التعبئة المسبقة أو عند استخدام دفعات كبيرة، لأن عملية ضرب المصفوفات منخفضة الدقة نفسها أسرع. وتقوم بعض الطرق بالتبديل بين الطريقتين. حيث ينفّذ NVFP4 عملية ضرب مصفوفات بأوزان 4 بت وتفعيلات 4 بت لمرحلة التعبئة المسبقة، وعملية ضرب مصفوفات بأوزان 4 بت وتفعيلات 16 بت لمرحلة فك الترميز.

أنواع البيانات

يحدد نوع البيانات القيم التي يمكن لرقم مُكمَّم أن يمثلها.

int8 و int4

يمثل int8 وint4 أعدادًا صحيحة متباعدة بالتساوي، ويستخدمان التحويل الأفيني المذكور أعلاه. لا يمكن لـint4 تمثيل سوى 16 قيمة، لذا يفقد دقة أكبر من int8. عادةً ما تستخدم الأساليب التي تعتمد على int4 التكميم لكل مجموعة أو تستخدم المعايرة للحفاظ على مستوى الدقة.

لا تمتلك معظم الأجهزة نوع تخزين بدقة 4 بت، لذا يتم تعبئة قيمتين من نوع int4 في بايت واحد. على سبيل المثال، يمكن أن تشغل القيمة الأولى 4 بتات السفلية، بينما تشغل القيمة الثانية 4 بتات العلوية. تقوم النوى (Kernels) بفك تعبئة القيم قبل إجراء العمليات الحسابية عليها.

┌──────┐  ┌──────┐        ┌──────┬──────┐
│ val1 │  │ val2 │        │ val2 │ val1 │
│ 0101 │  │ 0011 │   →    │ 0011 │ 0101 │  1 byte
└──────┘  └──────┘        └──────┴──────┘
  int4      int4            high   low

توزّع بعض أنواع 4 بت قيمها القابلة للتعبير بشكل غير متساوٍ لمطابقة طريقة توزيع الأوزان. يضع bitsandbytes NF4 المزيد من قيمه بالقرب من الصفر، حيث تتواجد معظم الأوزان.

FP8

يحافظ FP8 على تخطيط الأعداد العائمة المكوّن من إشارة، وأس، ومantissa في 8 بتات. تكون القيم القابلة للتعبير أقرب إلى بعضها البعض بالقرب من الصفر، وأبعد عن بعضها البعض عند القيم الكبيرة، وهو ما يناسب التوزيع الواسع للقيم في الأوزان والتفعيلات.

يتوفر FP8 في نسختين.

  • يحتوي E4M3 على 4 بتات للأس و3 بتات للمعبّرة. وهو أدقّ لكنه يغطي نطاقاً أصغر. وهو الخيار المعتاد للأوزان والتفعيلات أثناء الاستدلال.
  • يتميز E5M2 بخمط بتات للأس وبتين للمعبّرة. وهو يغطي نطاقاً أوسع بدقة أقل.
E4M3   ┌─┬───────┬─────┐
       │S│E E E E│M M M│
       └─┴───────┴─────┘
E5M2   ┌─┬─────────┬───┐
       │S│E E E E E│M M│
       └─┴─────────┴───┘
  S sign   E exponent   M mantissa

تتطلب عمليات الضرب المصفوفي FP8 دعمًا من العتاد، مثل وحدات معالجة الرسوميات من NVIDIA التي تتمتع بقابلية معالجة 8.9 أو أعلى (Ada، Hopper، Blackwell)، ووحدات AMD Instinct MI300، ووحدات Intel XPU. يدعم Transformers تقنية FP8 من خلال Fine-grained FP8 وFBGEMM FP8 وcompressed-tensors.

FP4 مع مقاييس الكتلة

يتكوّن FP4 من بت واحد للإشارة، وبتّين للأس، وبت واحد للكسور (E2M1). وهو يمثّل القيم 0 و0.5 و1 و1.5 و2 و3 و4 و6 فقط، سواء كانت موجبة أو سالبة. وبسبب قلة هذه القيم، لا يمكن لتنسيقات FP4 العمل بمقياس واحد لكل متجه. لذلك، تُربط مقياس لكل كتلة صغيرة من القيم، وتُخزَّن هذه المقاييس كجزء من التنسيق.

التنسيقحجم الكتلةمقياس لكل كتلةمقياس إضافي
MXFP432 قيمة8 بتات من قوى العدد 2 (E8M0)لا شيء
NVFP416 قيمةFP8مقياس FP32 واحد لكل متجه

MXFP4 هو تنسيق للتصغير الدقيق (microscaling). مقياس يكون قوة للرقم 2 يُزاح المنفصلة فقط، لذا فإن تطبيقه رخيص التكلفة، لكنه لا يمكنه إلا أن يستقر على قوى الرقم 2. يستخدم NVFP4 كتلًا أصغر ومقياس FP8 يمكنه اتخاذ قيم بين قوى الرقم 2. وهذا يحافظ على دقة أعلى، مقابل مقياس لكل متجه (tensor) يُبقي مقاييس الكتل من نوع FP8 ضمن النطاق. كما أن Four Over Six وFP-Quant تنتج أيضًا أوزانًا من نوع NVFP4 أو MXFP4.

تظهر فكرة الكتلة نفسها عند 8 بتات. يخزّن MXFP8 قيم FP8 مع مقاييس كتل من قوى الرقم 2، ويحمّلها FP8 الدقيق.

كتب الأكواد

أقل من 4 بتات، تتوقف بعض الأساليب عن تقريب كل وزن إلى أقرب قيمة قابلة للتعبير. فهي تُكمِّم مجموعات من الأوزان معًا على شكل متجهات. يحتوي دفتر الرموز (Codebook) على مجموعة من المتجهات المُتعلَّمة، ويُخزَّن كل مجموعة من الأوزان على شكل فهرس أقرب متجه إليها. يعتمد AQLM افتراضيًا على مجموعات من 8 أوزان وفهرس من 16 بتًا، مما يعادل 2 بت لكل وزن. يستخدم VPTQ أيضًا دفاتر رموز. يستغرق إيجاد دفاتر رموز جيدة وقتًا طويلاً من التحسين على بيانات المعايرة، لذا تُكمَّم هذه النماذج مسبقًا وتُحمَّل كنقاط تفتيش (checkpoints).

متى يحدث التكميم

يتم تكميم النموذج إما بعد التدريب أو أثناءه. ومعظم الطرق في Transformers تقوم بتكميم النموذج بعد التدريب.

التكميم بعد التدريب

تكميم ما بعد التدريب (PTQ) يقوم بتكميم نموذج تم تدريبه مسبقًا دون تغيير ما تعلّمه. تختلف طرق PTQ في احتياجها إلى بيانات، وهذا ما يحدد المجموعة التي ينتمي إليها كل منها في فهرس المحتويات الخاص بالتوثيق.

  • في غياب بيانات المعايرة، تُشتقّ المقاييس من الأوزان وحدها، وتكون عملية التكميم سريعة بما يكفي لتنفيذها أثناء تحميل النموذج. تعمل مكتبات bitsandbytes وHQQ وtorchao بهذه الطريقة. وتُدرج هذه الأساليب تحت عنوان التكميم أثناء التحميل.
  • عند استخدام بيانات المعايرة، يمرّر هذا المنهج مجموعة بيانات صغيرة عبر النموذج، ثم يستخدم التنشيطات (activations) لتحديد كيفية تكميم كل طبقة. عادةً ما تمنح المعايرة دقة أفضل عند 4 بتات وما دون، لكنها تستغرق من دقائق إلى ساعات.

تستخدم طرق المعايرة التفعيلات بطرق مختلفة. يقوم GPTQ بتكميم طبقة عموداً تلو الآخر، ويضبط الأعمدة المتبقية لتعويض خطأ التقريب الخاص بكل عمود. أما AWQ فيحدد قنوات الأوزان ذات أكبر التفعيلات، ثم يوسّع نطاقها قبل التقريب لحمايتها.

يحدد مكان تشغيل المعايرة كيفية استخدامك للطريقة في Transformers.

  • يقوم GPTQ بعملية المعايرة داخل from_pretrained عند تمرير dataset إلى GPTQConfig، ولذلك يُدرج تحت التكميم أثناء التحميل.
  • تقوم طرق المعايرة الأخرى، مثل AWQ وAutoRound وAQLM وVPTQ، بالمعايرة في مكتباتها الخاصة. يقوم Transformers بتحميل النتيجة، لذا فهي مدرجة تحت تحميل نقاط التفتيش المُكمّاة مسبقًا.

التدريب الواعي بالكمّ

يحاكي التدريب الواعي بالكمّية (QAT) عملية الكمّية أثناء التدريب. ففي المسار الأمامي، تُقرَّب القيم كما تفعل عملية الكمّية، بينما تُحدَّث الأوزان بدقة كاملة عبر التدرجات، مما يتيح للنموذج تعلُّم تحمّل خطأ التقريب. عادةً ما يمنح QAT أفضل دقة عند استخدام عرض بت منخفض جدًا، لكنه يتطلب تدريب النموذج.

تُدرَّب نماذج BitNet بهذه الطريقة، مع أوزانها بدقة 1.58 بت ضمن حلقة التدريب، وتحمّل مكتبة Transformers نقاط التفتيش المُدرَّبة.

الموارد

Update on GitHub