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

v0.4، فك ترميز مُخطط من غير التضحية بالـ hooks

مسودة · الجزء 4 من سلسلة الطريق إلى Ember 1.0 · غير منشورة بعد
محمد الثبيتي · 2026-08-04
Ember خطط تنفيذ fusion قياس أداء استدلال على CPU LLaMA Qwen
حالة المسودة

مسودة مكتملة باستشهادات صريحة. الأشكال مضمّنة كـ SVG (نسختا الوضع الداكن والفاتح) بتعليقات تستشهد بالأدلة. أرقام الأداء من مصدرين: مصفوفة زمن الإصدار (artifacts/benchmark-v04/2026-08-04/SUMMARY.md) وإعادة إنتاج 2026-08-04 من بناء tag v0.4.0، مسجّلة في artifacts/benchmark-v04/2026-08-04/part4-reproduction.md. اثنان من إخفاقات "الشاهد غير الموثوق" الستة مُعاد بناؤهما من الاختبارات والـ changelog وتاريخ git؛ كل واحد معلَّم كإعادة بناء ويستشهد بالدعم.

معظم عمل فك token واحد هو تقرير ما لازم فعله، لا فعله. v0.4 أخرج داك القرار من الحلقة، من غير إخراج الـ hooks معه.

المشكلة: الحلقة تعيد تقرير كل شيء

ترك v0.3 الـ decode على المسار الأمامي المربوط العام: لكل token، لكل طبقة، يُعاد اكتشاف الشغل نفسه. أي tensor يقرأه هذا الإسقاط؟ أي kernel يتعامل مع dtype؟ أين يذهب المخرج؟ هل يستهدف أي hook هذي المرحلة؟ جمد عقد v0.4 (docs/v04-execution-contract.md) التسلسل المرجعي قبل لمسه، embedding، لكل طبقة RMSNorm → Q/K/V → RoPE → تخزين KV → attention → إسقاط المخرجات → residual → MLP → residual → norm نهائية → رأس، ثم سمّى الهدر (القسم 9): إعادة اكتشاف الشكل/التوزيع لكل token، فحوص hook ديناميكية ضد سجل، وتخصيص مساحة عمل لكل token.

لا شيء من داك الشغل يتغير بين الـ tokens. لا يحصل النموذج على معمارية جديدة عند الخطوة 42. الشيء الوحيد اللي يتغير لكل token هو الـ token نفسه.

قيد التصميم

كان بإمكان إصدار v0.4 أن يسلك الطريق المعتاد: أبقِ المسار العام، أضف مسارًا سريعًا بجانبه، وآمل أن يطابقه. حرم العقد داك بطريقتين. أولًا، قائمة خارج النطاق تشمل عدم وجود محرك خفي ثانٍ يتجاوز الـ hooks، مسار مُحسَّن ما يقدر الباحثون يربطوه مو تحسين؛ إنه برنامج آخر. ثانيًا، لا تُكرَّر الـ kernels: matvecs Q4_K/Q6_K العددية وAVX2 في v0.3 هي التنفيذات الوحيدة، ويحل مسار الخطة kernel لكل tensor عبر دالة resolve_kernel نفسها اللي يستخدمها المسار القديم، مع تأكيد المساواة بالاختبارات (قرار D6 في العقد).

القيد، بعبارة واحدة: خطط للعمل مرة واحدة لكل نموذج؛ نفّذه لكل token؛ أبقِ مواقع الـ hooks الدلالي الست تلاحظ الـ tensors نفسها بالضبط في مواقع النداء نفسها.

التنفيذ

مفاهيم التنفيذ الثلاثة: reference وplanned وplanned-fused من الـ tensors نفسها، مع defusion بقيادة الـ hooks على المسار المدمج مفاهيم التنفيذ الثلاثة (الوضع الفاتح)
الشكل 1، مفاهيم التنفيذ الثلاثة: reference (مرجع مقروء)، planned (مشغّل خطة)، planned-fused (مجموعة fusion مجمّدة مع defusion بقيادة الـ hooks). الثلاثة تنتج tokens جشعة متطابقة ضمن المغلفات المجمّدة (docs/v04-execution-contract.md §9؛ artifacts/benchmark-v04/2026-08-04/SUMMARY.md).
الـ fusion والـ defusion على طبقة واحدة: F1-F5 تلغي بس الوسطيات غير المربوطة؛ F5 يلغي tensor after_attention فيفرض الـ hook النشط المسار غير المدمج الـ fusion والـ defusion على طبقة واحدة (الوضع الفاتح)
الشكل 2، الـ fusion والـ defusion على طبقة واحدة. تلغي F1–F5 بس الوسطيات اللي مو مواقع hook أبدًا؛ ويلغي F5 tensor after_attention (o)، فيفرض الـ hook النشط عند داك الموقع المسار غير المدمج مع تسجيل السبب (docs/v04-execution-contract.md §6–7).

لما أصبحت وحدة المعالجة شاهدًا غير موثوق

كان التسريع المقاس حقيقيًا. جعل القياس حقيقيًا استغرق ستة إخفاقات منفصلة، وهي جزء من القصة عشان كل واحد منها مكان ممكن يكذب فيه محرك أسرع على مؤلفيه.

  1. الضجيج الحراري جعل الـ fusion المدمج يبدو أبطأ. هذا الجهاز يشتغل بحاكم powersave، مسجّل في run_metadata لكل قياس (artifacts/benchmark-v03/bench-summary.json)، لذا فإن الـ tokens/ثانية المطلقة متغيرة حرارياً، ووقعت جلسات مدمجة مبكرة في نافذة خنق وبدت تراجعًا. الإصلاح بروتوكول لا كود: أذرع متتالية لكل نموذج حتى تشترك أوضاع التنفيذ كلها في حالة الجهاز، ووسطيات على 5 تكرارات مقاسة، لا مقارنات عبر الجلسات (artifacts/benchmark-v04/2026-08-04/SUMMARY.md).
  2. وضع قياس نفّذ المسار المرجعي بالصدفة. يسجله الـ changelog بصراحة: "planned-fused نفّذ المسار المرجعي بصمت حتى قبل planned_decode_eligible الوضعَ" (CHANGELOG.md، v0.4 Fixed). علم يسمي وضع تنفيذ من غير ما يبوّبه علم يقدر الكذب.
  3. اجتازت اختبارات الـ fusion من غير تشغيل المسار المقصود. إعادة بناء من نفس إدخال الـ changelog واختبارات التوازي (tests/k_parity.rs): اختبارات Gate B على مستوى النموذج لـ planned/fused موجودة وتجتاز، بس جلسة مدمجة طُلبت عبر CLI كانت تقدر السقوط إلى المسار المرجعي قبل الإصلاح، فمجموعة اختبارات خضراء بينما الوضع المسمّى لا يشتغل أبدًا. الاستجابة كانت بوابة الأهلية إضافة إلى اختبارات توازٍ تحدد وضع التنفيذ صراحةً وتؤكد الـ tokens الجشعة (k_parity.rs، v04_planned_matches_reference_real_model).
  4. بوابة تخصيص اختبرت مسار trait محجوبًا. تعليق اختبار Gate E هو الدليل: "Trait path (ForwardModel) حتى يشتغل توزيع وضع التنفيذ v0.4؛ طريقة Llama الذاتية كانت ستحجبه" (tests/k_parity.rs). نداء طريقة ذاتية ممكن يتجاوز مشغّل الخطة بالكامل؛ اختبار التخصيص لم يعنِ شيء إلا بعد المرور عبر الـ trait اللي يوزّع فعلًا.
  5. تشويه الجلسات المثبّتة على النوى. التثبيت على أربع نوى مادية يقلل من شأن matvec الأعمدة المتوازي، وهو ذراع الأداء. البروتوكول النهائي يشغّل الجهاز الكامل 8 الخيوط من غير taskset، والملخص يقول داك صراحةً (artifacts/benchmark-v04/2026-08-04/SUMMARY.md).
  6. كشف تكرار الـ attention لاحقًا تخصيصًا زائفًا إضافيًا. بعد الإصدار، دمج تمرير إزالة التكرار الـ kernels الثلاثة المتكررة وأزال تخصيصات Vec لكل مهمة "قد تظهر كتخصيص زائف على خيط يسرق rayon" (الالتزام 624a216، main، 2026-08-04، بعد v0.4.0، لذا "لاحقًا"). أرقام Gate E كانت صحيحة؛ الحساب ما كان قد التقط كل موقع تخصيص لا يزوره إلا تجمع خيوط دافئ.
إخفاقات القياس الستة وإصلاح البروتوكول لكل منها: الضجيج الحراري، وضع قياس يشغل المرجع، اختبارات fusion من غير تغطية مسار، بوابة تخصيص محجوبة، نوى مثبتة، تخصيص زائف من تكرار attention إخفاقات القياس الستة وإصلاحاتها (الوضع الفاتح)
الشكل 3، لما أصبحت وحدة المعالجة شاهدًا غير موثوق: الإخفاقات الستة وإصلاح البروتوكول لكل منها (CHANGELOG v0.4 Fixed؛ artifacts/benchmark-v04/2026-08-04/SUMMARY.md؛ tests/k_parity.rs؛ الالتزام 624a216).

الخيط المشترك: كل واحد من هذي حالة يُقاس فيها الـ harness لا المحرك. المحرك الأسرع غير جدير بالثقة ما لم يُتحقق كمان من الـ harness ومن مسار التنفيذ الدلالي.

النتيجة المثبتة

سُجّلت البوابات A–G مسبقًا في العقد قبل التنفيذ (القسم 13) ومو ممكن إلا تشديدها:

مصفوفة زمن الإصدار (artifacts/benchmark-v04/2026-08-04/SUMMARY.md؛ decode 64 token، إحماء 1، 5 تكرارات، وسطيات، 8 خيوط، جهاز كامل):

النموذجreference tpsplannedplanned-fusedنسبة plannedنسبة fused
Llama-3.2-1B Q4_K_M1.483.423.412.32×2.31×
Llama-3.2-1B Q6_K1.433.313.292.32×2.31×
Qwen2.5-1.5B Q4_K_M1.524.044.032.66×2.66×
Qwen2.5-1.5B Q6_K1.974.063.892.06×1.97×

هذا هو ادعاء "نحو 2.0–2.7×" بدقته: مقابل مسار v0.3 المرجعي على الثنائي نفسه، نفس البروتوكول، أربع مجموعات أولية. مو ادعاءً ضد llama.cpp، مصفوفة v0.4 لا تسجل ذراع llama.cpp، وصياغة العقد النهائية تكرر أنه لا توازٍ تنافسي يُدّعى ما لم يُظهره دليل غير متوقع (القسم 19).

أُعيد في 2026-08-04 من بناء tag v0.4.0 (sha الثنائي 23322cd3…، مسجّل في artifacts/benchmark-v04/2026-08-04/part4-reproduction.md)، Llama-3.2-1B Q4_K_M بنفس البروتوكول:

التنفيذmedian tpsذروة RSSالنسبة مقابل reference
reference2.61843,952 KB1.00×
planned5.52844,316 KB2.11×
planned-fused5.28847,284 KB2.02×

إعادة الإنتاج أعلى من مصفوفة الإصدار في tps المطلق (حالة الجهاز مختلفة؛ الإصدار شغل نفس البروتوكول على نفس الجهاز)، بس الشكل نفسه: ذروة RSS مسطحة عبر الأوضاع، وإنتاجية تتضاعف تقريبًا. أُعيد تشغيل المجموعات الثلاث المتبقية تحت نفس البروتوكول؛ قيمها في ملف الأدلة. المخرجات الدلالية الحتمية مو قابلية استنساخ زمنية، tokens متطابقة وhidden states متطابقة لا تعني أزمنة حائط متطابقة، وهو بالضبط ما يتحدث عنه قسم الشاهد غير الموثوق.

إيش اللي لا يشتغل بعد

إيش اللي أطلق هذا

آلات تجارب v0.5 تركب مشغّل الخطة: تحل مواصفات الالتقاط والتدخل إلى حل مواقع الـ hooks في الخطة، ومجموعة الـ fusion المجمّدة هي ما يستدل به سياسة defusion في v0.5. الـ token أصبح مُخططًا مرة واحدة؛ الإصدار التالي يجعل الخطة نفسها artifact ممكن التحقق منه ومقارنته واستنساخه من قبل شخص لا يقرأ Rust أبدًا.