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

سجل نماذج 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: سجل النماذج والتقديم

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.