انتقل إلى المحتوى الرئيسي

الوحدة 6 — قياس زمن الاستجابة والإنتاجيّة

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

مقياسان لا واحد

النماذج اللغويّة الاستدلاليّة تُقاس بمقياسَين مختلفين، وخلطهما مصدر تشويش دائم:

زمن الجُملة الأولى (Time To First Token، TTFT): الفترة بين إرسال المطالبة وظهور الجُملة الأولى في المخرج. يقيس وقت الاستيعاب: الحصول على المطالبة، وترميزها إلى جُملات، وتشغيل جميع طبقات الشبكة على المطالبة كاملة (وهذا يُسمّى مرحلة الملء المسبق أو Prefill).

الجُملات في الثانية (Tokens Per Second، TPS): سرعة التوليد بعد الجُملة الأولى. يقيس وقت فكّ الشيفرة: توليد كلّ جُملة جديدة يمرّ بجميع الطبقات مرّة واحدة.

مثال: بطاقة دعم بمطالبة 800 جُملة وتوليد ملخّص من 100 جُملة، على معالج محمول:

  • TTFT = 2,1 ثانية (الملء المسبق للـ800 جُملة)
  • TPS = 18 جُملة في الثانية
  • زمن كلّي = 2,1 + (100 / 18) = 7,7 ثانية

النموذج «الأسرع» عند TPS قد يكون «الأبطأ» في التجربة الإجماليّة إذا كان TTFT ضخمًا. الاثنان مهمّان معًا.

حجم الدفعة

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

على جهاز موظّف دعم واحد، حجم الدفعة عادةً هو 1: مطالبة تلو الأخرى. أمّا في خادوم مركزيّ يخدم عدّة عملاء، فحجم الدفعة يصبح متغيّرًا حاسمًا للتخطيط.

بروتوكول قياس قابل للتكرار

الأخطاء الشائعة التي تجعل القياس بلا قيمة:

  • قياس مرّة واحدة والاستنتاج منها (تفاوت طبيعيّ ± 15%)
  • قياس مع تشغيل تطبيقات أخرى تنازع المعالج
  • عدم فصل زمن التحميل عن زمن الاستدلال
  • المقارنة بين طولَي مطالبات مختلفين

بروتوكولنا الموصى به:

  1. جهاز مخصّص: أغلق كلّ تطبيق آخر، افصل الشبكة إذا لم يكن النموذج بحاجة إليها.
  2. تسخين: شغّل النموذج على 3 مطالبات قبل بدء القياس (لملء الذاكرة الوسيطة).
  3. 10 قياسات على الأقلّ، وسجّل الوسيط والانحراف المعياريّ، لا فقط المتوسّط.
  4. مطالبات موحّدة بطول ثابت (مثلًا 500 جُملة) وتوليد بطول ثابت (100 جُملة).
  5. ذكر البيئة: الجهاز، الذاكرة، نظام التشغيل، إصدار المحرّك، صيغة النموذج ومستوى التكميم.

أدوات القياس

llama-bench من llama.cpp هو الأداة القياسيّة:

./llama-bench -m qwen2.5-3b-Q4_K_M.gguf -p 512 -n 128 -r 5

هذا يُنتج جدولًا يعرض TTFT (زمن الملء المسبق لـ512 جُملة) وTPS (سرعة توليد 128 جُملة)، مكرّرًا 5 مرّات مع الإحصائيّات.

للقياس داخل تطبيق حقيقيّ، ضع علامات زمنيّة بلغة التطبيق:

import time
from llama_cpp import Llama

llm = Llama(model_path="qwen2.5-3b-Q4_K_M.gguf", n_ctx=2048)

start = time.perf_counter()
tokens = []
for token in llm("مطالبة الاختبار...", max_tokens=100, stream=True):
if not tokens:
ttft = time.perf_counter() - start
tokens.append(token)
total = time.perf_counter() - start
tps = (len(tokens) - 1) / (total - ttft)

نتائج مرجعيّة على معدّات حقيقيّة

Qwen 2.5 بـ3 مليارات مُعامِل مكمَّم Q4_K_M، مطالبة 500 جُملة، توليد 100 جُملة:

العتادTTFTTPSالزمن الكلّي
MacBook Air M2 (8 غيغا)0,4 ث323,5 ث
Dell Latitude i7-1265U1,8 ث148,9 ث
Desktop RTX 30600,15 ث781,4 ث
Desktop RTX 40900,05 ث1950,56 ث

هذه الأرقام كافية لبطاقة دعم واحدة تلو الأخرى على أيّ من هذه المعدّات. على الجهاز المكتبيّ Dell، 9 ثوانٍ للبطاقة الواحدة تعطي 400 بطاقة في الساعة نظريًّا: يفي بحاجة موظّف دعم واحد.

قراءة نتيجة تبدو غير معقولة

عندما ترى أرقامًا تختلف عمّا يشير إليه بروتوكول قياس آخر بعامل 2 أو 3، ابحث عن السبب في أحد هذه الستّة:

  • طول المطالبة مختلف (TTFT يتغيّر خطّيًّا مع الطول)
  • مستوى تكميم مختلف (Q4 يختلف عن Q8 بعامل 2 تقريبًا)
  • محرّك مختلف (llama.cpp يختلف عن transformers)
  • GPU مستخدم بلا ذكر (النتائج تتحسّن بعامل 5-10)
  • ذاكرة تخزين مؤقّت مختلفة (نظام التشغيل يحتفظ بالنموذج في ذاكرة الوصول العشوائيّ)
  • وحدة القياس (بعض المصادر تخلط الجُملات بالكلمات)
حذارِ الأرقام في المنشورات الترويجيّة

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

الخلاصة

  • TTFT يقيس وقت الاستيعاب، TPS يقيس سرعة التوليد، وكلاهما ضروريّ.
  • حجم الدفعة يهمّ الخادوم متعدّد المستخدمين، لا الجهاز الفرديّ.
  • بروتوكول قابل للتكرار: تسخين، قياسات متعدّدة، مطالبات موحّدة، بيئة موصوفة.
  • على معالج محمول حديث، نموذج بـ3 مليارات مكمَّم يُعطي 10 إلى 30 جُملة في الثانية، وهو كافٍ لجهاز موظّف واحد.

الوحدة التالية: الضبط الدقيق الاقتصاديّ بأسلوب LoRA لتخصيص النموذج على بياناتنا.