تبدو نماذج اللغات الكبيرة المحلية سريعة كالبرق في البداية. تقوم بتحميل نموذج بـ 7 مليارات أو 13 مليار معلمة (parameter)، وترسل أمراً (prompt) قصيراً، فتتدفق الرموز (tokens) عبر الشاشة بسرعة مريحة. ثم تقوم بلصق كتلة برمجية طويلة، أو يتضخم سجل الدردشة الخاص بك عبر عشرات الجولات، فيبدأ النموذج بالتباطؤ الشديد. نادراً ما يكون التباطؤ تدريجياً؛ بل هو أشبه بالوقوع من منحدر. في لحظة ما، تكون وحدة معالجة الرسومات (GPU) تضخ الرموز؛ وفي اللحظة التالية، يظهر مراقب النظام ضغطاً متزايداً على الذاكرة ويبدأ التوليد بالتعثر. لا يمكنك التنبؤ بدقة متى سيحدث هذا باستخدام معادلة بسيطة. دليلك الوحيد الموثوق هو الأجهزة (hardware) نفسها.
التكلفة الخفية للسياق (Context)
كل رمز (token) تقوم بتوليده يضيف حالة إلى ذاكرة التخزين المؤقت KV cache. تخزن هذه الذاكرة المفاتيح والقيم (keys and values) التي تم حسابها خلال مرحلتي التعبئة المسبقة (prefill) والتوليد، وتوجد في الذاكرة جنباً إلى جنب مع أوزان النموذج (model weights)، ومخازن التخزين المؤقت للانتباه (attention buffers)، والأعباء الإضافية وقت التشغيل (runtime overhead). في وحدة معالجة رسومات استهلاكية نموذجية بسعة 12 جيجابايت أو 16 جيجابايت من ذاكرة الفيديو (VRAM)، تتنافس ذاكرة KV cache في النهاية على المساحة مع كل شيء آخر. عندما تمتلئ ذاكرة الفيديو المخصصة، لا يقوم نظام التشغيل بإظهار خطأ والتوقف، بل يقوم بهدوء بتصريف الفائض إلى الذاكرة المشتركة (shared memory)، ناقلاً البيانات بين وحدة معالجة الرسومات (GPU) وذاكرة الوصول العشوائي للنظام (system RAM) عبر ممر PCIe. هذا الممر سريع لنقل الملفات، لكنه بطيء للغاية مقارنة بنطاق عرض الذاكرة (memory bandwidth) داخل بطاقة الرسومات. والنتيجة ليست انخفاضاً طفيفاً في الأداء، بل هي انهيار تام.
ثلاث إشارات على وصول "المنحدر"
راقب أدوات مراقبة الأجهزة أثناء تشغيل النموذج. ستلاحظ ثلاث إشارات واضحة بمجرد الوصول إلى منحدر الأداء.
- ارتفاع الـ Shared VRAM. هذه هي الذاكرة التي دفعها برنامج تشغيل وحدة معالجة الرسومات (GPU driver) من ذاكرة الفيديو المخصصة إلى المجموعة التي يديرها نظام التشغيل المضيف. في اللحظة التي ترتفع فيها هذه القيمة فوق الصفر، تكون قد تجاوزت الخط.
- تضخم استخدام ذاكرة النظام (System RAM). يجب أن يستقر الفائض في مكان ما، وهذا المكان هو ذاكرتك الرئيسية. إذا زاد استخدام الـ RAM أثناء توليد النموذج للرموز، فهذا يعني أنه يتم نقل البيانات من وحدة معالجة الرسومات (GPU).
- انخفاض سرعة التقييم (Eval speed) بمقدار النصف أو أكثر. قد يعني التباطؤ بنسبة 10% اختناقاً حرارياً (thermal throttling) أو عمليات تعمل في الخلفية. أما الانخفاض بنسبة 50% أو أكثر، فيعني أن عنق الزجاجة قد انتقل من أنوية التنسور (tensor cores) إلى نطاق عرض الذاكرة وزمن انتقال PCIe. عندما ترى سرعة التوليد تنخفض من خانتين إلى خانة واحدة، فاعلم أنك قد سقطت بالفعل من المنحدر.
لماذا قد تكون اختبارات القياس السريعة مضللة
اختبار الدخان السريع (smoke test) سيمنحك ثقة زائفة. إذا قمت بقياس أداء النموذج باستخدام أمر (prompt) مكون من مائة رمز، ورأيت إنتاجية جيدة، واكتفيت بذلك، فأنت قد قمت بقياس "مرحلة شهر العسل". في هذه الحالة، تكون ذاكرة KV cache شبه فارغة، ولم تتعرض الطبقات لضغط التعبئة المسبقة (prefill) الطويلة. لا تظهر البصمة الحقيقية للذاكرة إلا بعد أن يعالج النموذج أمراً ضخماً وتمتلئ الذاكرة المؤقتة بحجم عملها الحقيقي. يجب عليك الاختبار باستخدام تعبئة مسبقة عميقة وعمليات توليد طويلة. اترك السياق يتراكم فعلياً؛ عندها فقط سيستقر ضغط الذاكرة ويظهر لك الحد الحقيقي.
تحديد حدك الأقصى باستخدام llama.cpp
إذا كنت تشغل النماذج عبر llama.cpp، يمكنك تحديد "جدارك" باستخدام عمليات حسابية بسيطة واختبار صبور.
1. قياس استخدام الذاكرة المشتركة.
سجل قيمة الـ VRAM المخصصة الأساسية (baseline) باستخدام أمر بسيط، ثم قم بتشغيل مهمة ذات سياق طويل وسجل الذروة. اطرح القيمة الأساسية من الذروة؛ والفرق هو ما تسرب من وحدة معالجة الرسومات (GPU) إلى ذاكرة النظام المشتركة.
2. حساب فرق الـ RAM (RAM delta).
قم بإجراء عملية الطرح نفسها لذاكرة النظام (system RAM). اطرح الـ RAM الأساسية من ذروة الـ RAM أثناء التشغيل الطويل. يخبرك هذا الرقم بالضبط بمقدار البيانات التي تم دفعها من بطاقة الفيديو إلى ذاكرتك الرئيسية، وهو يحدد كمية التسرب عبر الم
لرسم المنحنى بدقة، لا تكتفِ بنقطة بيانات واحدة منعزلة. قم بإجراء ثلاث تجارب منفصلة عند 16,000 توكن، و32,000 توكن، و65,000 توكن. قد تشير نقطتان إلى خط، لكن نقطتين مجرد تخمين. النقطة الثالثة تثبت ما إذا كنت تنظر إلى ضجيج في القياس أم إلى "جدار ذاكرة" (memory wall) حقيقي. اطرح النتائج بين كل تشغيل لحساب مقدار الذاكرة الإضافية التي يستهلكها كل ألف توكن إضافي بناءً على مزيجك الخاص من النموذج، وطبقة التكميم (quantization layer)، ووحدة معالجة الرسومات (GPU).
بمجرد حصولك على ذلك الميل، يمكنك التنبؤ بالمستقبل. خذ تكلفة كل توكن، واضربها في طول السياق المستهدف، واقسم الناتج على 1024 للتحويل بين الوحدات، ثم أضف النتيجة إلى حمل VRAM الأساسي للنموذج. تبدو المعادلة كالتالي:
حمل VRAM للنموذج + (التوكنات × الذاكرة لكل توكن ÷ 1024) = استخدام VRAM النظري
هذا التنبؤ ليس نبوءة، بل هو مؤشر مستمد من السلوك الفعلي. استخدمه لتقدير الحد الأقصى لديك قبل الالتزام بتشغيل إنتاجي كامل.
لماذا تفشل المعادلات النظرية، وما الذي يمكن للتكميم (Quantization) إصلاحه
تتجاهل المعادلات النظرية الواقع الفوضوي للاستدلال المحلي (local inference). تخصص البنيات المختلفة مخازن ذاكرة الانتباه (attention buffers) بشكل مختلف. يحجز نظام التشغيل الخاص بك ذاكرة VRAM لبرنامج تشغيل الشاشة، والمجمع (compositor)، وسياق CUDA. وتغير إصدارات برامج التشغيل مدى قوة استخدامها للذاكرة المشتركة. لا يمكن لمعادلة نظرية أن تعرف مقدار الذاكرة (VRAM) المتاحة فعلياً على جهازك في الساعة 2:00 ظهراً مع وجود متصفح مليء بالتبويبات المفتوحة. يجب عليك تشغيل النموذج على أجهزتك الخاصة ومراقبة المؤشرات.
يوفر التكميم (Quantization) راحة جزئية. إن نقل مخزن KV cache من f16 إلى q8_0 يقلل من بصمة الذاكرة الخاصة به إلى النصف مع الحفاظ على دقة عالية بما يكفي لجميع المهام العملية تقريباً. هذا التغيير يمنحك مساحة إضافية، لكنه لا يمنحك حصانة. لا يزال المخزن ينمو خطياً مع كل توكن تقوم بإدخاله. في النهاية، حتى الحجم المخفض سيتجاوز ذاكرتك المخصصة المتاحة، ويبدأ التدفق الزائد إلى ذاكرة الوصول العشوائي (RAM) للنظام. لا يتوقف الضغط إلا عندما يتم وضع حد لنافذة السياق (context window) أو عندما تتوقف البيانات عن الحركة.
الخلاصة الحقيقية
لا تثق في شرائح التسويق، أو أعداد المعلمات (parameter counts)، أو الحسابات التقريبية السريعة. قم بتحميل النموذج. افتح مراقب النظام الخاص بك. قم بتشغيل خيط (thread) مكون من 65,000 توكن، وراقب ارتفاع الذاكرة (RAM)، واحسب عدد التوكنات في الثانية. الأرقام التي تظهر على شاشتك الخاصة، وعلى وحدة معالجة الرسومات (GPU) الخاصة بك، هي الأرقام الوحيدة التي تهم. السياق دائماً ما ينتصر. ومهمتك هي معرفة متى ينتصر بالضبط على جهازك.
