سجل النماذج والتقديم

سجل نماذج MLflow

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

سجل نماذج MLflow يوفر مخزن نماذج مركزي مع تحكم في الإصدار وانتقالات المراحل وتتبع النسب. هو أكثر سجل نماذج مفتوح المصدر استخداماً.

الإعداد

# ثبّت MLflow
pip install mlflow

# ابدأ خادم MLflow مع السجل
mlflow server --backend-store-uri sqlite:///mlflow.db \
              --default-artifact-root ./mlartifacts \
              --host 0.0.0.0 --port 5000

تسجيل النماذج

من تشغيل تجربة

import mlflow
from sklearn.ensemble import RandomForestClassifier

# عيّن URI التتبع
mlflow.set_tracking_uri("http://localhost:5000")

# درّب وسجّل النموذج
with mlflow.start_run() as run:
    model = RandomForestClassifier(n_estimators=100)
    model.fit(X_train, y_train)

    # سجّل النموذج
    mlflow.sklearn.log_model(model, "model")

    # سجّل المقاييس
    mlflow.log_metric("accuracy", 0.95)

    # سجّل النموذج
    mlflow.register_model(
        f"runs:/{run.info.run_id}/model",
        "fraud-detector"
    )

التسجيل المباشر

from mlflow import MlflowClient

client = MlflowClient()

# سجّل من التشغيل
result = client.create_registered_model("fraud-detector")

# أضف إصداراً
client.create_model_version(
    name="fraud-detector",
    source=f"runs:/{run_id}/model",
    run_id=run_id
)

إدارة مراحل النموذج

انتقالات المراحل

from mlflow import MlflowClient

client = MlflowClient()

# انتقل لـ staging
client.transition_model_version_stage(
    name="fraud-detector",
    version=1,
    stage="Staging"
)

# بعد الاختبار، رقِّ للإنتاج
client.transition_model_version_stage(
    name="fraud-detector",
    version=1,
    stage="Production"
)

# أرشف نموذج الإنتاج القديم
client.transition_model_version_stage(
    name="fraud-detector",
    version=0,
    stage="Archived"
)

الأسماء المستعارة للنماذج (MLflow 2.x)

# عيّن اسماً مستعاراً للإشارة الأسهل
client.set_registered_model_alias(
    name="fraud-detector",
    alias="champion",
    version=3
)

# حمّل بالاسم المستعار
model = mlflow.pyfunc.load_model("models:/fraud-detector@champion")

تحميل النماذج

بالإصدار

import mlflow

# حمّل إصداراً محدداً
model_v1 = mlflow.pyfunc.load_model("models:/fraud-detector/1")
model_v2 = mlflow.pyfunc.load_model("models:/fraud-detector/2")

بالمرحلة

# حمّل نموذج الإنتاج
production_model = mlflow.pyfunc.load_model("models:/fraud-detector/Production")

# حمّل نموذج staging
staging_model = mlflow.pyfunc.load_model("models:/fraud-detector/Staging")

بالاسم المستعار

# حمّل نموذج champion
champion_model = mlflow.pyfunc.load_model("models:/fraud-detector@champion")

البيانات الوصفية للنموذج

إضافة الأوصاف

client = MlflowClient()

# وصف مستوى النموذج
client.update_registered_model(
    name="fraud-detector",
    description="""
    نموذج كشف الاحتيال الفوري لمعاملات الدفع.
    المالك: risk-team@company.com
    SLA: 99.9% وقت تشغيل، <50ms p99 زمن استجابة
    """
)

# وصف مستوى الإصدار
client.update_model_version(
    name="fraud-detector",
    version=3,
    description="""
    v3: أُضيفت ميزات جديدة لبصمة الجهاز.
    الدقة: 0.95 (+0.05 مقارنة بـ v2)
    بيانات التدريب: 2025-01-01 إلى 2025-01-15
    """
)

العلامات

# أضف علامات لإصدار النموذج
client.set_model_version_tag(
    name="fraud-detector",
    version=3,
    key="training_dataset",
    value="v2.1"
)

client.set_model_version_tag(
    name="fraud-detector",
    version=3,
    key="approved_by",
    value="alice@company.com"
)

الاستعلام من السجل

عرض النماذج

client = MlflowClient()

# اعرض جميع النماذج المُسجلة
for model in client.search_registered_models():
    print(f"النموذج: {model.name}")
    for version in model.latest_versions:
        print(f"  الإصدار {version.version}: {version.current_stage}")

بحث النماذج

# ابحث بالاسم
models = client.search_registered_models(filter_string="name LIKE 'fraud%'")

# ابحث الإصدارات بالعلامة
versions = client.search_model_versions(
    filter_string="tags.approved_by = 'alice@company.com'"
)

احصل على أحدث نموذج إنتاج

def get_production_model(model_name: str):
    """احصل على نموذج الإنتاج الحالي."""
    client = MlflowClient()

    for version in client.search_model_versions(f"name='{model_name}'"):
        if version.current_stage == "Production":
            return mlflow.pyfunc.load_model(f"models:/{model_name}/Production")

    raise ValueError(f"لم يُعثر على نموذج إنتاج لـ {model_name}")

تكامل CI/CD

اختبار آلي قبل الترقية

def test_and_promote(model_name: str, version: int):
    """اختبر النموذج ورقِّه إذا نجح."""
    client = MlflowClient()

    # حمّل نموذج staging
    model = mlflow.pyfunc.load_model(f"models:/{model_name}/Staging")

    # شغّل الاختبارات
    predictions = model.predict(test_data)
    accuracy = calculate_accuracy(predictions, test_labels)

    if accuracy >= 0.90:
        # رقِّ للإنتاج
        client.transition_model_version_stage(
            name=model_name,
            version=version,
            stage="Production",
            archive_existing_versions=True
        )
        return True
    else:
        print(f"النموذج فشل في الاختبارات: accuracy={accuracy}")
        return False

مثال GitHub Actions

# .github/workflows/model-promotion.yml
name: ترقية النموذج

on:
  workflow_dispatch:
    inputs:
      model_name:
        required: true
      version:
        required: true

jobs:
  promote:
    runs-on: ubuntu-latest
    steps:
      - name: اختبر ورقِّ النموذج
        env:
          MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_URI }}
        run: |
          python scripts/test_and_promote.py \
            --model ${{ inputs.model_name }} \
            --version ${{ inputs.version }}

أفضل الممارسات

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

الرؤية الرئيسية: سجل نماذج MLflow يتكامل بسلاسة مع تتبع MLflow، يُعطيك نسباً من البداية للنهاية من التجربة لنموذج الإنتاج.

التالي، سنستكشف تقديم النماذج مع BentoML. :::

اختبار

الوحدة 5: سجل النماذج والتقديم

خذ الاختبار