كانت نماذجنا تموت في الإنتاج: كيف أنقذنا MLOps من جحيم النشر اليدوي؟

بتذكّرها زي كأنها مبارح. ليلة خميس، الساعة بتدق على 2 بعد نص الليل، وأنا والفريق سهرانين في المكتب بنحتفل بإطلاق أحدث نماذجنا لتصنيف الصور. الموديل كان شغال “عال العال” على بيانات الاختبار، والنتائج مبهرة. طلع واحد من الشباب بصوت عالي: “يسعد ربكم يا وحوش، شغل مرتب!”. ضحكنا كلنا وشعرنا بفخر كبير. كان شعور لا يوصف، شعور الإنجاز بعد أسابيع من السهر والتعب.

مر أسبوع، أسبوعين… وكل شيء تمام. لكن بعدها، بلشت توصلنا شكاوي غريبة. النظام “بخبّص”، بيعطي تصنيفات مش منطقية بالمرة. صور قطط يصنفها كلاب، وصور سيارات يصنفها دراجات. دخلنا في دوامة. صرت أسمع جمل زي “بس الموديل كان شغال عندي عالجهاز تمام!” و “أكيد المشكلة من البيانات الجديدة”.

وهون بلش “جحيم النشر اليدوي”. كنا نسحب البيانات الجديدة يدويًا، نعيد تدريب النموذج على لابتوب واحد من الشباب، نختبره بسرعة، وبعدين نرفع ملف النموذج الجديد على السيرفر عن طريق FTP. عملية بتاخذ يومين شغل متواصل، ولو في أي خطأ صغير، بنرجع نعيد كل إشي من الصفر. والأسوأ؟ على بين ما نطلق النسخة الجديدة، بتكون بيانات العالم الحقيقي تغيرت مرة ثانية، ونرجع لنفس المشكلة. كنا بنلف في حلقة مفرغة، ونماذجنا كانت حرفيًا “بتموت” في بيئة الإنتاج بعد فترة قصيرة من ولادتها.

في ليلة من ليالي الإحباط، وقفت قدام الفريق وحكيتلهم: “يا جماعة، هيك ما بنفع. شغلنا مش شغل فلاح بزرع وبستنى الموسم. شغلنا لازم يكون زي المصنع، خط إنتاج واضح ومؤتمت. لازم نلاقي حل”. ومن هنا، بدأت رحلتنا مع ما يسمى بـ MLOps.

ما هو الـ MLOps وليش “بوجّع الراس” بدونه؟

بكل بساطة، تخيل لو بدك تبني سيارة. ممكن تبنيها قطعة قطعة بإيدك في كراج بيتك. رح تاخذ وقت طويل، وكل سيارة رح تطلع مختلفة عن التانية، ولو صار فيها عطل، تصليحها قصة. هذا هو حال تطوير نماذج تعلم الآلة بدون منهجية واضحة.

الـ MLOps (اختصار لـ Machine Learning Operations) هو أشبه بخط تجميع سيارات حديث ومؤتمت. هو مش مجرد أداة أو برنامج، هو ثقافة ومجموعة من الممارسات اللي بتدمج بين تطوير نماذج تعلم الآلة (ML) وعمليات نشر وتشغيل البرمجيات (Ops). الهدف هو أتمتة وتوحيد كل مراحل حياة النموذج، من جمع البيانات إلى النشر والمراقبة.

بدون MLOps، أنت بتعيش في جحيم مستمر من المشاكل اللي صارت جزء من روتيننا اليومي وقتها:

  • انحراف النموذج (Model Drift): العالم بيتغير، والبيانات بتتغير معه. النموذج اللي دربته اليوم على بيانات الشتاء، قد لا يعمل بكفاءة في الصيف. بدون مراقبة وإعادة تدريب مستمرة، أداء النموذج سيتدهور حتمًا.
  • صعوبة إعادة إنتاج النتائج (Lack of Reproducibility): هل جربت تشغل كود بعد ست شهور وتلاقيه ما بشتغل؟ نفس المشكلة في تعلم الآلة. بدون توثيق لإصدار البيانات، الكود، والمكتبات المستخدمة، من المستحيل تقريبًا إعادة تدريب نفس النموذج بنفس النتائج.
  • دورات نشر بطيئة ومرعبة (Slow & Scary Deployments): كل عملية نشر جديدة كانت مغامرة محفوفة بالمخاطر والأخطاء اليدوية، وتستغرق أيامًا أو أسابيع.
  • فجوة بين العلم والواقع (Gap between Science and Reality): علماء البيانات يبنون نماذج رائعة في دفاتر Jupyter، لكنها تبقى “حبيسة اللابتوب” وصعبة التحويل إلى منتج حقيقي ومستقر.

رحلتنا نحو الإنقاذ: بناء خط أنابيب MLOps خطوة بخطوة

قرارنا كان واضحًا: بدنا نبني “مصنع” للنماذج تبعتنا. خط إنتاج مؤتمت (Pipeline) يمر فيه النموذج من فكرة إلى واقع، ويظل حيًا وقويًا. قسمنا رحلتنا لمراحل عملية وواضحة.

المرحلة الأولى: إدارة الكود والبيانات كنز واحد (Source & Data Management)

أول خطوة كانت فرض قانون صارم: “ممنوع وجود أي كود أو بيانات مهمة خارج نظام إدارة الإصدارات”.

  • للكود: اعتمدنا Git بشكل كامل. كل تجربة، كل تعديل، كل سطر كود يتم حفظه في Git. هذا سمح لنا بالرجوع لأي نسخة سابقة ومعرفة “مين عمل إيش ومتى”.
  • للبيانات والنماذج: البيانات الضخمة وملفات النماذج لا يمكن وضعها مباشرة في Git. هنا استخدمنا أدوات مثل DVC (Data Version Control). هي أداة بتشتغل مع Git وبتسمح لك تعمل versioning للبيانات والنماذج الكبيرة عن طريق تخزين مؤشرات (pointers) لها في Git، بينما الملفات الفعلية تكون على مساحة تخزين سحابية (مثل S3).

نصيحة أبو عمر: ما تكتب سطر كود واحد بدون ما يكون على Git. حتى لو مشروع شخصي بتلعب فيه. هاي عادة بتنقذ حياتك المهنية، وبتخلي الشغل مع فريق أسهل بمليون مرة. ابدأ اليوم.

المرحلة الثانية: أتمتة بناء وتدريب النموذج (CI for ML)

هذه هي مرحلة “التكامل المستمر” (Continuous Integration) ولكن لعالم تعلم الآلة. الفكرة هي أن أي تغيير في الكود أو البيانات يجب أن يؤدي تلقائيًا إلى إعادة بناء وتدريب النموذج.

استخدمنا GitHub Actions لهذا الغرض. أنشأنا workflow بسيط يقوم بالتالي كلما تم عمل `push` على الـ branch الرئيسي:

  1. يسحب آخر نسخة من الكود والبيانات (باستخدام Git و DVC).
  2. ينشئ بيئة عمل نظيفة ويثبت كل المكتبات المطلوبة من ملف `requirements.txt`.
  3. يشغل سكريبت التدريب (`train.py`).
  4. يحفظ النموذج المدرب ومقاييس الأداء (مثل الدقة) كـ “artifact” أو قطعة أثرية مرتبطة بهذا التشغيل.

هذا مثال بسيط لملف `workflow.yml` على GitHub Actions:


name: ML Training Pipeline

on:
  push:
    branches:
      - main # شغّل الـ pipeline عند أي تحديث للـ branch الرئيسي

jobs:
  train-and-validate:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.9'

    - name: Install dependencies
      run: pip install -r requirements.txt

    # قد تحتاج لخطوات إضافية لسحب البيانات من DVC
    # - name: Pull data using DVC
    #   run: dvc pull

    - name: Run training script
      id: training
      run: python src/train.py --output-path ./model

    - name: Upload model artifact
      uses: actions/upload-artifact@v3
      with:
        name: trained-model
        path: ./model/

فجأة، صار بإمكان أي شخص في الفريق تحديث الكود، والـ pipeline يتكفل بالباقي. بطل في داعي نسأل “أي نسخة من الكود استخدمت لتدريب هاد الموديل؟”.

المرحلة الثالثة: النشر المراقب والمستمر (CD for ML)

بعد تدريب النموذج تلقائيًا، تأتي مرحلة “النشر المستمر” (Continuous Deployment). هنا الهدف هو نشر النموذج الجديد في بيئة الإنتاج بطريقة آمنة ومؤتمتة.

أضفنا خطوات جديدة للـ pipeline تبعنا:

  1. التقييم التلقائي: بعد التدريب، يقوم السكريبت تلقائيًا بتقييم النموذج الجديد ومقارنة أدائه بالنموذج الحالي الموجود في الإنتاج.
  2. سجل النماذج (Model Registry): إذا كان النموذج الجديد أفضل، يتم تسجيله في “سجل النماذج” مع إصداره ومقاييس أدائه. استخدمنا أدوات مثل MLflow التي توفر واجهة مركزية لتتبع كل النماذج التي تم تدريبها.
  3. النشر التدريجي: بدلًا من استبدال النموذج القديم مباشرة، اتبعنا استراتيجية “نشر الكناري” (Canary Deployment). يتم توجيه نسبة صغيرة من المستخدمين (مثلاً 5%) إلى النموذج الجديد، بينما يبقى 95% على القديم. نراقب أداء النموذج الجديد عن كثب. إذا كان كل شيء تمام، نزيد النسبة تدريجيًا حتى يصبح 100% من المستخدمين عليه.

نصيحة أبو عمر: لا تثق بنموذجك الجديد ثقة عمياء. النشر هو عملية علمية وليست قفزة في المجهول. ابدأ بنشر النموذج في “وضع الظل” (Shadow Mode) حيث يستقبل نفس بيانات الإنتاج الحقيقية ولكن نتائجه لا تُعرض للمستخدم، بل تُسجل للمقارنة مع النموذج القديم. هذه الطريقة آمنة جدًا لاختبار النموذج في الواقع قبل تحمل أي مسؤولية.

المرحلة الرابعة: المراقبة، القلب النابض للنظام

هذه هي المرحلة التي كانت ستنقذنا من كارثتنا الأولى. بعد نشر النموذج، العمل لا ينتهي، بل يبدأ!

  • مراقبة الأداء الفني: استخدام أدوات مثل Prometheus و Grafana لمراقبة أشياء مثل زمن الاستجابة (latency)، استخدام الذاكرة والمعالج (CPU/Memory)، ومعدل الأخطاء.
  • مراقبة أداء النموذج: الأهم من ذلك، مراقبة مقاييس جودة النموذج (مثل الدقة، F1-score) على البيانات الحية.
  • مراقبة انحراف البيانات والنموذج: استخدام مكتبات مثل Evidently AI أو DriftCTL لمقارنة توزيع البيانات الحالية التي تدخل للنظام مع توزيع بيانات التدريب. إذا حدث اختلاف كبير (Data Drift)، فهذا مؤشر قوي على أن أداء النموذج سيتدهور قريبًا.

قمنا بضبط تنبيهات (Alerts) تلقائية. “إذا انخفضت دقة النموذج عن 90% لمدة 10 دقائق، أو إذا زاد انحراف البيانات عن عتبة معينة، أرسل رسالة طوارئ على قناة Slack الخاصة بالفريق”. هذا حوّلنا من فريق إطفاء حرائق (reactive) إلى فريق صيانة وقائية (proactive).

نصائح من قلب “المعمعة”: خلاصة خبرة أبو عمر

  • ابدأ بسيطًا، ثم تعقّد: لا تحاول بناء نظام MLOps كامل من اليوم الأول. ابدأ بـ Git، ثم أضف pipeline بسيط على GitHub Actions. كلما نضج فريقك، أضف المراقبة، ثم سجل النماذج، وهكذا.
  • الثقافة قبل الأدوات: MLOps هو تغيير في العقلية قبل أن يكون مجموعة أدوات. يجب أن يتفق الفريق بأكمله (علماء بيانات، مهندسو برمجيات، مهندسو عمليات) على هذه الطريقة في العمل.
  • لا يوجد “شغلي وشغلك”: عالم البيانات يجب أن يفكر في كيفية تشغيل نموذجه في الإنتاج. ومهندس العمليات يجب أن يفهم أساسيات دورة حياة تعلم الآلة. الكل مسؤول عن المنتج من البداية إلى النهاية.
  • وثّق كل شيء كأنك ستنساه غدًا: وثّق إصدارات البيانات، معلمات التدريب، نتائج التجارب. استخدم أدوات مثل MLflow أو Weights & Biases. صدقني، “أبو عمر” المستقبلي سيدعو لـ “أبو عمر” الحالي على هذه الخطوة.

الخلاصة: من جحيم النشر اليدوي إلى جنة الأتمتة 😌

التحول إلى MLOps لم يكن سهلًا، واستغرق وقتًا وجهدًا. لكنه نقلنا من حالة الفوضى والإحباط إلى نظام عمل مستقر، موثوق، وسريع. لم تعد نماذجنا تموت بصمت في الإنتاج. أصبحت كائنات حية تتطور وتتكيف مع العالم الحقيقي بفضل دورة الحياة المؤتمتة التي بنيناها حولها.

إذا كنت تعمل في مجال الذكاء الاصطناعي وتواجه نفس التحديات، فاعلم أن الحل موجود. قد يبدو الاستثمار الأولي في MLOps كبيرًا، ولكنه يوفر عليك أضعافًا مضاعفة من الوقت، الجهد، و”وجع الراس” على المدى الطويل. إنه الفرق بين بناء “كوخ” خشبي ينهار مع أول عاصفة، وبناء “قلعة” صلبة تصمد أمام اختبار الزمن.

يلا يا جماعة، شدّوا الهمّة وخلينا نبني أنظمة ذكية بتعيش وبتتطوّر، مش بتموت بعد أسبوعين. الله يوفقكم! 💪

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

نصائح برمجية

كنا نفترض أن المدخلات دائماً صحيحة: كيف أنقذتنا ‘البرمجة الدفاعية’ من جحيم الانهيارات غير المتوقعة؟

من قلب المعركة البرمجية، يشارككم أبو عمر قصة عن ليلة كادت أن تنهار فيها الأنظمة بسبب ثقتنا العمياء في مدخلات المستخدم. اكتشفوا كيف يمكن لمفهوم...

2 يونيو، 2026 قراءة المزيد
​معمارية البرمجيات

خدماتنا المتشابكة: كيف أنقذتنا المعمارية القائمة على الأحداث (EDA) من جحيم الاعتماديات؟

أشارككم قصة حقيقية من قلب المعركة البرمجية، كيف تحول نظامنا من شبكة عنكبوت هشة إلى منظومة مرنة وقابلة للتوسع. اكتشفوا معنا سحر المعمارية القائمة على...

2 يونيو، 2026 قراءة المزيد
الحوسبة السحابية

كانت فاتورة السحابة تلتهم ميزانيتنا: كيف أنقذتنا ‘ممارسات FinOps’ من جحيم الإنفاق غير المراقب؟

أشارككم قصتي مع فواتير الحوسبة السحابية التي كادت أن تكسر ظهر شركتنا الناشئة، وكيف أصبحت ممارسات الـ FinOps طوق النجاة الذي حول الفوضى إلى سيطرة...

1 يونيو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

كان حسابي على GitHub مقبرة للمشاريع الميتة: كيف أنقذتني ‘المساهمات الاستراتيجية’ من جحيم السيرة الذاتية الفارغة؟

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

1 يونيو، 2026 قراءة المزيد
البودكاست