الوحدة 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%)
- قياس مع تشغيل تطبيقات أخرى تنازع المعالج
- عدم فصل زمن التحميل عن زمن الاستدلال
- المقارنة بين طولَي مطالبات مختلفين
بروتوكولنا الموصى به:
- جهاز مخصّص: أغلق كلّ تطبيق آخر، افصل الشبكة إذا لم يكن النموذج بحاجة إليها.
- تسخين: شغّل النموذج على 3 مطالبات قبل بدء القياس (لملء الذاكرة الوسيطة).
- 10 قياسات على الأقلّ، وسجّل الوسيط والانحراف المعياريّ، لا فقط المتوسّط.
- مطالبات موحّدة بطول ثابت (مثلًا 500 جُملة) وتوليد بطول ثابت (100 جُملة).
- ذكر البيئة: الجهاز، الذاكرة، نظام التشغيل، إصدار المحرّك، صيغة النموذج ومستوى التكميم.
أدوات القياس
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 جُملة:
| العتاد | TTFT | TPS | الزمن الكلّي |
|---|---|---|---|
| MacBook Air M2 (8 غيغا) | 0,4 ث | 32 | 3,5 ث |
| Dell Latitude i7-1265U | 1,8 ث | 14 | 8,9 ث |
| Desktop RTX 3060 | 0,15 ث | 78 | 1,4 ث |
| Desktop RTX 4090 | 0,05 ث | 195 | 0,56 ث |
هذه الأرقام كافية لبطاقة دعم واحدة تلو الأخرى على أيّ من هذه المعدّات. على الجهاز المكتبيّ Dell، 9 ثوانٍ للبطاقة الواحدة تعطي 400 بطاقة في الساعة نظريًّا: يفي بحاجة موظّف دعم واحد.