ضغط النماذج2022متوسط11 دقيقة قراءة

LLM.int8(): ضرب المصفوفات بدقة 8 بت للمحوِّلات على نطاق واسع

LLM.int8(): 8-Bit Matrix Multiplication for Transformers at Scale

Dettmers, T. · Lewis, M. · Belkada, Y. · Zettlemoyer, L. — NeurIPS

المشكلة

النماذج اللغوية الكبيرة مثل GPT-3 (175 مليار معامل) تحتاج ذاكرة GPU هائلة حتى لمجرّد تحميل الأوزان عند — نتحدث عن مئات الغيغابايت. الحل الذي يتبادر إلى الذهن هو تكميم الأوزان من 16 بت إلى أعداد صحيحة بدقة 8 بت لخفض الذاكرة إلى النصف. لكن طرق بدقة 8 بت المتاحة آنذاك لم تُجرَّب إلا على نماذج لا تتجاوز 350 مليون معامل، وحين طُبّقت على نماذج أكبر سبّبت تدهوراً حاداً في الأداء دون أن يفهم أحد السبب.

الإسهام

طريقة تكميم ثنائية المسار تُسمّى LLM.int8() تُمكّن من الاستدلال بدقة 8 بت دون أي خسارة في الأداء لمحوِّلات تصل إلى 175 مليار معامل. المسار الأول هو الذي يمنح كل صف وعمود ثابت تحجيم مستقلاً بدلاً من ثابت واحد لكامل المُوتِّر، ما يرفع دقة التمثيل. المسار الثاني هو التفكيك مختلط الدقة الذي يفصل أبعاد السمات الشاذة (~0.1%) ويُعالجها بدقة 16 بت بينما تبقى الـ 99.9% الباقية بدقة 8 بت. تُقدّم الورقة أيضاً أول تحليل منهجي للسمات الشاذة المنبثقة في المحوِّلات الكبيرة: تتركّز في نحو 6 أبعاد فقط لكنها تتحكّم في أداء النموذج، وظهورها المفاجئ عند حجم 6.7 مليار معامل يُفسّر سبب فشل طرق التكميم السابقة عند التوسّع.

الأثر

جعلت LLM.int8() الاستدلال بالنماذج الكبيرة متاحاً على أجهزة المستهلك لأول مرة — أصبح بالإمكان تشغيل OPT-175B وBLOOM على خادم واحد ببطاقات رسومية استهلاكية. أُدمجت في Hugging Face Transformers عبر حزمة bitsandbytes وباتت الوسيلة الافتراضية لتحميل النماذج الكبيرة بدقة مُخفَّضة. كما ألهم تحليل السمات الشاذة بشكل مباشر تطوير GPTQ وQLoRA، وهما من أكثر طرق التكميم تأثيراً في المجال. ورسّخت الورقة مبدأً جوهرياً: فهم السمات المنبثقة شرط لا غنى عنه لأي تقنية ضغط تُطبَّق على النماذج الكبيرة.

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

لكن في عدد محدود جداً من الخزائن — ست خزائن بالتحديد تتكرّر في المواقع نفسها في كل طابق — تجد أرقاماً ضخمة تفوق بقية القيم بعشرين ضعفاً. لو حاولت تقريب هذه الأرقام، ينهار النظام بأكمله لأن المعلومات التي تحملها بالغة الأهمية رغم قلّتها.

هذه هي فكرة LLM.int8() بالضبط: قرّب 99.9% من الخزائن لتوفير المساحة، لكن انقل تلك المواقع الست الحرجة يدوياً بدقّتها الكاملة. لا شيء يضيع، والمستودع يتّسع في المبنى الجديد.

جدار الذاكرة: لماذا تحتاج النماذج الكبيرة إلى الضغط

حين يكون لديك نموذج بحجم 175 مليار مُخزَّن بدقة 16 بت، فإنه يستهلك نحو 350 غيغابايت من ذاكرة — وهذا لتخزين الأوزان وحدها، قبل أن نحسب أي تنشيطات أو بيانات دُفعة. هذا الرقم يتجاوز طاقة أغلى البطاقات المؤسسية المتوفرة. في عام 2022 كان تشغيل الاستدلال على نموذج كهذا يستلزم عنقوداً من عدة بطاقات يكلّف عشرات آلاف الدولارات.

طبقات التغذية الأمامية وطبقات إسقاط تستحوذ على 95% من إجمالي المعاملات و65–85% من إجمالي العمليات الحسابية. لو استطعنا تكميم هذه الطبقات من 16 بت إلى أعداد صحيحة بدقة 8 بت، لانخفض استهلاك الذاكرة إلى النصف: 175 غيغابايت بدلاً من 350. عند هذا الحجم يمكن تشغيل نماذج مثل OPT-175B وBLOOM على خادم واحد ببطاقات استهلاكية.

لكن التكميم ليس بلا ثمن. تقليل الدقة يعني أنك تمثّل قيماً متصلة بعدد أقل من الخانات المنفصلة. إذا كان توزيع القيم هادئاً ومنتظماً، يبقى خطأ التقريب صغيراً ومقبولاً. أما إذا ظهرت متطرفة، فقد يُدمّر التكميم المعلومات التي يعتمد عليها النموذج في عمله.

افتح في المختبر
قارن بين استهلاك الذاكرة لأحجام مختلفة من النماذج عند دقة 16 بت مقابل 8 بت. النماذج التي كانت بعيدة المنال تصبح قابلة للتشغيل على أجهزة المستهلك.
تستيقظ التجربة عند وصولك…

كيف يعمل التكميم: من 16 بت إلى 8

الفكرة الأساسية في التكميم هي تحويل الأرقام العشرية عالية الدقة إلى أعداد صحيحة بدقة أقل. أبسط الطرق هي : نأخذ كل قيمة في ، نقسمها على أكبر قيمة مطلقة فيه، نضربها في 127، ثم نقرّبها إلى أقرب عدد صحيح. بهذا تنتقل جميع القيم إلى المجال [127,127][-127, 127].

تخيّل الأمر كإعادة تدريج مقياس حرارة. إذا كانت القراءات تتراوح بين 30°-30° و+30°+30°، يمكنك إعادة تدريجها بحيث تصبح 30°-30° هي 127-127 و+30°+30° هي +127+127. كل درجة تحصل على نحو 4 خانات — دقة ممتازة. لكن تخيّل أن قراءة واحدة بلغت 300°300°: الآن 300°300° تحتل القيمة 127127، وتنضغط جميع القراءات الطبيعية في شريحة ضيّقة حول الصفر. قيمة شاذة واحدة كافية لتدمير الدقة بالكامل.

Xi8=127Xf16Xf16=sxXf16X_{\mathrm{i8}} = \left\lfloor \frac{127}{\|X_{\mathrm{f16}}\|_\infty} \cdot X_{\mathrm{f16}} \right\rceil = \left\lfloor s_x \cdot X_{\mathrm{f16}} \right\rceil
تكميم القيمة المطلقة القصوى — التحجيم بمقياس اللانهايةمعامل التحجيم sx=127/Xs_x = 127 / \|X\|_\infty يضغط المُوتِّر بأكمله في المجال [127,127][-127, 127]. إذا كانت أكبر قيمة مطلقة هي 10 يصبح sx=12.7s_x = 12.7 وتحصل القيم على تمثيل جيد. لكن إذا كانت أكبر قيمة 100 ينخفض المعامل إلى sx=1.27s_x = 1.27 وتفقد القيم الصغيرة تمييزها. الرمز \lfloor \cdot \rceil يعني التقريب لأقرب عدد صحيح.
افتح في المختبر
اسحب شريط القيمة الشاذة لترى كيف تضغط قيمة واحدة كبيرة جميع خانات التكميم المخصّصة لبقية القيم. لاحظ كيف تتراجع الدقة تدريجياً.
تستيقظ التجربة عند وصولك…

هناك طريقة أكثر تطوّراً هي ، وفكرتها أنها تُزيح التوزيع بحيث تستفيد المجالات غير المتماثلة من النطاق الكامل [127,127][-127, 127]. هذا مفيد بشكل خاص مع التنشيطات التي تكون دائماً موجبة (مثل مخرجات ReLU)، لأن تكميم absmax في هذه الحالة يُضيع نصف نطاقه على قيم سالبة لن تظهر أصلاً.

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

الابتكار الأول: التكميم المتجهي

في التكميم التقليدي يُستخدم واحد لكامل المُوتِّر — رقم واحد يتحكّم في تحويل ملايين القيم. المشكلة أن وجود قيمة شاذة واحدة يفرض مقياساً غير مناسب على بقية القيم. هذا ما يُسمّى التكميم على مستوى المُوتِّر.

الملاحظة المحورية هنا هي أن عملية ضرب المصفوفات يمكن تفكيكها إلى مجموعة من الجداءات الداخلية المستقلة. كل جداء داخلي يجمع بين صف واحد من وعمود واحد من . وبما أن هذه الجداءات مستقلة عن بعضها، يمكن أن يحصل كل منها على ثابت تحجيم خاص به.

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

Cf161cf16xcf16wCi32=SQ(Af16)Q(Bf16)C_{\mathrm{f16}} \approx \frac{1}{c^x_{\mathrm{f16}} \otimes c^w_{\mathrm{f16}}} \cdot C_{\mathrm{i32}} = S \cdot Q(A_{\mathrm{f16}}) \, Q(B_{\mathrm{f16}})
التكميم المتجهي — تحجيم مستقل لكل صف وعمودكل صف من الحالات الخفية يحصل على ثابت تحجيم مستقل cxc^x، وكل عمود من مصفوفة الأوزان يحصل على ثابته الخاص cwc^w. لاستعادة القيم الأصلية بعد الضرب، نُلغي التحجيم بالجداء الخارجي cxcwc^x \otimes c^w. الجميل هنا أن هذا يرفع الدقة دون الحاجة إلى عتاد مُخصّص — نفس تعليمات ضرب Int8 المعتادة، لكن بتحجيم أدق.
افتح في المختبر
قارن بين التكميم على مستوى المُوتِّر والتكميم المتجهي. بدّل بينهما لترى كيف تُحسّن ثوابت التحجيم المستقلة دقة كل جداء داخلي.
تستيقظ التجربة عند وصولك…

الاكتشاف: السمات الشاذة المنبثقة عند التوسّع

ربما يكون أهم إسهام في هذه الورقة هو تحليلها لما يُعرف بـالسمات الشاذة المنبثقة. مع تكبير نماذج ، يحدث شيء لافت في الحالات الخفية أثناء الاستدلال: بعض الأبعاد تبدأ بإنتاج قيم ضخمة تفوق بقية الأبعاد بعشرين ضعفاً.

هذه ليست ضوضاء عشوائية على الإطلاق، بل هي ظاهرة منهجية بامتياز. في محوِّل بحجم 6.7 مليار معامل يعالج سلسلة من 2048 ، تظهر نحو 150,000 قيمة شاذة عبر جميع — لكنها تتركّز في 6 أبعاد فقط من بين آلاف الأبعاد. نفس الأبعاد الستة، في كل طبقة، وكل رمز، وكل سلسلة.

هذا الظهور يتّبع نمط . تحت 6 مليارات معامل تظهر القيم الشاذة بشكل متقطع في نحو 25% من الطبقات. لكن بين 6 و6.7 مليار يحدث انقلاب مفاجئ: تغزو القيم الشاذة 100% من الطبقات و75% من مواقع السلسلة. وهذه بالتحديد هي النقطة التي تنهار فيها طرق التكميم التقليدية.

افتح في المختبر
حرّك شريط حجم النموذج لتشاهد كيف تظهر السمات الشاذة تدريجياً. لاحظ الانقلاب الحاد عند 6.7 مليار معامل حين تنتشر القيم الشاذة في كل طبقة.
تستيقظ التجربة عند وصولك…

لكن لماذا هذه القيم الشاذة بهذه الأهمية؟ أجرت الورقة تجربة بسيطة: تصفير الأبعاد الشاذة قبل حساب الانتباه. النتيجة كانت كارثية: الاحتمال الأعلى في انخفض بأكثر من 20%، و على مجموعة التحقّق ارتفعت بنسبة 600–1000%. والمفارقة أن هذه القيم لا تشكّل سوى نحو 0.1% من إجمالي السمات.

في المقابل، حذف العدد نفسه من الأبعاد العشوائية غير الشاذة لا يُنقص الاحتمال الأعلى إلا بنسبة 0.3% ولا يرفع الحيرة إلا بنسبة 0.1%.

هذه الأبعاد القليلة تعمل كـطريق سريع للمعلومات — قنوات حرجة يمرّر عبرها النموذج أهم إشاراته. تكميمها بإهمال يُشبه قطع الكابل الرئيسي لمبنى بأكمله: تغيير مادي ضئيل لكن عواقبه مُدمِّرة.

الابتكار الثاني: التفكيك مختلط الدقة

ما دامت القيم الشاذة منهجية ومتركّزة في أبعاد قليلة ثابتة عبر جميع الطبقات، فالحل يكون أنيقاً ومباشراً: افصلها وعاملها بشكل مستقل. قبل تنفيذ ضرب المصفوفات، نُحدّد الأعمدة التي تحتوي على أي قيمة تتجاوز العتبة α=6.0\alpha = 6.0، نسحبها إلى مصفوفات فرعية خاصة ونضربها بدقة 16 بت. أما الـ 99.9% المتبقية فتبقى بدقة 8 بت.

العملية تسير في أربع مراحل. أولاً، نمسح الحالة الخفية لنُحدّد أي أبعاد تحتوي على قيم شاذة فوق العتبة. ثانياً، نُفكّك كلاً من مصفوفة المُدخل ومصفوفة الأوزان إلى جزء شاذ وجزء عادي. ثالثاً، نُجري ضرب المصفوفات الشاذة بدقة 16 بت كاملة، وفي المسار الموازي نُكمّم الجزء العادي متجهياً ونضربه بدقة 8 بت. رابعاً، نجمع الناتجين معاً بدقة 16 بت.

التكلفة الحسابية لا تُذكر لأن الأبعاد الشاذة قليلة جداً — 7 أبعاد على الأكثر من بين آلاف. والذاكرة الإضافية لتخزين هذه الأعمدة بدقة 16 بت لا تتجاوز 0.1%.

Cf16hOXf16hWf16h  +  Sf16hOXi8hWi8hC_{\mathrm{f16}} \approx \sum_{h \in O} X^h_{\mathrm{f16}} W^h_{\mathrm{f16}} \;+\; S_{\mathrm{f16}} \cdot \sum_{h \notin O} X^h_{\mathrm{i8}} W^h_{\mathrm{i8}}
التفكيك مختلط الدقة — قيم شاذة بـ 16 بت + قيم عادية بـ 8 بتالمجموعة OO تضم أبعاد السمات التي تحتوي على قيم شاذة تتجاوز العتبة α\alpha. المجموع الأول يُعالج هذه الأبعاد بدقة 16 بت كاملة. والمجموع الثاني يُعالج كل شيء آخر بدقة 8 بت عبر تكميم متجهي، ثم يُعاد تحجيمه بالمعامل SS. الناتج النهائي يُجمع بدقة 16 بت. وبما أن O7|O| \leq 7، فالتكلفة الإضافية لا تُذكر.
افتح في المختبر
شاهد عملية التفكيك خطوة بخطوة: الأعمدة الشاذة تُسحب وتُضرب بدقة 16 بت، بينما يمرّ كل شيء آخر عبر مسار التكميم بدقة 8 بت.
تستيقظ التجربة عند وصولك…

الصورة الكاملة: طريقة LLM.int8()

طريقة LLM.int8() تدمج بين التكميم المتجهي والتفكيك مختلط الدقة في خط أنابيب واحد. انطلاقاً من مدخلات وأوزان بدقة 16 بت، تسير الطريقة كالتالي:

الخطوة 1: تحديد أبعاد السمات التي تحتوي على قيم شاذة — أي عمود فيه قيمة واحدة على الأقل بحجم مطلق 6.0\geq 6.0.

الخطوة 2: تفكيك مصفوفة المُدخل ومصفوفة الأوزان إلى جزء شاذ وجزء عادي على طول تلك الأبعاد.

الخطوة 3: ضرب الجزء الشاذ بدقة 16 بت كاملة. وفي مسار مستقل، يُكمَّم الجزء العادي باستخدام تكميم absmax متجهي (صفّي للمُدخلات، عمودي للأوزان)، ثم يُنفَّذ ضرب Int8، وتُلغى على الناتج Int32 بالجداء الخارجي لثوابت التحجيم.

الخطوة 4: جمع ناتج المسارين — الشاذ بدقة 16 بت والعادي بعد إلغاء تكميمه — للحصول على الناتج النهائي بدقة 16 بت.

من أجمل ما في هذه الطريقة أنها لا تتطلّب إعادة تدريب، ولا بيانات ، ولا أي تعديل في بنية النموذج. يكفي تحميل مُدرَّبة مسبقاً بدقة 16 بت وتحويلها أثناء التشغيل مباشرة.

استخدام LLM.int8() مع Hugging Face Transformerspython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

from transformers import AutoModelForCausalLM, AutoTokenizer
# تحميل نموذج 175 مليار بدقة 8 بت — يتّسع على وحدات معالجة رسومات استهلاكية model = AutoModelForCausalLM.from_pretrained(
    "facebook/opt-175b",
    load_in_8bit=True,           # <-- يُفعّل LLM.int8()
    device_map="auto"            # يوزّع على وحدات المعالجة المتاحة
) tokenizer = AutoTokenizer.from_pretrained("facebook/opt-175b")
# استخدم النموذج — بلا أي تدهور في الأداء inputs = tokenizer("The future of AI is", return_tensors="pt") output = model.generate(**inputs, max_new_tokens=50) print(tokenizer.decode(output[0]))

النتائج: صفر تدهور حتى 175 مليار معامل

اختبرت الورقة طرق التكميم المختلفة على نماذج تتراوح أحجامها بين 125 مليون و175 مليار معامل، مستخدمةً مقياسين أساسيين: حيرة C4 لقياس جودة نمذجة اللغة، ودقة التقييم على مهام .

النتائج كانت كاشفة. تكميم absmax التقليدي يبدأ بالتدهور عند 2.7 مليار معامل وينهار تماماً عند 13 مليار — بل إن نموذج 13 مليار بدقة 8 بت يؤدي أسوأ من نموذج 6.7 مليار بنفس الدقة، وهو عكس ما تتوقّعه من التوسّع. تكميم نقطة الصفر يصمد لفترة أطول لكنه يفشل هو أيضاً عند 13 مليار. والتكميم المتجهي وحده يؤخّر المشكلة دون أن يحلّها.

LLM.int8() هي الطريقة الوحيدة التي حافظت على أداء 16 بت الكامل في كل حجم تمّ اختباره. عند 175 مليار معامل (OPT-175B) طابق نموذج 8 بت أداء نموذج 16 بت تماماً على جميع المعايير، بما فيها WinoGrande وHellaSwag وPIQA وLAMBADA. واستهلاك الذاكرة انخفض إلى النصف تقريباً — من نحو 350 غيغابايت إلى نحو 175 — ما أتاح تشغيل النموذج على أجهزة لم تكن قادرة على ذلك سابقاً.

افتح في المختبر
تابع أداء التكميم مع تكبير حجم النماذج. LLM.int8() وحدها تحافظ على دقة 16 بت الكاملة عند كل حجم تمّ اختباره.
تستيقظ التجربة عند وصولك…

لماذا يهم هذا: إتاحة النماذج الكبيرة للجميع

قبل LLM.int8() كان تشغيل نموذج بحجم 175 مليار معامل يتطلّب 8 بطاقات A100 مؤسسية بسعة 80 غيغابايت لكل منها — عتاد يتجاوز سعره 100,000 دولار. بعد LLM.int8() أصبح النموذج نفسه يعمل على 8 بطاقات RTX 3090 استهلاكية بسعة 24 غيغابايت فقط. نموذج كان حكراً على المؤسسات الكبرى بات في متناول المختبرات الأكاديمية.

أُدمجت الطريقة في مكتبة Hugging Face Transformers عبر حزمة bitsandbytes، فوصلت إلى ملايين الممارسين بسطر واحد: load_in_8bit=True. لم يكن هذا مجرّد توفير في الذاكرة — بل كان نقلة نوعية في إتاحة النماذج الكبيرة.

وربما الأهم من ذلك أن تحليل القيم الشاذة غيّر نظرة المجال بأكمله إلى التكميم. فاكتشاف أن السمات المنبثقة تتركّز في عدد ضئيل من الأبعاد وأنها حاسمة لأداء النموذج أثّر بشكل مباشر في كل طريقة تكميم رئيسية جاءت بعدها، بما في ذلك GPTQ (تكميم ما بعد التدريب إلى 4 بت) وQLoRA ( المُكمَّم)، وكلتاهما شارك في تأليفهما تيم ديتمرز نفسه.

الخط الزمني: ثورة التكميم

  1. 2015

    الضغط العميق (هان وآخرون)

    استخدم التقليم والتكميم وترميز هوفمان لضغط الشبكات العصبية بنسبة 35–49 ضعفاً، وأسّس ضغط النماذج بوصفه حقلاً بحثياً مستقلاً.

  2. 2020

    GPT-3 وجدار الذاكرة

    أثبت GPT-3 بمعاملاته البالغة 175 ملياراً قدرات مذهلة في التعلّم بأمثلة قليلة، لكنه احتاج مئات الغيغابايت من ذاكرة GPU، ما جعله بعيد المنال عن أغلب الباحثين.

  3. 2022

    LLM.int8() (هذه الورقة)

    أول تكميم بدقة 8 بت دون خسارة في الأداء لمحوِّلات تصل إلى 175 مليار معامل. كشفت ظاهرة السمات الشاذة المنبثقة وعالجتها بالتفكيك مختلط الدقة.

  4. 2022

    GPTQ (فرانتار وآخرون)

    خفض دقة التكميم إلى 4 بت مستعيناً بمعلومات الرتبة الثانية لتقليل الخطأ طبقة بطبقة، ما أتاح تشغيل نماذج 175 مليار في نحو 45 غيغابايت فقط.

  5. 2023

    QLoRA (ديتمرز وآخرون)

    دمج التكميم بدقة 4 بت مع التكيّف منخفض الرتبة، فأصبح الضبط الدقيق لنماذج بحجم 65 مليار معامل ممكناً على بطاقة واحدة بسعة 48 غيغابايت. بُني مباشرة على رؤى LLM.int8().

  6. 2024

    التكميم يصبح المعيار

    صار التكميم بدقة 4 و8 بت ممارسة معتادة عند نشر النماذج الكبيرة. وأتاحت أدوات مثل GGUF وAWQ ومكتبة bitsandbytes الاستدلال المُكمَّم لأي شخص.

المرجعDettmers, Lewis, Belkada, Zettlemoyer. LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale. NeurIPS, 2022.

مصطلحات هذه الورقة