نظرة عامة

NEURL Cortex هي طبقة التقديم لنموذج تعلّم آلة مدرَّب. تُغلّف النموذج خلف واجهة REST API مبنيّة بـ Python — يُدخل إليها عبر run_api.py — ليصبح الاستدلال استدعاء HTTP عاديًا لا تمرينًا داخل دفتر ملاحظات. وهي تخدم التطبيقات والأدوات الداخلية التي تحتاج تنبؤات النموذج كبيانات مهيكلة يمكنها التصرّف بناءً عليها.

التحدي

النموذج المدرَّب، بذاته، جامد. يعيش أثرًا مُسلسلًا على القرص، لا تستطيع تحميله إلا عملية تعرف مسبقًا كيف تجده، وكيف تُهيّئه، وكيف تصوغ المدخلات في هيئة الموتّرات التي يتوقّعها. وكل مستهلك لاحق يريد تنبؤًا عليه أن يعيد تنفيذ هذا الإعداد، وأن يستوعب شجرة اعتماديات النموذج، وأن يدفع كلفة البداية الباردة بتحميل الأوزان في كل استدعاء. والنتيجة كود ربط مكرّر، ومعالجة أوّلية غير متّسقة بين المستدعين، وسقف صارم لعدد الأنظمة التي يمكنها واقعيًا استخدام النموذج أصلًا. وما كان مطلوبًا هو حدّ فاصل: عملية واحدة تملك النموذج، وتُبقيه ساخنًا في الذاكرة، وتنشر عقدًا ثابتًا — طلب يدخل، ومخرج مهيكل يخرج — بحيث يعتمد المستهلكون على الواجهة لا على الأثر. وهذا الحدّ الفاصل هو NEURL Cortex.

تصميم النظام

الخدمة تعتمد Python أولًا، ومساحة سطحها صغيرة عن قصد. الملف run_api.py في جذر المستودع هو نقطة الدخول الوحيدة: يُشغّل عملية HTTP، ويرفع النموذج، ويركّب المسارات. وتقيم معالِجات المسارات تحت /APIS، فتفصل شؤون النقل — تحليل الطلب، والتحقّق من صحّته، وصياغة الاستجابة — عن كود النموذج الذي تستدعيه. أمّا النموذج نفسه فيُشحن إلى جانب الخدمة كأثر محزوم (Neurl Model.zip)، يُفكّ ضغطه عند الإقلاع لا عند وصول الطلب، فتبقى الأوزان مقيمة في العملية طوال عمر الخدمة. ومجموعة اعتماديات Python مثبَّتة في requirements.txt؛ في حين أنّ package.json في الجذر هيكل npm متبقٍّ لا يحمل أي مسؤولية بناء.

وجوهر التصميم أنّ النموذج يُحمَّل مرّة ويخدم كثيرين. فالتحميل كلفة بدء تُدفع عند إقلاع العملية، لا كلفة لكل طلب يدفعها كل مستدعٍ، وهذا ما يجعل الاستدلال عند الطلب عمليًا فوق HTTP. وحول هذه النواة، تتعامل الخدمة مع مخرجاتها بوصفها آثارًا من الدرجة الأولى لا أجسام استجابة عابرة: فالمجلّد /outputs يلتقط النتائج المولّدة على القرص، بحيث يمكن فحص التنبؤ أو إعادة تقديمه أو تسليمه إلى مهمّة لاحقة بعد إغلاق طلب HTTP الذي أنشأه. والمخرج المهيكل هو العقد — إذ يحلّل المستهلكون هيئة محدّدة لا نصًّا حرًّا، وهذا ما يتيح للتطبيقات الأخرى أن تبني على النموذج برمجيًا.

ويحمل المستودع كذلك مفتاح حساب خدمة Google Cloud في الجذر، ما يدلّ على أنّ الخدمة تُصادق للخارج على واجهة Google Cloud API كجزء من عملها — وهي بيانات اعتماد تُحمّلها العملية عند الإقلاع وتحتفظ بها طوال المدّة. ومن الناحية التشغيلية، بُنيت الخدمة لتعمل منفصلة وطويلة العمر لا كسكربت تفاعلي: فالملفّان service_output.log وservice_error.log يقعان إلى جانب نقطة الدخول، ويفصلان بيانات قياس التنفيذ الطبيعي عن بيانات قياس الإخفاق في مجرَيَين منفصلين. وهذا الفصل هو الأساس العملي لتشغيل Cortex كخدمة في الخلفية — إذ تبقى الأخطاء قابلة للقراءة دون أن تُدفن تحت ثرثرة الاستدلال. ويرافق Python قدر يسير من HTML وCSS، يوفّر سطحًا معروضًا خفيفًا فوق واجهة البرمجة، لا تطبيق واجهة أمامية كاملًا.

كيف يعمل

01/03
01

إقلاع الخدمة

تُقلع عملية Cortex، فتُحمّل النموذج المحزوم إلى الذاكرة، وتُهيّئ بيانات اعتماد السحابة، ثم تبدأ الاستماع لطلبات الاستدلال.

  1. 1يُستدعى run_api.py كنقطة دخول العملية، وعادةً بشكل منفصل لا بتشغيل تفاعلي.
  2. 2يُفكّ ضغط أثر النموذج المحزوم (Neurl Model.zip) وتُحمَّل أوزانه إلى ذاكرة العملية.
  3. 3تُقرأ بيانات اعتماد حساب الخدمة على Google Cloud من ملف المفتاح في الجذر وتُهيّأ لاستدعاءات API الصادرة.
  4. 4تُسجَّل معالِجات المسارات الموجودة تحت /APIS في خادم HTTP.
  5. 5تُكتب بيانات قياس بدء التشغيل في service_output.log، وأي إخفاق أثناء التهيئة ينتهي إلى service_error.log.
  6. 6تبقى العملية مستمعة وتُبقي النموذج ساخنًا طوال عمر الخدمة.
02

طلب استدلال

يستدعي تطبيق لاحق نقطة نهاية HTTP فيستلم تنبؤًا مهيكلًا من النموذج المقيم في الذاكرة سلفًا.

  1. 1يُرسل تطبيق لاحق طلب HTTP إلى نقطة نهاية استدلال تُتيحها Cortex.
  2. 2يُحلّل المعالِج المقابل في /APIS الحمولة الواردة ويتحقّق من صحّتها.
  3. 3يُصاغ الطلب في هيئة المدخلات التي يتوقّعها النموذج المقيم، دون إعادة تحميل ودون بداية باردة.
  4. 4يُجري النموذج الاستدلال على المدخلات المهيّأة.
  5. 5يُطبَّع خرج النموذج الخام ليوافق عقد الاستجابة المهيكل الخاص بالخدمة.
  6. 6تُعاد النتيجة المهيكلة عبر HTTP ليحلّلها المستدعي برمجيًا.
03

حفظ المخرجات وقابلية الملاحظة

تُكتب نتائج الاستدلال على القرص كآثار دائمة، بينما تُقسَّم بيانات قياس التنفيذ والإخفاق على مجرَيَي سجلّ منفصلين.

  1. 1مع اكتمال الاستدلال، تُكتب النتيجة المولّدة في المجلّد /outputs كأثر دائم.
  2. 2يبقى الخرج المحفوظ متاحًا بعد إغلاق طلب HTTP الذي أنشأه.
  3. 3تقرأ المهام اللاحقة النتائج من /outputs بدلًا من استدعاء النموذج من جديد.
  4. 4تُلحَق تفاصيل التنفيذ الناجح بـ service_output.log.
  5. 5وتُوجَّه الاستثناءات وتتبّعات المكدّس على حدة إلى service_error.log، ما يُبقي إشارة الإخفاق بمعزل عن تسجيل الاستدلال الاعتيادي.

أبرز الميزات

  • واجهة REST API لتقديم النموذج
  • استدلال عند الطلب
  • مخرجات مهيكلة
  • بنية تعتمد Python أولًا

Outcomes

  • أصبح النموذج قابلًا للاستدعاء كخدمة
  • وقابلًا لإعادة الاستخدام عبر تطبيقات متعدّدة

أعمال أخرى

MVP100Hours preview
منصّة نموّ بالذكاء الاصطناعي

MVP100Hours

منصّة مدعومة بالذكاء الاصطناعي تمتدّ من العميل المحتمل حتى إتمام الصفقة — من رصد صامت للزوّار إلى تواصل صوتي ذاتي التشغيل بالذكاء الاصطناعي

عرض المشروع