Machine Learning: البدء مع MLOps و MLflow
آخر تحديث: 2026-08-26
ML بدون إدارة التجارب مثل الكود بدون Git - لا أحد يعرف أي إصدار هو الأفضل.
1. ما ستتعلمه
- مفاهيم MLOps: DevOps ممتدة إلى ML، إدارة دورة حياة ML الكاملة
- المكونات الأساسية الأربعة لـ MLflow: Tracking / Projects / Models / Model Registry
- تتبع التجارب عمليًا: تسجيل المعاملات والمقاييس والنماذج والرسوم البيانية؛ مقارنة إصدارات النماذج
- Model Registry: إدارة مراحل النموذج (Staging → Production)، التراجع عن الإصدار
- إدارة تجارب Bob: كيفية إدارة 50+ تجربة لـ SalesPredict بشكل منهجي
2. قصة حقيقية من قائد فريق ML
(1) الألم: بعد 50 تجربة، لا فكرة عن أي نموذج هو الأفضل
أجرى Bob أكثر من 50 تجربة في ثلاثة أسابيع - خوارزميات مختلفة، ميزات مختلفة، معاملات مختلفة. كانت المعاملات والنتائج لكل تجربة متناثرة عبر Jupyter Notebooks ورسائل Slack والملاحظات اللاصقة. عندما سأل مدير المنتج، "أي نموذج هو الأفضل الآن؟" قضى Bob ساعتين في البحث في السجلات ولم يكن متأكدًا. فوضى التجارب هي القاعدة في مشاريع ML.
(2) حل MLflow
يسجل MLflow تلقائيًا المعاملات والمقاييس والنماذج والرسوم البيانية لكل تجربة. جميع التجارب مركزية وقابلة للمقارنة وقابلة للتتبع.
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 - يهتم ليس فقط بإصدارات الكود، ولكن أيضًا بإصدارات البيانات وإصدارات التجارب وإصدارات النماذج.
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
▶ مثال: تسجيل معاملات ومقاييس التجربة
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:
# Execution successful
▶ مثال: الاستعلام عن التجارب ومقارنتها
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:
Top 3 runs by R²:
(2) MLflow Models و Registry
▶ مثال: تسجيل النموذج وإدارة المرحلة
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:
# Execution successful
| مرحلة Registry | المعنى | الإجراء النموذجي |
|---|---|---|
| None | للتو تم تسجيله | اختبار تلقائي |
| Staging | في انتظار التحقق | اختبار A/B |
| Production | مباشر في الإنتاج | خدمة عبر الإنترنت |
| Archived | متقاعد | حفظ السجلات |
5. مشاريع MLflow والتسجيل التلقائي
▶ مثال: التسجيل التلقائي مع autolog
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:
# Execution successful
| إطار autolog | ما يتم تسجيله تلقائيًا |
|---|---|
| sklearn | المعاملات، المقاييس، النموذج، مصفوفة الارتباك |
| xgboost | المعاملات، المقاييس، أهمية الميزات |
| lightgbm | المعاملات، المقاييس، أهمية الميزات |
| pytorch | المعاملات، المقاييس، النموذج |
▶ مثال: تسجيل رسوم بيانية مخصصة
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:
# Execution successful
6. إدارة 50+ تجربة لـ Bob عمليًا
▶ مثال: إطار تتبع التجارب الدفعية
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:
Best experiments:
❓ أسئلة شائعة
mlflow server --backend-store-uri sqlite:///mlflow.db. للإنتاج، استخدم PostgreSQL + تخزين الكائنات (S3/GCS) + وكيل عكسي.mlflow.sklearn.load_model(run_id) لاستعادة النموذج الكامل. اقترن مع DVC لإدارة إصدار البيانات.📖 ملخص
- MLOps = DevOps لـ ML: إدارة دورة الحياة الكاملة لإصدارات البيانات وإصدارات التجارب وإصدارات النماذج
- المكونات الأساسية الأربعة لـ MLflow: Tracking (تسجيل) + Projects (تعبئة) + Models (تنسيق) + Registry (تسجيل)
- أساسيات التتبع: log_params + log_metrics + log_model - كل تجربة يتم تسجيلها تلقائيًا
- يدير Model Registry مراحل النموذج: None → Staging → Production → Archived
- يلتقط autolog تلقائيًا المعاملات والمقاييس والنماذج، مما يقلل من عبء التسجيل اليدوي
- قابلية التكرار = تسجيل المعاملات + البيانات + البذرة العشوائية + إصدار الكود بالكامل
📝 تمارين
- أساسي (الصعوبة ⭐): ثبّت MLflow، وابدأ خادم Tracking محلي، وسجل تجربة واحدة بمعامل (lr=0.01) ومقياس (r2=0.85). تلميح:
pip install mlflow+mlflow.start_run(). - متوسط (الصعوبة ⭐⭐): استخدم autolog لتسجيل عملية تدريب RandomForestRegressor من sklearn، ثم استعلم عن جميع التشغيلات وفرز حسب R². تلميح:
mlflow.sklearn.autolog()+search_runs(). - تحدٍّ (الصعوبة ⭐⭐⭐): نفّذ إطار إدارة تجارب Bob - شغّل 5 نماذج على بيانات SalesPredict، وسجل المعاملات/المقاييس/النماذج تلقائيًا في MLflow لكل تشغيل، وسجل أفضل نموذج في Registry، وحمّل نموذج Production للتنبؤ. تلميح: راجع مثال التجربة الدفعية في القسم 6.
← الدرس السابق: تقييم النموذج والضبط | الدرس التالي: نشر النموذج →