← voidwest    ember    الطريق إلى Ember 1.0

الطريق إلى Ember 1.0، ليش نبني محرك استدلال آخر؟

مسودة · الجزء 0 من سلسلة الطريق إلى Ember 1.0 · غير منشورة بعد
محمد الثبيتي · 2026-08-04
Ember GGUF استدلال على CPU قابلية الاستنساخ

النظام البيئي يملك llama.cpp. Ember موجود عشان النموذج اللي يشتغل مو هو النموذج اللي تقدر تفحصه وتعديله واستنساخه. تتابع السلسلة هذي هذا التمييز إصدارًا بإصدار، ومن ضمنها الإخفاقات.

السؤال تحت السؤال

إذا كان هدفك هو عدد tokens في الثانية، فالإجابة الصادقة عن "ليش نبني محرك استدلال آخر" هي أنك المفروض لا. llama.cpp موجود، وهو سريع، وهو المرجع لسبب وجيه. السلسلة هذي عن هدف مختلف.

بدأ Ember كوسيلة لغاية بحثية. كان السؤال عن الصرف العربي: كيف وأين تمثّل نماذج اللغة العصبية الصرف غير الالتصاقي، الجذور والأوزان، وليش يفشل توافر التمثيل أحيانًا في إنتاج سلوك توليدي؟ الإجابة تتطلب hidden states في طبقات ومواضع مختارة، وقدرة على تغيير تلك الحالات وملاحظة النتيجة، وإجراءً قابلاً للتكرار بحيث يقدر باحث ثانٍ تشغيله والثقة بالنتيجة.

الأدوات اللي تحرّك tokens عبر النموذج ممتازة في تحريك tokens. وهي غير مبنية للإجابة عن: "ما هذا الـ tensor، في هذي الطبقة، في هذا الموضع، في هذي اللحظة، وكيف أُغيّره، وأثبت أن التغيير كان مؤثرًا؟"

ليش لا نكتفي باستدعاء llama.cpp

llama.cpp هو المرجع الخارجي لـ Ember، للصحة وللأداء. سلم الـ golden logits يتحقق من مخرجات Ember مقابل مراجعة محدّدة من llama.cpp (scripts/validate_golden_ladder.sh؛ أداة المرجع tools/logits_dump.c)، وتسجّل artifacts القياس أرقام llama.cpp على الملفات نفسها (artifacts/benchmark-v03/llama-3.2-1b-q4_k_m.llama-bench.json).

بس المرجع الخارجي له وظيفة مختلفة. llama.cpp مُهندَس للاتساع والإنتاجية؛ Ember مُهندَس للخاصية المعاكسة: مسار تنفيذ مقروء عمدًا، يكون فيه كل عامل وكل tensor وكل موقع hook صريحًا، إضافة إلى أدوات للالتقاط والتعديل والمقارنة والاستعادة مع تتبّع المصدر. هذا مو نقدًا لـ llama.cpp؛ إنه تقسيم عمل: llama.cpp هو المرجع، وEmber يتحقق من مساره الخاص مقابله.

لا يدّعي Ember اتساعًا أو إنتاجية مماثلة، وما راح تجادل السلسلة هذي بغير داك. سبب القراءة مو السرعة؛ بل أن المحركين يجيبان عن سؤالين مختلفين.

القيود اللي شكّلت التصميم

ثلاثة قيود، ثابتة منذ البداية:

القيود هذي تكلف أداءً، وستعرض السلسلة كم بالضبط، وفي أي مواضع، وإيش اللي فُعل لتقليل الكلفة من غير التخلي عنها.

ما صدر، باختصار

الإصدارالقدرة الأساسيةالسؤال اللي أجاب عنه
v0.1استدلال قابل للفحص على GGUF: prefill، decode، KV cache، تتبّع، استخراج hidden states، قياس حتميهل ممكن جعل الاستدلال مقروءًا بما يكفي للبحث في دواخل النماذج؟
v0.2التقاط تنشيطات، hooks تدخّل، patch بين الجلسات، استعادة مطابقة للبت، artifacts منظمة مع مصدرهل يدعم Ember تجارب سببية بدل الملاحظة الوصفية بس؟
v0.3تنفيذ Q4_K/Q6_K أصلي: أوزان مضغوطة عبر mmap، kernels عددية وAVX2، توزيع لكل tensor، توازٍ خارجيما فائدة نموذج Q4 إذا كان المحرك يفكّه إلى f32؟
v0.4فك ترميز مُخطط: خطط تنفيذ غير قابلة للتغيير، scratch arenas، مجموعة fusion مجمّدة مع defusion بالـ hooks، matvec متوازي الأعمدة، تنميطهل ممكن تخطيط التنفيذ وتحسينه من غير إخفاء الـ tensors اللي يحتاج الباحثون فحصها؟
v0.5.1حزم تجارب قابلة للاستنساخ: مواصفات صارمة، اختيار tokens بدقة البايت، hooks دلالية، تدخلات، تحقق من غير اتصال، مقارنة، استنساخهل ممكن لباحث لم يكتب Ember تشغيل تجربة على دواخل النموذج والتحقق منها من غير لمس Rust؟

رقم واحد لكل إصدار، ليكون شكل السلسلة مرئيًا من البداية. v0.3 خفّض الذاكرة المقيمة لنموذج كمّي من غيغابايتات f32 الموسّعة إلى حجم الملف تقريبًا: 6,989,724 KB → 844,216 KB ذروة RSS على Llama-3.2-1B Q4_K_M (artifacts/benchmark-v03/part3-binary-memory.md). v0.4 ضاعف إنتاجية فك الترميز على المسار المرجعي في المجموعات الأربع الأساسية، نحو 2.0–2.7×، مع بقاء ذروة RSS ثابتة تقريبًا (artifacts/benchmark-v04/2026-08-04/SUMMARY.md). v0.5 جعل خط التجارب كله حتميًا وقابلاً للتحقق من غير اتصال. التحفظات الملحقة بكل رقم جزء من القصة، لا حواشٍ.

إيش تعني كلمة "مدعوم"

"مدعوم" في جداول نماذج Ember يعني وجود مسار تنفيذ. مو معناه أن الصف مُتحقق منه رقميًا. التمييز هو السلم: smoke (الأمر عمل)، golden logits (المخرجات قورنت بمرجع موثوق)، فحوص المرجعية للتنشيطات (قورنت الحالات الداخلية)، الـ probes (قابلية الفك)، التدخلات (الاستخدام السببي). كل درجة ادعاء مختلف، وما راح تنزلق السلسلة بينها.

الحالة الراهنة في جملة: صفوف عائلتي llama وqwen2.5 لديها توافق golden logits مع مرجع llama.cpp المثبّت (توافق 100% في top-1 عبر درجات السلم الست، توافق على الـ argmax لا مساواة logits، مع اختلافات مغلف تصل إلى 1.74 كحد أقصى على درجة qwen q4)؛ صفوف qwen3 واعدة بس التحقق golden معلّق؛ gemma 4 يُحمَّل بسه غير موثوق رقميًا (cosine أحادية token نحو 0.87 مقابل المرجع وتتآكل عبر الطبقات)؛ فحوص المرجعية للتنشيطات معلّقة لعدة صفوف. المخرجات الدلالية الحتمية مو قابلية استنساخ زمنية: tokens متطابقة وhidden states متطابقة مو معناها أزمنة حائط متطابقة.

ما ما راح تدّعيه السلسلة هذي

أين تذهب السلسلة وبعدها

أسرع طريقة لرؤية القيود في الشغل هي قصة الذاكرة. ملف Q4 يصل إلى الذاكرة كـ f32، بمعنى دقيق، تم فك ضغطه بواسطة المحرك اللي كان مفترضًا أن يشغّله. المقال التالي هو v0.3: كمّي على القرص، كمّي في الذاكرة، وسلم التحقق اللي أبقى المسار المضغوط صادقًا.