من جحيم “شغال عندي” إلى جنة الأتمتة: كيف أنقذنا مشاريع الذكاء الاصطناعي بـ 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. تطور خطوة بخطوة.
  • الأتمتة هي صديقك: أي مهمة تكررها يدوياً أكثر من مرتين، فكر فوراً في طريقة لأتمتتها. وقتك أثمن من أن يضيع في مهام روتينية.
  • ركز على المبادئ لا الأدوات: الأدوات تتغير وتتبدل، لكن مبادئ تتبع الإصدارات، الأتمتة، الاختبار، والمراقبة هي التي تبقى وتصنع الفارق.

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

أبو عمر

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

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

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

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

آخر المدونات

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

كنا نبني جدرانًا رقمية: كيف فتحت لنا ‘إمكانية الوصول’ (Accessibility) أبوابًا لم نكن نراها؟

اعتقدنا أننا نبني تطبيقات رائعة، لكننا كنا في الحقيقة نبني جدرانًا رقمية. في هذه المقالة، يشارك أبو عمر كيف غيّر فهم 'إمكانية الوصول' (Accessibility) منظوره...

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

كانت صفحاتنا تموت من ألف استعلام: كيف أنقذتنا تقنيات ‘التحميل المسبق’ (Eager Loading) من جحيم مشكلة N+1؟

أشارككم قصة حقيقية من أرض المعركة البرمجية، كيف اكتشفنا عدوًا صامتًا يسمى "مشكلة N+1" كان يقتل أداء تطبيقنا، وكيف كانت تقنية التحميل المسبق (Eager Loading)...

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

كانت بيئاتنا جزرًا من الفوضى: كيف أنقذتنا “البنية التحتية كشفرة” (IaC) من جحيم الانحراف التكويني؟

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

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

مقابلاتي التقنية كانت كارثة: كيف أنقذني ‘التفكير بصوت عالٍ’ من جحيم الفشل؟

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

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

كان مستخدمونا في الطرف الآخر من العالم ينتظرون إلى الأبد: كيف أنقذتنا شبكات توصيل المحتوى (CDN) من جحيم زمن الاستجابة المرتفع؟

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

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

من شبكة مثقوبة إلى حصن منيع: كيف أنقذتنا قواعد البيانات الرسومية من كابوس الاحتيال؟

كنا نغرق في بحر من الإنذارات الكاذبة والشبكات الاحتيالية المعقدة التي لم تستطع قواعدنا التقليدية كشفها. في هذه المقالة، أسرد لكم تجربتي كـ "أبو عمر"...

30 مايو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

ميزانيات الخطأ (Error Budgets): كيف أنهت كابوس مكالمات منتصف الليل وأنقذتنا من الإرهاق؟

كنا غارقين في مكالمات طوارئ ليلية لا تنتهي، فريق منهك والمنتج على المحك. في هذه المقالة، أشارككم قصة كيف أنقذنا مفهوم "ميزانيات الخطأ" (Error Budgets)...

30 مايو، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

كانت اجتماعاتنا الفردية استجواباً صامتاً: كيف حولنا الـ 1-on-1 من تقرير حالة ممل إلى محرك لنمو الفريق؟

أشارككم تجربتي كقائد فريق تقني في تحويل الاجتماعات الفردية (1-on-1s) من جلسات استجواب مملة إلى محادثات مثمرة تساهم في بناء الثقة وتطوير الفريق. هذه المقالة...

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