المراقبة والملاحظة

تتبع التجارب وسجل النماذج

4 دقيقة للقراءة

تتبع التجارب هو كيف تتجنب الفرق فوضى "أي إصدار من النموذج في الإنتاج؟". يتوقع المحاورون أن تعرف MLflow بعمق.

مفاهيم MLflow الأساسية

المفهوم الغرض نقطة المقابلة
التجربة تجميع التشغيلات المرتبطة واحدة لكل مشروع/مهمة
التشغيل تنفيذ تدريب واحد له معاملات، مقاييس، أصول
الأصل ملفات الإخراج النماذج، الرسوم البيانية، عينات البيانات
سجل النماذج دورة حياة النموذج انتقالات Staging → Production

سؤال المقابلة: إعداد MLflow

السؤال: "اشرح لي إعداد تتبع التجارب لفريق من 10 مهندسي ML."

import mlflow
from mlflow.tracking import MlflowClient

# تكوين الخادم (للوصول الجماعي)
# mlflow server --backend-store-uri postgresql://... --default-artifact-root s3://...
TRACKING_URI = "http://mlflow.internal:5000"
mlflow.set_tracking_uri(TRACKING_URI)

def train_model_with_tracking(params: dict, data):
    # إنشاء أو الحصول على التجربة
    experiment = mlflow.set_experiment("fraud_detection_v2")

    with mlflow.start_run(run_name=f"run_{datetime.now().isoformat()}"):
        # تسجيل المعاملات
        mlflow.log_params(params)

        # التدريب
        model = train(data, **params)
        metrics = evaluate(model, test_data)

        # تسجيل المقاييس
        mlflow.log_metrics({
            "precision": metrics["precision"],
            "recall": metrics["recall"],
            "f1": metrics["f1"],
            "auc_roc": metrics["auc_roc"]
        })

        # تسجيل النموذج مع التوقيع
        signature = mlflow.models.infer_signature(
            X_train, model.predict(X_train)
        )

        mlflow.sklearn.log_model(
            model,
            artifact_path="model",
            signature=signature,
            registered_model_name="fraud_detector"
        )

        # تسجيل أصول إضافية
        mlflow.log_artifact("feature_importance.png")
        mlflow.log_artifact("confusion_matrix.png")

        return mlflow.active_run().info.run_id

سير عمل سجل النماذج

from mlflow.tracking import MlflowClient

client = MlflowClient()

def promote_model(model_name: str, run_id: str, stage: str):
    """
    المراحل: None → Staging → Production → Archived
    """
    # الحصول على إصدار النموذج من التشغيل
    model_uri = f"runs:/{run_id}/model"

    # التسجيل إذا لم يكن موجوداً
    model_version = mlflow.register_model(model_uri, model_name)

    # انتقال المرحلة
    client.transition_model_version_stage(
        name=model_name,
        version=model_version.version,
        stage=stage,
        archive_existing_versions=(stage == "Production")
    )

    # إضافة وصف
    client.update_model_version(
        name=model_name,
        version=model_version.version,
        description=f"تمت الترقية إلى {stage} في {datetime.now()}"
    )

    return model_version.version

# الاستخدام
promote_model("fraud_detector", "abc123", "Staging")  # بعد التحقق
promote_model("fraud_detector", "abc123", "Production")  # بعد الموافقة

سؤال المقابلة: تحميل نموذج الإنتاج

السؤال: "كيف تضمن أن كود التقديم يستخدم دائماً أحدث نموذج إنتاج؟"

import mlflow

def load_production_model(model_name: str):
    """تحميل نموذج الإنتاج الحالي"""

    # الطريقة 1: بالمرحلة (موصى بها)
    model = mlflow.pyfunc.load_model(
        model_uri=f"models:/{model_name}/Production"
    )

    # الطريقة 2: بالإصدار (للتكرارية)
    # model = mlflow.pyfunc.load_model(
    #     model_uri=f"models:/{model_name}/3"
    # )

    return model

def predict_with_production_model(features):
    model = load_production_model("fraud_detector")
    return model.predict(features)

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

الميزة MLflow Weights & Biases Neptune
النشر استضافة ذاتية أو مُدارة سحابة فقط سحابة فقط
التكلفة مجاني (استضافة ذاتية) طبقة مجانية + مدفوعة طبقة مجانية + مدفوعة
الواجهة أساسية تصور غني تصور غني
السجل مدمج محدود محدود
الأفضل لـ التحكم الكامل تصور التجارب فرق البحث

نقطة حديث المقابلة: "أفضل MLflow للإنتاج لأننا يمكننا استضافته ذاتياً داخل VPC لأمان البيانات، ويتكامل جيداً مع خطوط أنابيب النشر."

أخطاء المقابلة الشائعة

# ما لا يجب قوله
mistakes:
  - "نحفظ النماذج فقط في S3 مع الطوابع الزمنية"
    why_bad: "لا نسب، لا يمكن إعادة الإنتاج، لا يمكن التدقيق"

  - "نستخدم Git لإصدار النماذج"
    why_bad: "Git غير مصمم للثنائيات الكبيرة"

  - "كل مهندس يستخدم تتبعه الخاص"
    why_bad: "لا تعاون، عمل مكرر، غير متسق"

# ما يجب قوله
best_practices:
  - "خادم تتبع مركزي مع واجهة PostgreSQL"
  - "توقيعات النموذج للتحقق من المدخلات/المخرجات"
  - "ترقية آلية من خلال CI/CD"
  - "مسار تدقيق للامتثال"

نصيحة احترافية: في المقابلات، اذكر توقيعات النموذج: "نستخدم توقيعات MLflow لالتقاط عدم تطابق مخطط المدخلات قبل أن تسبب أخطاء إنتاج."

في الدرس التالي، سنغطي مراقبة البنية التحتية لأنظمة ML. :::

اختبار

الوحدة 4: المراقبة والملاحظة

خذ الاختبار