من جحيم “شغال عندي” إلى جنة الأتمتة: كيف أنقذنا مشاريع الذكاء الاصطناعي بـ MLOps

يا أهلاً وسهلاً فيكم جميعاً، معكم أخوكم أبو عمر.

قبل كم سنة، كنا شغالين على مشروع كبير لتصنيف صور طبية. فريق صغير، حماس كبير، وأملنا في السماء. كان معنا شب شاطر اسمه “سالم”، خبير بيانات توه متخرج، وعيونه بتلمع من الشغف. سالم قعد أسابيع يشتغل على النموذج، يجرّب ويعدّل، لحد ما في يوم من الأيام، دخل علينا المكتب وهو يصرخ من الفرحة: “يا جماعة! وصلت دقة 94%! النموذج خرافي!”.

كلنا فرحنا، وطلبت منه يسلّمني الشغل عشان نبدأ نجهزه للنشر على الخوادم (السيرفرات). سالم بكل ثقة بعثلي ملف Jupyter Notebook وملف النموذج المحفوظ `model.h5` وقال: “اتفضل يا كبير، كل شي تمام”.

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

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

التشخيص: ما هو جحيم “شغال عندي” وأعراضه؟

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

  • غياب تتبع التجارب: مين درّب أي نموذج؟ بأي نسخة من البيانات؟ وبأي بارامترات؟ الإجابات كانت محفوظة في أسماء ملفات مثل: model_final_v2_fixed.pkl أو في ذاكرة الفريق اللي بتخون مع الوقت.
  • صعوبة إعادة إنتاج النتائج (Reproducibility): لو طلبت من سالم يعيد تدريب النموذج بعد شهر، مستحيل كان يطلع بنفس النتيجة 100%، لأنه ببساطة البيئة تغيرت والبيانات يمكن تعدلت.
  • النشر اليدوي المليء بالمخاطر: عملية “انقل الملفات على السيرفر وشغّلها” كانت أشبه بالسير في حقل ألغام. كل مرة نكتشف مشكلة جديدة في بيئة الإنتاج.
  • الجزر المنعزلة: فريق علم البيانات (زي سالم) شغال في واد، وفريق العمليات (DevOps) اللي بده ينشر النموذج في واد ثاني. ما في لغة مشتركة بينهم.

باختصار، كنا بنبني سيارات سباق سريعة (النماذج)، لكن بنصنع كل سيارة بيدنا من الصفر، وبننقلها للشوارع على ظهر حصان. كان لازمنا خط تجميع (Assembly Line).

العلاج الشافي: مقدمة بسيطة إلى MLOps

لما تسمع مصطلح MLOps، لا تفكره شي معقد وفضائي. ببساطة، هو تطبيق مبادئ الـ DevOps على عالم تعلم الآلة (Machine Learning). الهدف؟ أتمتة وتوحيد دورة حياة مشروع الذكاء الاصطناعي بالكامل، من أول سطر كود إلى لحظة نشر النموذج ومراقبته.

الـ MLOps مش مجرد أداة بنشتريها، هي ثقافة عمل ومجموعة ممارسات بتضمن إنتاج نماذج عالية الجودة بشكل متكرر وموثوق. هي الجسر اللي بيربط بين عالم التجارب والأبحاث (Data Science) وعالم التشغيل والإنتاج (Operations).

بناء خط الأنابيب: رحلة الأتمتة خطوة بخطوة

بعد ما شخصنا المشكلة وعرفنا اسم العلاج، بدأنا نبني “خط الأنابيب” (Pipeline) الخاص فينا. هذه هي المراحل اللي مشينا فيها، وأنصح أي فريق يتبعها.

المرحلة الأولى: إدارة الكود والبيانات (الأساس المتين)

أول خطوة هي فرض النظام على أهم أصلين عندك: الكود والبيانات.

  • الكود المصدر (Source Code): كل شيء لازم يكون على نظام تتبع إصدارات مثل Git. سكربتات التدريب، معالجة البيانات، ملفات الإعدادات… كل شيء. هذا هو الحد الأدنى من النظام.
  • البيانات والنماذج (Data & Models): ملفات البيانات والنماذج حجمها كبير، وما بنفع نحطها على Git مباشرة. هنا يأتي دور أدوات مثل DVC (Data Version Control). فكر فيها كأنها “Git للبيانات”. تسمح لك بتتبع إصدارات بياناتك ونماذجك الضخمة وربطها بإصدار معين من الكود.

نصيحة من الخُبْز والتّنور 🔥

ابدأ أي مشروع جديد بهذين الأمرين: git init ثم dvc init. هذه هي “بسم الله الرحمن الرحيم” في عالم MLOps. بتضمن إن كل شيء عندك له تاريخ وإصدار يمكن الرجوع إليه.

مثال بسيط على استخدام DVC:


# بعد تثبيت DVC، نبدأ بتتبع مجلد البيانات
dvc add data/raw_images

# الآن ملف data/raw_images.dvc الصغير هو اللي بنضيفه لـ Git
git add data/raw_images.dvc .gitignore
git commit -m "Track initial raw images dataset"

# نرفع البيانات الفعلية لمكان تخزين سحابي (مثل S3 أو Google Drive)
dvc push

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

المرحلة الثانية: أتمتة التدريب والتحقق (CI for AI)

هنا يبدأ السحر الحقيقي. هدفنا هو أن تتم عملية تدريب النموذج وتقييمه بشكل آلي بمجرد أي تغيير على الكود. هذا ما يسمى بالتكامل المستمر (Continuous Integration).

استخدمنا أدوات مثل GitHub Actions. أنشأنا ملف بسيط يحدد الخطوات التي يجب أن تحدث تلقائياً:

  1. عندما يقوم مطور (مثل سالم) بعمل git push لتغيير جديد.
  2. يعمل السيرفر (Runner) تلقائياً.
  3. يسحب آخر نسخة من الكود (git pull).
  4. يسحب نسخة البيانات الصحيحة باستخدام (dvc pull).
  5. يثبّت المكتبات المطلوبة من ملف requirements.txt.
  6. يشغّل سكربت التدريب train.py.
  7. يشغّل سكربت التقييم evaluate.py ويسجل النتائج (مثل الدقة).

هذا مثال على ملف GitHub Actions (.github/workflows/training.yml) ممكن تبدأ فيه:


name: Model Training Pipeline

on:
  push:
    branches: [ main ]

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
          pip install dvc[s3] # كمثال لو التخزين على AWS S3

      - name: Pull data from DVC
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: dvc pull -v

      - name: Train the model
        run: python src/train.py

      - name: Evaluate the model
        run: python src/evaluate.py

الآن، بدل ما سالم يبعثلي ملف ويقول “شغال عندي”، صار السيستم هو الحكم. لو الكود فيه مشكلة، أو التدريب فشل، كلنا بنعرف فوراً وبشكل موثق.

المرحلة الثالثة: النشر والتسليم المستمر (CD for AI)

بعد ما صار عندنا نموذج ناجح تم تدريبه وتقييمه آلياً، الخطوة التالية هي نشره. هنا نستخدم مبدأ التسليم المستمر (Continuous Delivery).

الحل السحري في هذه المرحلة هو Docker. نقوم بـ “تغليف” أو “حَوْسَلَة” (Containerize) النموذج مع كل متطلباته (المكتبات، الكود) داخل حاوية دوكر. هذه الحاوية هي بيئة معزولة ومستقلة، تضمن أن النموذج سيعمل بنفس الطريقة في أي مكان: على جهازك، على جهاز زميلك، أو على سيرفر الإنتاج.

خط الأنابيب (Pipeline) الآن صار أذكى:

  1. بعد نجاح مرحلة التدريب والتقييم.
  2. يقوم ببناء صورة دوكر (Docker Image) من ملف اسمه Dockerfile.
  3. يرفع هذه الصورة إلى سجل حاويات (Container Registry) مثل Docker Hub أو AWS ECR.
  4. (اختياري ومتقدم) يقوم آلياً بنشر هذه الحاوية الجديدة على بيئة الاختبار (Staging) أو حتى الإنتاج (Production) باستخدام أدوات مثل Kubernetes أو حتى سكربت بسيط.

هذا مثال على Dockerfile بسيط لخدمة API تقدم النموذج باستخدام FastAPI:


# استخدم صورة بايثون خفيفة
FROM python:3.9-slim

# حدد مجلد العمل داخل الحاوية
WORKDIR /app

# انسخ ملف المتطلبات أولاً للاستفادة من التخزين المؤقت للـ layers
COPY ./requirements.txt .

# ثبّت المكتبات
RUN pip install --no-cache-dir -r requirements.txt

# انسخ باقي ملفات التطبيق
COPY ./src /app/src
COPY ./models /app/models

# عرّف الأمر الذي سيتم تشغيله عند بدء الحاوية
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "80"]

المرحلة الرابعة: المراقبة والتتبع بعد النشر

هل تعتقد أن القصة انتهت بمجرد نشر النموذج؟ أبداً. هذه مجرد البداية. النموذج في العالم الحقيقي يتأثر ببيانات جديدة قد تختلف عن بيانات التدريب.

  • مراقبة أداء النموذج (Model Drift): هل بدأت دقة النموذج بالانخفاض مع الوقت؟ يجب أن تكون لديك لوحة متابعة (Dashboard) تراقب أداء النموذج على البيانات الحية.
  • مراقبة البيانات (Data Drift): هل تغير توزيع البيانات التي يستقبلها النموذج؟ مثلاً، لو درّبت نموذجك على صور نهارية، وبدأ يستقبل صور ليلية بكثرة، أداؤه سيتدهور.

أدوات مثل MLflow و Weights & Biases ممتازة لتتبع التجارب، وأدوات مثل Prometheus و Grafana يمكن استخدامها لمراقبة أداء الخدمة والنموذج في بيئة الإنتاج.

نصيحة عملية 💡

النموذج الذي تنشره وتنساه، مثل الزرع الذي لا تسقيه… مصيره الذبول والموت. المراقبة هي عملية “السقاية” الدورية لنماذجك لضمان بقائها حية وفعالة.

الخلاصة: من الفوضى إلى النظام

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

إذا كنت تبدأ اليوم، هذه هي نصيحتي الأخيرة لك:

  • ابدأ صغيراً: لست بحاجة لكل هذه الأدوات من اليوم الأول. ابدأ بـ Git، ثم أضف DVC، ثم أنشئ خط أنابيب بسيط على GitHub Actions. تطور خطوة بخطوة.
  • الأتمتة هي صديقك: أي مهمة تكررها يدوياً أكثر من مرتين، فكر فوراً في طريقة لأتمتتها. وقتك أثمن من أن يضيع في مهام روتينية.
  • ركز على المبادئ لا الأدوات: الأدوات تتغير وتتبدل، لكن مبادئ تتبع الإصدارات، الأتمتة، الاختبار، والمراقبة هي التي تبقى وتصنع الفارق.

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

أبو عمر

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

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

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

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

آخر المدونات

تجربة المستخدم والابداع البصري

واجهاتنا كانت حصونًا منيعة: كيف أنقذتنا ‘معايير الوصول الرقمي’ (WCAG) من جحيم استبعاد المستخدمين؟

أنا أبو عمر، مطور برمجيات فلسطيني. في هذه المقالة، أشارككم قصة غيرت نظرتي للبرمجة، وكيف حولت "معايير الوصول الرقمي" (WCAG) تطبيقاتنا من قلاع مغلقة إلى...

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

كودنا كان غارقًا في استعلامات SQL النصية: كيف أنقذتنا ‘مخططات الكائنات العلائقية’ (ORM) من جحيم الصيانة؟

أشارككم قصة من قلب المعركة البرمجية، كيف انتقلنا من فوضى استعلامات SQL المكتوبة يدويًا إلى عالم منظم وآمن باستخدام تقنيات ORM. هذه ليست مجرد مقالة...

18 أبريل، 2026 قراءة المزيد
الشبكات والـ APIs

خدماتنا كانت مكشوفة وفوضوية: كيف أنقذتنا ‘بوابة الواجهات البرمجية’ (API Gateway) من جحيم الإدارة اليدوية والأمان المهترئ؟

أشارككم قصة حقيقية من قلب المعركة البرمجية، كيف انتقلنا من فوضى الخدمات المصغرة والأمان المهترئ إلى نظام مركزي وآمن. اكتشفوا معنا كيف كانت بوابة الواجهات...

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

مقابلات تصميم النظم كانت صندوقًا أسود: كيف أنقذني ‘إطار عمل منهجي’ من جحيم الإجابات العشوائية؟

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

18 أبريل، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

طلباتنا كانت تضرب قاعدة البيانات بلا رحمة: كيف أنقذنا ‘التخزين المؤقت’ (Caching) من جحيم الاستجابة البطيئة؟

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

18 أبريل، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

معاملاتنا كانت تُسرق في وضح النهار: كيف أنقذنا ‘الكشف عن الاحتيال بالتعلم الآلي’ من جحيم الخسائر المالية؟

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

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