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

QLoRA: الضبط الدقيق الكفوء للنماذج اللغوية الكبيرة المُكمَّمة

QLoRA: Efficient Finetuning of Quantized LLMs

Dettmers, T. · Pagnoni, A. · Holtzman, A. · Zettlemoyer, L. — NeurIPS

المشكلة

للنماذج اللغوية الكبيرة يستلزم تحميل النموذج بالكامل في الذاكرة وتحديث جميع معاملاته — نموذج بحجم 65 مليار مُعامِل بدقة 16-بت يحتاج أكثر من 130 غيغابايت من ذاكرة GPU للأوزان وحدها، وهذا يتجاوز بكثير ما توفّره بطاقة رسومية استهلاكية واحدة. تقنية LoRA تُقلِّل عدد المعاملات المُدرَّبة لكنها لا تزال تتطلب تحميل النموذج الكامل بدقة 16-بت. أمّا المباشر إلى 4-بت فيُدمِّر جودة الضبط الدقيق. ظلّ السؤال مفتوحاً: كيف نجمع بين تكميم حادّ وتكييف أمين لا يُضحّي بالأداء؟

الإسهام

الفكرة الجوهرية في QLoRA: جمِّد النموذج المُدرَّب مسبقاً بصيغة NF4 ذات 4-بت — وهي صيغة تمثيل مثالية نظرياً من منظور نظرية المعلومات للأوزان ذات — ثم مرِّر التدرُّجات عبر هذه المُكمَّمة لتصل إلى (LoRA) صغيرة محفوظة بدقة 16-بت. ثلاث ابتكارات تُمكِّن ذلك: (أ) تكميم NF4 الذي يُوزِّع الأوزان بالتساوي على حاويات التكميم، (ب) الذي يُكمِّم ثوابت التكميم ذاتها فيوفّر 0.37 بت لكل مُعامِل، و(ج) التي تنقل إلى ذاكرة المعالج المركزي عند ذروات الاستهلاك. النتيجة: نموذج بـ 65 مليار مُعامِل يُضبط دقيقاً على بطاقة رسومية واحدة بسعة 48 غيغابايت بجودة تُضاهي الضبط الكامل بدقة 16-بت.

الأثر

فتحت QLoRA باب الضبط الدقيق للنماذج اللغوية الكبيرة أمام الجميع. قبلها كان تكييف نموذج بـ 65 مليار مُعامِل يستلزم عنقوداً من البطاقات الرسومية الفائقة بتكلفة عشرات آلاف الدولارات. بعدها أصبحت بطاقة رسومية استهلاكية واحدة كافية. عائلة نماذج Guanaco المُدرَّبة بـ QLoRA بلغت 99.3% من أداء ChatGPT على معيار Vicuna. أصبحت QLoRA الوصفة المعتمدة لتكييف النماذج مفتوحة المصدر، وأُدمجت في مكتبة Hugging Face PEFT، وأشعلت منظومة كاملة من أساليب الضبط الدقيق المُكمَّم (GPTQ-LoRA وAWQ-LoRA وGGUF-LoRA). وأصبحت صيغة NF4 المعيار الفعلي لتكميم النماذج اللغوية الكبيرة على أجهزة المستهلكين.

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

الاختراق الذي جاءت به QLoRA: اضغط المبنى في مُجسَّم مصغَّر (تكميم 4-بت)، وعلِّق سقالاتك على ذلك المُجسَّم (مُلائمات LoRA بدقة 16-بت)، وأنجز التجديد في موقف سيارة واحد بدلاً من حيٍّ بأكمله. عند الانتهاء، يكون المبنى بحجمه الكامل قد استوعب كل التغييرات.

جدار الذاكرة: لماذا الضبط الدقيق مُكلِف

نموذج بـ 65 مليار مُخزَّن بأعداد عشرية بدقة 16-بت يشغل نحو 130 غيغابايت من ذاكرة GPU — للأوزان فحسب. أثناء تحتاج أيضاً إلى وحالات المُحسِّن، وهذا قد يرفع الرقم إلى ثلاثة أضعاف. حتى LoRA التي لا تُدرِّب سوى نحو 0.1% من المعاملات تظل تحتاج النموذج الأساسي كاملاً بدقة 16-بت في الذاكرة. في عام 2023 كان ذلك يعني أن المؤسسات التي تملك عناقيد بطاقات رسومية متعددة هي وحدها القادرة على الضبط الدقيق للنماذج المتقدمة.

والسؤال الذي يفرض نفسه: هل يمكن تقليص النموذج الأساسي بـالتكميم مع الحفاظ على جودة الضبط الدقيق؟ التجارب السابقة بيّنت أن التكميم المباشر إلى أعداد صحيحة بـ 4-بت يُدمِّر جودة الضبط الدقيق، لأن التدرُّجات المُمرَّرة عبر أوزان مُكمَّمة بخشونة تحمل تشويشاً كبيراً يُعيق التعلُّم.

افتح في المختبر
قارن استهلاك ذاكرة GPU للضبط الدقيق الكامل وLoRA وQLoRA على نموذج بـ 65 مليار مُعامِل.
تستيقظ التجربة عند وصولك…

الخلفية: ما التكميم؟

فكرة التكميم بسيطة: بدلاً من تمثيل كل قيمة بدقة عالية (مثل عدد عشري بـ 32-بت)، نُحوِّلها إلى تمثيل أصغر (مثل عدد صحيح بـ 4-بت). تخيَّل الأمر كمسطرة: بدلاً من قياس الطول بدقة المليمتر، تُقرِّب كل قياس إلى أقرب علامة سنتيمتر — تخسر بعض الدقة لكن المسطرة تشغل حيّزاً أقل بكثير. والآلية الأساسية واضحة: خذ المُدخَل، اقسم قيمه على (القيمة المطلقة العظمى) لتطبيعها ضمن نطاق مُستهدَف، ثم قرِّب كل قيمة إلى أقرب مستوى منفصل.

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

افتح في المختبر
اسحب المنزلق لترى كيف يؤثر تقليل الدقة من 16-بت إلى 4-بت على تمثيل الأوزان. لاحظ كيف تتباعد الدرجات وتصبح أخشن.
تستيقظ التجربة عند وصولك…

الابتكار الأول: العدد العشري الطبيعي 4-بت (NF4)

الرؤية الأولى في QLoRA تنطلق من ملاحظة بسيطة: أوزان الشبكات العصبية تتبع التوزيع الطبيعي، فلماذا لا نُصمِّم مخطط تكميم يتلاءم مع هذا الشكل تحديداً؟ هنا يأتي دور NF4 الذي يعتمد على — أي أنه يضع قيم إعادة البناء الـ 16 (‏2⁴ = 16 مستوى لتكميم 4-بت) بحيث تلتقط كل حاوية حصة متساوية من توزيع الأوزان. في المنطقة التي يكون فيها منحنى الجرس شاهقاً وضيقاً (قرب الصفر) تتراصّ الحاويات بكثافة لتوفير دقة عالية. أما في الأذيال حيث تسكن الأوزان الكبيرة النادرة، فتتّسع الحاويات لأن عدداً قليلاً فقط من الأوزان يقع هناك.

النتيجة مثالية من منظور نظرية المعلومات: كل حاوية تحمل القدر نفسه من المعلومات، ولا تُهدَر أي سعة تكميم. لهذا يتفوق NF4 على الأعداد الصحيحة 4-بت والأعداد العشرية 4-بت معاً — فهو يُطابق شكل البيانات التي يُرمِّزها بدلاً من فرض شبكة منتظمة عليها.

qi=QX(i2k+1)q_i = Q_X\left(\frac{i}{2^k + 1}\right)
حساب الشرائح المئوية في NF4 — حدود الحاويات تُطابق توزيع الأوزانq_i = قيمة إعادة البناء رقم i · Q_X = دالة الشرائح المئوية للتوزيع الطبيعي المعياري · k = عدد البتات (4 في NF4) · النتيجة: 16 مستوى، كل منها يلتقط بالضبط 1/16 من الكتلة الاحتمالية
افتح في المختبر
قارن بين تكميم NF4 (أعلى) وINT4 المنتظم (أسفل) على منحنى الجرس. لاحظ كيف يُكثِّف NF4 مستوياته قرب الصفر حيث تتجمّع معظم الأوزان.
تستيقظ التجربة عند وصولك…

الخلفية: كيف تعمل LoRA

قبل أن نرى كيف تجمع QLoRA بين التكميم والتكييف، لنستعد فكرة LoRA. عند الضبط الدقيق لنموذج ما، يكون تغيّر الأوزان ΔW غالباً — أي يمكن تقريبه جيداً بمصفوفتين صغيرتين مضروبتين معاً: ΔW = BA، حيث أبعاد B هي (d × r) وأبعاد A هي (r × d)، والرتبة r ضئيلة (عادةً 4–64) مقارنةً بـ d (الذي قد يبلغ 4096 أو أكثر).

أثناء التدريب تُجمَّد الأصلية W₀ ولا تُدرَّب سوى A وB — فيهبط عدد المعاملات القابلة للتدريب من d² إلى 2·r·d، أي تخفيض بمقدار 100 إلى 1000 ضعف عادةً. يصبح : h = W₀x + BAx، أي ناتج الأوزان الأصلية المُجمَّدة مُضافاً إليه التصحيح الصغير المُتعلَّم.

h=W0x+ΔWx=W0x+BAxh = W_0 x + \Delta W x = W_0 x + BAx
التمرير الأمامي لـ LoRA — أوزان مُجمَّدة + تحديث منخفض الرتبةW₀ = الأوزان المُدرَّبة مسبقاً والمُجمَّدة (d × d) · B = قابلة للتدريب (d × r) · A = قابلة للتدريب (r × d) · r ≪ d · A وB فقط تتلقّيان تحديثات التدرُّجات
افتح في المختبر
شاهد كيف تحقن LoRA مصفوفتين صغيرتين بجانب مصفوفة الأوزان المُجمَّدة. اضغط «تدريب» لمشاهدة تحديث A وB فقط.
تستيقظ التجربة عند وصولك…

وصفة QLoRA: كمِّم ثم كيِّف

تدمج QLoRA بين تكميم NF4 و في مسار تدريب واحد، وتسير العملية في ثلاث مراحل:

المرحلة 1 — تكميم النموذج الأساسي. تُكمَّم أوزان النموذج المُدرَّب مسبقاً من 16-بت إلى صيغة NF4 ذات 4-بت، فتنكمش البصمة الذاكرية بنحو أربعة أضعاف. هذه الأوزان المُكمَّمة تُجمَّد ولا تُحدَّث أبداً.

المرحلة 2 — إرفاق مُلائمات LoRA. تُحقَن مصفوفات مُلائِمة صغيرة قابلة للتدريب (A وB) بجانب الطبقات المُكمَّمة المُجمَّدة — عادةً في مصفوفات و داخل آلية . تبقى هذه المُلائمات بدقة 16-بت (BFloat16) حتى تتدفق التدرُّجات بدقة كاملة.

المرحلة 3 — التدريب عبر فك التكميم. في كل خطوة تمرير أمامي، تُفَكّ كتلة أوزان NF4 المُجمَّدة مؤقتاً إلى ، وتُضرَب في المُدخَل، ثم يُضاف تصحيح LoRA. تتدفق التدرُّجات عبر مسار لتصل إلى مُلائمات LoRA فقط. الأوزان الأساسية لا تتغير — A وB فقط هما اللتان تتعلمان.

افتح في المختبر
انقر على أي مرحلة لتتبّع تدفق البيانات عبر مسار QLoRA من التكميم إلى فك التكميم إلى LoRA.
تستيقظ التجربة عند وصولك…

الابتكار الثاني: التكميم المزدوج

التكميم يتطلب تخزين ثابت تقييس لكل كتلة أوزان (عادةً 64 وزناً لكل كتلة). مع ثوابت بدقة 32-بت يُضيف كل ثابت 32/64 = 0.5 بت إضافية لكل وزن — وهذا عبء كبير حين تعمل بدقة 4-بت أصلاً. لنموذج بـ 65 مليار مُعامِل يعني ذلك نحو 4 غيغابايت ذاكرة إضافية لمجرد سجلّات التكميم.

حل QLoRA: كمِّم ثوابت التكميم نفسها. هذا هو التكميم المزدوج: تُجمَّع ثوابت المستوى الأول (FP32) في كتل من 256، وتُكمَّم كل مجموعة إلى أعداد عشرية بـ 8-بت مع ثابت FP32 واحد من المستوى الثاني لكل مجموعة. النتيجة: العبء الإضافي ينخفض من 0.5 بت/مُعامِل إلى نحو 0.127 بت/مُعامِل — أي توفير قرابة 3 غيغابايت على نموذج بـ 65 مليار مُعامِل.

افتح في المختبر
شاهد كيف يُقلِّص تكميم ثوابت التكميم (المستوى الثاني) العبء الإضافي. فعِّل «التكميم المزدوج» للمقارنة.
تستيقظ التجربة عند وصولك…

الابتكار الثالث: المُحسِّنات المُصفَّحة

حتى مع NF4 وLoRA، قد يصطدم التدريب بطفرات ذاكرية مفاجئة. حالات المُحسِّن في (تقديرات و) تحتاج ذاكرة لكل مُعامِل قابل للتدريب، كما أن مع التسلسلات الطويلة يُسبِّب ارتفاعات مؤقتة قد تُطلق أخطاء نفاد الذاكرة.

تستخدم QLoRA تقنية من NVIDIA — وهي ميزة تتيح لذاكرة GPU وذاكرة المعالج المركزي أن تعملا كمجمع واحد. حين تمتلئ ذاكرة البطاقة الرسومية، تُنقَل حالات المُحسِّن تلقائياً إلى ذاكرة المعالج المركزي عبر آلية التصفيح، تماماً كما ينقل نظام التشغيل الصفحات إلى القرص حين تمتلئ الذاكرة الفعلية. عمليات النقل لا تحدث إلا في لحظات الذروة وتتراكب مع الحوسبة، فتكون تكلفتها على سرعة التدريب ضئيلة في الدفعات المعتادة.

التمرير الأمامي الكامل لـ QLoRA

لنجمع الصورة الكاملة: مصفوفة الأوزان المُدرَّبة مسبقاً W مُخزَّنة بصيغة NF4 ذات 4-بت. في كل خطوة تمرير أمامي تُفَكّ كتلة الأوزان المعنية مؤقتاً إلى BFloat16 أثناء التشغيل، ويُضرب المُدخَل فيها، ثم يُضاف تصحيح LoRA. رياضياً:

YBF16=XBF16doubleDequant(c1FP32,c2k-bit,WNF4)+XBF16L1BF16L2BF16Y^{\text{BF16}} = X^{\text{BF16}} \cdot \text{doubleDequant}(c_1^{\text{FP32}}, c_2^{\text{k-bit}}, W^{\text{NF4}}) + X^{\text{BF16}} \cdot L_1^{\text{BF16}} \cdot L_2^{\text{BF16}}
التمرير الأمامي لـ QLoRA — الأساس المُكمَّم + المُلائمات بالدقة الكاملةdoubleDequant = فك تكميم أوزان NF4 باستخدام ثوابت مُكمَّمة مزدوجاً · c₁ = ثابت المستوى الثاني بدقة FP32 · c₂ = ثابت المستوى الأول بدقة k-بت · L₁ وL₂ = مصفوفتا LoRA (أي A وB) بدقة BF16 · التدرُّجات تُحدِّث L₁ وL₂ فقط

الفكرة نفسها في الكود

التمرير الأمامي لـ QLoRA — شبه كودpython

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

import numpy as np

# ── تكميم NF4 ──────────────────────────────────────────────────
# حساب مسبق لـ 16 قيمة شريحة مئوية من التوزيع الطبيعي المعياري N(0,1)
NF4_LEVELS = np.array([
    scipy.stats.norm.ppf((i + 0.5) / 16) for i in range(16)
])  # 16 قيمة إعادة بناء ثابتة

def quantize_nf4(W_fp16, block_size=64):
    """تكميم مصفوفة أوزان إلى NF4 بتقييس القيمة المطلقة العظمى."""
    blocks = W_fp16.reshape(-1, block_size)
    scales = blocks.abs().max(axis=1)          # ثابت تقييس واحد لكل كتلة
    normalized = blocks / scales[:, None]       # تطبيع إلى [-1, 1]
    # ربط كل وزن بأقرب مستوى NF4 (فهرس 4-بت)
    indices = np.argmin(
        np.abs(normalized[:, :, None] - NF4_LEVELS[None, None, :]),
        axis=-1
    )
    return indices, scales   # indices: 4-بت, scales: FP32

def dequantize_nf4(indices, scales):
    """إعادة بناء أوزان FP16 من فهارس NF4 + ثوابت التقييس."""
    return NF4_LEVELS[indices] * scales[:, None]

# ── التمرير الأمامي لـ QLoRA ────────────────────────────────────
def qlora_forward(x, W_nf4_indices, W_scales, lora_A, lora_B):
    """
    x:       تنشيطات المُدخَل (BFloat16)
    W_nf4:   أوزان الأساس المُجمَّدة — مُخزَّنة كفهارس NF4 بـ 4-بت
    W_scales: ثوابت تقييس التكميم
    lora_A:  مصفوفة المُلائِم القابلة للتدريب A (r × d)، BFloat16
    lora_B:  مصفوفة المُلائِم القابلة للتدريب B (d × r)، BFloat16
    """
    # الخطوة 1: فك تكميم الأوزان المُجمَّدة أثناء التشغيل
    W_bf16 = dequantize_nf4(W_nf4_indices, W_scales)

    # الخطوة 2: حساب ناتج الأساس + تصحيح LoRA
    base_output = x @ W_bf16.T        # المسار المُجمَّد
    lora_output = (x @ lora_A.T) @ lora_B.T   # المسار القابل للتدريب
    return base_output + lora_output

# التدرُّجات تتدفق عبر كلا المسارين، لكن lora_A وlora_B فقط
# لديهما requires_grad=True. أوزان NF4 مجرد جدول بحث.

Guanaco: نتائج غيَّرت قواعد اللعبة

بالاعتماد على QLoRA، درَّب المؤلفون عائلة نماذج Guanaco — وهي نماذج حوارية مضبوطة دقيقاً على مجموعة بيانات OASST1 (9,000 محادثة عالية الجودة فقط). أبرز النتائج:

  • Guanaco 65B بلغ 99.3% من أداء ChatGPT على معيار Vicuna، بـ 24 ساعة تدريب فقط على بطاقة رسومية واحدة بسعة 48 غيغابايت.
  • Guanaco 33B تفوَّق على جميع النماذج الحوارية مفتوحة المصدر، بل تجاوز ChatGPT نفسه على معيار Vicuna بنسبة 97.8%.
  • الضبط الدقيق على مجموعة بيانات صغيرة عالية الجودة تفوَّق على التدريب على مجموعات ضخمة أقل جودة — ما يؤكّد أن جودة البيانات أهمّ من كمّيتها في مهام .

كذلك أظهرت الورقة أن تقييمات GPT-4 بديل معقول للتقييم البشري في النماذج الحوارية، وكشفت عن تحيّزات منهجية في معايير التقييم الحالية. كما أجرى المؤلفون تحليلاً لنقاط الضعف أسموه "lemon-picking" بيّن مواطن تراجع أداء Guanaco مقارنة بـ ChatGPT، خصوصاً في المعرفة الحقائقية والاستدلال المعقّد متعدد الخطوات.

الأثر الممتد

  1. 2021

    LoRA (هو وآخرون)

    قدَّمت مُلائمات منخفضة الرتبة للضبط الدقيق الكفوء بالمعاملات. خفَّضت المعاملات القابلة للتدريب بمقدار 10,000 ضعف، لكنها ظلَّت تتطلب تحميل النموذج الأساسي كاملاً بدقة 16-بت.

  2. 2023

    QLoRA

    جمعت بين تكميم NF4 بدقة 4-بت وLoRA. نموذج بـ 65 مليار مُعامِل يُضبط دقيقاً على بطاقة رسومية واحدة بسعة 48 غيغابايت بجودة تُكافئ 16-بت. Guanaco بلغ 99.3% من أداء ChatGPT.

  3. 2023

    GPTQ-LoRA وAWQ

    محرّكات تكميم بديلة (GPTQ وAWQ) تبنَّت نمط QLoRA — كمِّم أولاً ثم طبِّق LoRA فوقه — فاتّسعت مجموعة الأدوات المتاحة.

  4. 2024

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

    أُدمجت في مكتبتَي Hugging Face PEFT وTransformers. أصبحت الوصفة المعيارية لتكييف النماذج مفتوحة المصدر، وباتت تُمكِّن الضبط الدقيق لنماذج بـ 70 مليار مُعامِل فأكثر على أجهزة المستهلكين.

المرجعDettmers, Pagnoni, Holtzman, Zettlemoyer. QLoRA: Efficient Finetuning of Quantized LLMs. NeurIPS, 2023.

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