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