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

الوحدة 7 — التسريع العتاديّ

عدد الرموز في الثانية هو ما يُقرّر إن كان المساعد مقبولًا للاستعمال التفاعليّ أم لا. الفارق بين 5 و50 رمزًا/ثانية ليس تفصيلًا: هو الفارق بين «انتظر خمسًا وعشرين ثانية للجواب» و«اقرأه فور توليده». هذه الوحدة تشرح ما يُسرِّع Ollama، وكيف نقيس الأثر بلا تخمين.

معماريّات التسريع المدعومة

NVIDIA (CUDA)

الحلّ الأكثر نضجًا. تعمل Ollama تلقائيًّا على أيّ بطاقة NVIDIA بمعمار Pascal (GTX 10x0) فأحدث، بشرط تثبيت تعريف حديث وCUDA 12+. الذاكرة الرسميّة (VRAM) هي القيد: 8 GB تكفي لنموذج 7B مكمَّم، 24 GB تسع 34B مكمَّم، 80 GB (H100) تسع 70B.

AMD (ROCm)

Ollama يدعم بطاقات AMD المدعومة رسميًّا من ROCm (RX 6000 وRX 7000 وInstinct MI210/MI300). التثبيت أعقد قليلًا، ويجب اختيار توزيعة Linux مدعومة (Ubuntu 22.04 مثلًا). الأداء قريب من NVIDIA على نماذج Q4 مع فروق طفيفة.

Apple Silicon (Metal)

M1 وM2 وM3 وM4 تعتمد ذاكرة موحّدة بين المعالج والرسم، فلا يوجد VRAM منفصل. النموذج يشغل الذاكرة الكلّيّة للجهاز. جهاز MacBook Pro بذاكرة 36 GB يشغّل نموذج 34B مكمَّمًا بسلاسة. Ollama يفعِّل Metal تلقائيًّا، بلا إعداد.

المعالج فقط

بلا GPU، Ollama يستعمل تعليمات AVX/AVX2/AVX-512 وأنوية المعالج. نموذج 7B Q4 يعطي 5–12 رمزًا/ثانية على معالج حديث بـ 8 أنوية. مقبول لطلبات قصيرة (تصنيف)، مؤلم لتلخيص طويل.

قياسات مرجعيّة على qwen2.5:7b-instruct-q4_K_M

العتادeval rate (رمز/ثانية)
Intel i7-12700 وحده8
NVIDIA RTX 3060 12GB55
NVIDIA RTX 4090 24GB130
AMD RX 7900 XTX 24GB100
Apple M2 (16GB)40
Apple M3 Pro (36GB)65
Apple M4 Max (48GB)95
NVIDIA H100 80GB240

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

الإفراغ الجزئيّ للطبقات

حين لا تسع البطاقة النموذج كاملًا، Ollama يقسمه: بعض الطبقات على GPU، والباقي على المعالج. المعلمة num_gpu تحدّد عدد الطبقات على GPU:

ollama run llama3.1:8b-instruct-q4_K_M
>>> /set parameter num_gpu 20
  • num_gpu 999 (أو حذف المعلمة): محاولة تحميل كلّ الطبقات على GPU؛ يفشل بأناقة إن لم تسع.
  • num_gpu 20: 20 طبقة على GPU، الباقي على المعالج.
  • num_gpu 0: كلّ شيء على المعالج، لا استعمال للـ GPU.

القياس الحقيقيّ: نموذج 13B Q4 لا يسع في 8 GB VRAM (يحتاج 8 GB زائد سياق). num_gpu 30 من 40 طبقة يعطي 22 رمزًا/ثانية، مقابل 6 رموز على المعالج وحده، و«خطأ ذاكرة» لو حاولنا التحميل الكامل.

أثر السياق على الذاكرة

num_ctx يرفع الذاكرة اللازمة رفعًا كبيرًا. مثال قياسيّ على 7B Q4:

num_ctxالذاكرة الإضافيّة (KV cache)
2 K0.5 GB
4 K1 GB
8 K2 GB
16 K4 GB
32 K8 GB

على بطاقة 8 GB VRAM، النموذج نفسه يعمل بسياق 4 K بلا مشكلة، لكن يفشل بسياق 32 K. الحلّ: خفض السياق، أو التكميم أعمق، أو الإفراغ الجزئيّ.

قياس الأداء في Ollama

بعد كلّ نداء في الجلسة التفاعليّة، تظهر أسطر الأداء:

load duration:        1.203s
prompt eval count: 128 tokens
prompt eval rate: 820 tokens/s
eval count: 94 tokens
eval rate: 48 tokens/s

الرقم المُقرِّر هو eval rate. prompt eval rate سريع دائمًا لأنّ قراءة التعليمة موازية. load duration يُستبعد من القياس (يحدث مرّة واحدة).

عبر الواجهة البرمجيّة (الوحدة 4)، جواب /api/chat يحوي eval_count وeval_duration (بالنانوثانية):

r = ollama.chat(...)
rate = r["eval_count"] / (r["eval_duration"] / 1e9)

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

حين يكفي المعالج

المعالج وحده يعمل جدًّا لبعض السيناريوهات:

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

المعالج لا يعمل للاستعمال التفاعليّ الطويل: مستخدم ينتظر جوابًا تفصيليّاً 45 ثانية سيتوقّف عن استعمال المساعد بعد يومين.

الخيط الأحمر

للمكتب، توزيع العتاد:

  • المحطّة الرئيسيّة للشريك: RTX 4090 24GB. تشغيل تفاعليّ لكلّ النماذج المشتقّة (الوحدة 5) بلا قيود.
  • الحواسيب المحمولة للمساعدين: Apple M3 Pro بذاكرة موحّدة 36 GB. Metal يعطي 60 رمزًا/ثانية على qwen2.5:7b.
  • الخادم الليليّ: معالج AMD EPYC بلا GPU، لدفعات تلخيص مؤرشفة. 12 رمزًا/ثانية كافية.

القرار: لا نشتري GPU للمساعدين ما دام Apple Silicon يعطي الأداء الكافي مع الذاكرة الموحّدة. الاستثمار الوحيد في GPU على المحطّة المركزيّة.

GPU مشتركة

حين يشترك زملاء عدّة على خادم واحد بـ GPU واحدة، ارفع OLLAMA_NUM_PARALLEL=4 لخدمة أربعة طلبات في آن. الأداء الفرديّ ينخفض لكنّ الإنتاجيّة الكلّيّة ترتفع. القيد: النموذج نفسه، لأنّ OLLAMA_MAX_LOADED_MODELS=1 افتراضًا.

الخلاصة

  • CUDA وROCm وMetal مدعومة تلقائيّاً؛ التسريع فوريّ حين توجد بطاقة أو شريحة مناسبة.
  • num_gpu يوزّع الطبقات بين GPU والمعالج حين لا يسع النموذج كاملًا في VRAM.
  • num_ctx يرفع الذاكرة الرسميّة رفعًا كبيرًا؛ سياق طويل قد يستلزم تنازلًا في التكميم.
  • المعالج وحده يعمل للدفعات والمهامّ القصيرة، لا للاستعمال التفاعليّ الطويل.