Machine Learning: البدء مع MLOps و MLflow

آخر تحديث: 2026-08-26

ML بدون إدارة التجارب مثل الكود بدون Git - لا أحد يعرف أي إصدار هو الأفضل.

1. ما ستتعلمه


2. قصة حقيقية من قائد فريق ML

(1) الألم: بعد 50 تجربة، لا فكرة عن أي نموذج هو الأفضل

أجرى Bob أكثر من 50 تجربة في ثلاثة أسابيع - خوارزميات مختلفة، ميزات مختلفة، معاملات مختلفة. كانت المعاملات والنتائج لكل تجربة متناثرة عبر Jupyter Notebooks ورسائل Slack والملاحظات اللاصقة. عندما سأل مدير المنتج، "أي نموذج هو الأفضل الآن؟" قضى Bob ساعتين في البحث في السجلات ولم يكن متأكدًا. فوضى التجارب هي القاعدة في مشاريع ML.

(2) حل MLflow

يسجل MLflow تلقائيًا المعاملات والمقاييس والنماذج والرسوم البيانية لكل تجربة. جميع التجارب مركزية وقابلة للمقارنة وقابلة للتتبع.

PYTHON
import mlflow

mlflow.set_experiment("SalesPredict-Revenue")
with mlflow.start_run(run_name="xgboost_v1"):
    mlflow.log_params({"n_estimators": 300, "max_depth": 6, "learning_rate": 0.1})
    mlflow.log_metrics({"r2": 0.89, "mae": 8.5})
    mlflow.sklearn.log_model(model, "model")

(3) النتيجة: إيجاد أفضل تجربة في ثانيتين، كفاءة التجربة 3 أضعاف

بعد اعتماد MLflow، يمكن لـ Bob إيجاد أفضل نموذج تاريخي في ثانيتين. تتم مقارنة التجارب الجديدة تلقائيًا مع التشغيلات السابقة، وتضاعفت كفاءة التعاون بين الفريق 3 مرات.


3. مفاهيم MLOps

(1) إدارة دورة حياة ML

MLOps هو DevOps ممتد إلى مجال ML - يهتم ليس فقط بإصدارات الكود، ولكن أيضًا بإصدارات البيانات وإصدارات التجارب وإصدارات النماذج.

100%
graph TB
    DATA[هندسة البيانات<br/>الإصدار وخط الأنابيب] --> EXP[التجربة<br/>التتبع والمقارنة]
    EXP --> REG[Model Registry<br/>الإصدار والمرحلة]
    REG --> DEPLOY[النشر<br/>الخدمة والتوسع]
    DEPLOY --> MON[المراقبة<br/>الانحراف والأداء]
    MON -->|مشغل إعادة التدريب| DATA

(2) كيف يختلف ML عن هندسة البرمجيات التقليدية

البُعد هندسة البرمجيات هندسة ML
التحكم في الإصدار الكود الكود + البيانات + النماذج
الاختبار اختبارات الوحدة اختبارات البيانات + اختبارات النموذج
النشر انشر مرة إعادة التدريب المستمر
سبب التدهور الأخطاء انحراف البيانات / انحراف المفهوم
قابلية التكرار الكود = النتيجة الكود + البيانات + المعاملات = النتيجة

4. المكونات الأساسية الأربعة لـ MLflow

(1) MLflow Tracking

▶ مثال: تسجيل معاملات ومقاييس التجربة

PYTHON
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_absolute_error
from sklearn.model_selection import train_test_split
import numpy as np

mlflow.set_tracking_uri("sqlite:///mlflow.db")
mlflow.set_experiment("SalesPredict-Revenue")

rng = np.random.default_rng(42)
n = 1000
X = rng.uniform(0, 100, (n, 5))
y = 50 + 0.8 * X[:, 0] + 1.2 * X[:, 1] + rng.normal(0, 5, n)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# التجربة 1: Random Forest
with mlflow.start_run(run_name="rf_baseline"):
    params = {"n_estimators": 100, "max_depth": 10}
    mlflow.log_params(params)

    model = RandomForestRegressor(**params, random_state=42)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)

    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    mlflow.log_metrics({"r2": r2, "mae": mae})
    mlflow.sklearn.log_model(model, "model")

    print(f"RF: R²={r2:.4f}, MAE={mae:.2f}")

# التجربة 2: XGBoost
import xgboost as xgb

with mlflow.start_run(run_name="xgboost_v1"):
    params = {"n_estimators": 300, "max_depth": 6, "learning_rate": 0.1}
    mlflow.log_params(params)

    model = xgb.XGBRegressor(**params, random_state=42)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)

    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    mlflow.log_metrics({"r2": r2, "mae": mae})
    mlflow.xgboost.log_model(model, "model")

    print(f"XGB: R²={r2:.4f}, MAE={mae:.2f}")

Output:

TEXT 📖 للعرض فقط
# Execution successful

▶ مثال: الاستعلام عن التجارب ومقارنتها

PYTHON
import mlflow

# الاستعلام عن التجارب
experiment = mlflow.get_experiment_by_name("SalesPredict-Revenue")
runs = mlflow.search_runs(experiment_ids=[experiment.experiment_id])

# فرز حسب R² (الأفضل أولًا)
best_runs = runs.sort_values("metrics.r2", ascending=False)
print("Top 3 runs by R²:")
print(best_runs[["run_name", "metrics.r2", "metrics.mae",
                   "params.n_estimators", "params.max_depth"]].head(3))

Output:

TEXT 📖 للعرض فقط
Top 3 runs by R²:

(2) MLflow Models و Registry

▶ مثال: تسجيل النموذج وإدارة المرحلة

PYTHON
import mlflow

# تسجيل نموذج
model_uri = f"runs:/{run_id}/model"
mlflow.register_model(model_uri, "SalesPredict-Revenue-Model")

# نقل مرحلة النموذج
client = mlflow.tracking.MlflowClient()
client.transition_model_version_stage(
    name="SalesPredict-Revenue-Model",
    version=1,
    stage="Staging",
)

# ترقية إلى الإنتاج
client.transition_model_version_stage(
    name="SalesPredict-Revenue-Model",
    version=1,
    stage="Production",
)

# تحميل نموذج الإنتاج
model = mlflow.sklearn.load_model("models:/SalesPredict-Revenue-Model/Production")

Output:

TEXT 📖 للعرض فقط
# Execution successful
مرحلة Registry المعنى الإجراء النموذجي
None للتو تم تسجيله اختبار تلقائي
Staging في انتظار التحقق اختبار A/B
Production مباشر في الإنتاج خدمة عبر الإنترنت
Archived متقاعد حفظ السجلات

5. مشاريع MLflow والتسجيل التلقائي

▶ مثال: التسجيل التلقائي مع autolog

PYTHON
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
import numpy as np

# تسجيل تلقائي: تسجيل جميع المعاملات والمقاييس والنموذج تلقائيًا
mlflow.sklearn.autolog()

rng = np.random.default_rng(42)
X = rng.uniform(0, 100, (1000, 5))
y = 50 + 0.8 * X[:, 0] + rng.normal(0, 5, n)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

with mlflow.start_run(run_name="gb_autolog"):
    model = GradientBoostingRegressor(n_estimators=100, max_depth=5, learning_rate=0.1, random_state=42)
    model.fit(X_train, y_train)
    # autolog يلتقط كل شيء تلقائيًا!

Output:

TEXT 📖 للعرض فقط
# Execution successful
إطار autolog ما يتم تسجيله تلقائيًا
sklearn المعاملات، المقاييس، النموذج، مصفوفة الارتباك
xgboost المعاملات، المقاييس، أهمية الميزات
lightgbm المعاملات، المقاييس، أهمية الميزات
pytorch المعاملات، المقاييس، النموذج

▶ مثال: تسجيل رسوم بيانية مخصصة

PYTHON
import mlflow
import matplotlib.pyplot as plt
import numpy as np

with mlflow.start_run(run_name="feature_analysis"):
    # إنشاء وتسجيل رسم بياني
    fig, ax = plt.subplots()
    ax.barh(["feat_1", "feat_2", "feat_3", "feat_4", "feat_5"],
            [0.35, 0.25, 0.15, 0.10, 0.05])
    ax.set_xlabel("Importance")
    ax.set_title("Feature Importance")
    plt.tight_layout()

    mlflow.log_figure(fig, "feature_importance.png")
    plt.close()

    # تسجيل القطع الأثرية (أي ملف)
    # mlflow.log_artifact("local_file.csv")

Output:

TEXT 📖 للعرض فقط
# Execution successful

6. إدارة 50+ تجربة لـ Bob عمليًا

▶ مثال: إطار تتبع التجارب الدفعية

PYTHON
import mlflow
import mlflow.sklearn
import xgboost as xgb
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.model_selection import cross_val_score
from sklearn.metrics import r2_score, mean_absolute_error
import numpy as np

mlflow.set_experiment("SalesPredict-Benchmark")

# بيانات محاكاة
rng = np.random.default_rng(42)
X = rng.uniform(0, 100, (2000, 10))
y = 50 + X[:, :5] @ [0.8, 1.2, -0.5, 0.3, 0.1] + rng.normal(0, 5, 2000)

# تتبع التجارب المنهجي
experiments = [
    {"name": "linear_baseline", "model": LinearRegression(), "params": {}},
    {"name": "ridge_alpha1", "model": Ridge(alpha=1), "params": {"alpha": 1}},
    {"name": "rf_100", "model": RandomForestRegressor(n_estimators=100, random_state=42),
     "params": {"n_estimators": 100}},
    {"name": "rf_300", "model": RandomForestRegressor(n_estimators=300, random_state=42),
     "params": {"n_estimators": 300}},
    {"name": "xgb_d6_lr01", "model": xgb.XGBRegressor(max_depth=6, learning_rate=0.1, random_state=42),
     "params": {"max_depth": 6, "learning_rate": 0.1}},
]

for exp in experiments:
    with mlflow.start_run(run_name=exp["name"]):
        mlflow.log_params(exp["params"])
        cv_scores = cross_val_score(exp["model"], X, y, cv=5, scoring="r2")
        mlflow.log_metrics({
            "cv_r2_mean": cv_scores.mean(),
            "cv_r2_std": cv_scores.std(),
        })

# إيجاد أفضل تجربة
runs = mlflow.search_runs(
    experiment_ids=[mlflow.get_experiment_by_name("SalesPredict-Benchmark").experiment_id],
    order_by=["metrics.cv_r2_mean DESC"],
)
print("Best experiments:")
print(runs[["run_name", "metrics.cv_r2_mean", "metrics.cv_r2_std"]].head(5))

Output:

TEXT 📖 للعرض فقط
Best experiments:

❓ أسئلة شائعة

س هل أستخدم MLflow أم Weights & Biases (W&B)؟
ج MLflow مفتوح المصدر، مجاني، يمكن استضافته ذاتيًا، وكامل الميزات. يوفر W&B تصورات أفضل وتعاونًا أسهل بين الفريق، لكنه مرخص تجاريًا. للأفراد أو الفرق الصغيرة، اختر MLflow؛ للفرق الكبيرة، W&B مناسب تمامًا.
س كيف أنشر خادم MLflow Tracking؟
ج للتطوير المحلي، استخدم mlflow server --backend-store-uri sqlite:///mlflow.db. للإنتاج، استخدم PostgreSQL + تخزين الكائنات (S3/GCS) + وكيل عكسي.
س هل يمكنني مزج autolog مع التسجيل اليدوي؟
ج نعم. يلتقط autolog المعلومات القياسية، بينما يضيف التسجيل اليدوي محتوى مخصصًا (مثل المقاييس التجارية والرسوم البيانية). النهج الموصى به: اعتمد على autolog كخط أساس وأضف سجلات يدوية للإضافات.
س هل Model Registry ضروري حقًا؟
ج بالتأكيد. بدون Registry، تكون ملفات النماذج متناثرة في كل مكان، وليس لديك أي فكرة عن أي منها في الإنتاج أو أي منها قديم. يوفر Registry إدارة الإصدارات وإدارة المراحل وقدرات التراجع.
س كيف أنظم عددًا كبيرًا من التجارب؟
ج استخدم التجارب للتجميع (مثل SalesPredict-Revenue / SalesPredict-Churn)، والعلامات للتصنيف (مثل team=bob, priority=high)، و run_name للتمييز (مثل xgboost_v3_tuned).
س كيف أضمن قابلية تكرار التجربة؟
ج يسجل MLflow المعاملات + إصدار الكود + إصدار البيانات + البذرة العشوائية. استخدم mlflow.sklearn.load_model(run_id) لاستعادة النموذج الكامل. اقترن مع DVC لإدارة إصدار البيانات.

📖 ملخص

📝 تمارين

  1. أساسي (الصعوبة ⭐): ثبّت MLflow، وابدأ خادم Tracking محلي، وسجل تجربة واحدة بمعامل (lr=0.01) ومقياس (r2=0.85). تلميح: pip install mlflow + mlflow.start_run().
  2. متوسط (الصعوبة ⭐⭐): استخدم autolog لتسجيل عملية تدريب RandomForestRegressor من sklearn، ثم استعلم عن جميع التشغيلات وفرز حسب R². تلميح: mlflow.sklearn.autolog() + search_runs().
  3. تحدٍّ (الصعوبة ⭐⭐⭐): نفّذ إطار إدارة تجارب Bob - شغّل 5 نماذج على بيانات SalesPredict، وسجل المعاملات/المقاييس/النماذج تلقائيًا في MLflow لكل تشغيل، وسجل أفضل نموذج في Registry، وحمّل نموذج Production للتنبؤ. تلميح: راجع مثال التجربة الدفعية في القسم 6.

← الدرس السابق: تقييم النموذج والضبط | الدرس التالي: نشر النموذج →

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%