إنتقل إلى المحتوى الرئيسي

الفصل 1: مقدمة في MLflow

ما هو MLflow؟​

MLflow هو منصة مفتوحة المصدر لإدارة دورة حياة تعلم الآلة من البداية إلى النهاية. يوفر أربعة مكونات رئيسية:

إعداد MLflow​

التثبيت​

# التثبيت الأساسي
pip install mlflow

# مع الإضافات
pip install mlflow[extras]

# بدء خادم التتبع المحلي
mlflow server --host 0.0.0.0 --port 5000

إعداد الإنتاج​

# docker-compose.yml
version: '3.8'
services:
mlflow:
image: ghcr.io/mlflow/mlflow:v2.10.0
ports:
- "5000:5000"
environment:
- MLFLOW_BACKEND_STORE_URI=postgresql://user:pass@postgres:5432/mlflow
- MLFLOW_DEFAULT_ARTIFACT_ROOT=s3://mlflow-artifacts/
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
command: >
mlflow server
--backend-store-uri postgresql://user:pass@postgres:5432/mlflow
--default-artifact-root s3://mlflow-artifacts/
--host 0.0.0.0
--port 5000
depends_on:
- postgres

postgres:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mlflow
volumes:
- postgres_data:/var/lib/postgresql/data

volumes:
postgres_data:

تتبع MLflow​

تتبع التجارب الأساسية​

import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score

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

# تعيين التجربة
mlflow.set_experiment("customer-churn-prediction")

# بدء تشغيل
with mlflow.start_run(run_name="random-forest-baseline"):
# تسجيل المعلمات
n_estimators = 100
max_depth = 10
mlflow.log_param("n_estimators", n_estimators)
mlflow.log_param("max_depth", max_depth)
mlflow.log_param("model_type", "RandomForest")

# تدريب النموذج
model = RandomForestClassifier(
n_estimators=n_estimators,
max_depth=max_depth,
random_state=42
)
model.fit(X_train, y_train)

# إجراء التنبؤات
predictions = model.predict(X_test)
probabilities = model.predict_proba(X_test)[:, 1]

# تسجيل المقاييس
mlflow.log_metric("accuracy", accuracy_score(y_test, predictions))
mlflow.log_metric("f1_score", f1_score(y_test, predictions))
mlflow.log_metric("auc_roc", roc_auc_score(y_test, probabilities))

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

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

التسجيل التلقائي​

# تمكين التسجيل التلقائي لـ sklearn
mlflow.sklearn.autolog()

# الآن التدريب يسجل كل شيء تلقائيًا
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
# يتم تسجيل المعلمات والمقاييس والنموذج تلقائيًا!

# التسجيل التلقائي للأطر الأخرى
mlflow.pytorch.autolog()
mlflow.tensorflow.autolog()
mlflow.xgboost.autolog()
mlflow.lightgbm.autolog()

التشغيلات المتداخلة لضبط المعلمات الفائقة​

from sklearn.model_selection import ParameterGrid

param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [5, 10, 15, None],
'min_samples_split': [2, 5, 10]
}

with mlflow.start_run(run_name="hyperparameter-search"):
best_auc = 0
best_params = None

for params in ParameterGrid(param_grid):
with mlflow.start_run(nested=True):
# تسجيل المعلمات
mlflow.log_params(params)

# تدريب النموذج
model = RandomForestClassifier(**params, random_state=42)
model.fit(X_train, y_train)

# التقييم
auc = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
mlflow.log_metric("auc_roc", auc)

# تتبع الأفضل
if auc > best_auc:
best_auc = auc
best_params = params

# تسجيل أفضل النتائج لتشغيل الوالد
mlflow.log_params({f"best_{k}": v for k, v in best_params.items()})
mlflow.log_metric("best_auc_roc", best_auc)

مشاريع MLflow​

هيكل المشروع​

ml-project/
├── MLproject # تعريف المشروع
├── conda.yaml # مواصفات البيئة
├── train.py # سكربت التدريب
└── requirements.txt # بديل لـ conda

ملف MLproject​

# MLproject
name: customer-churn-model

conda_env: conda.yaml

entry_points:
main:
parameters:
n_estimators: {type: int, default: 100}
max_depth: {type: int, default: 10}
data_path: {type: string, default: "data/processed/"}
command: "python train.py --n-estimators {n_estimators} --max-depth {max_depth} --data-path {data_path}"

evaluate:
parameters:
model_path: string
test_data: string
command: "python evaluate.py --model-path {model_path} --test-data {test_data}"

تشغيل المشاريع​

# التشغيل محليًا
mlflow run . -P n_estimators=200 -P max_depth=15

# التشغيل من Git
mlflow run https://github.com/company/ml-project -P n_estimators=200

# التشغيل ببيئة محددة
mlflow run . --env-manager conda

نماذج MLflow​

توقيع النموذج ومثال الإدخال​

from mlflow.models.signature import infer_signature
import pandas as pd

# استنتاج التوقيع من البيانات
signature = infer_signature(X_train, model.predict(X_train))

# إنشاء مثال إدخال
input_example = X_train.head(5)

# تسجيل النموذج مع التوقيع
mlflow.sklearn.log_model(
model,
"model",
signature=signature,
input_example=input_example,
registered_model_name="customer-churn-model"
)

نكهات النموذج​

# طرق مختلفة لتسجيل النماذج

# Sklearn
mlflow.sklearn.log_model(sklearn_model, "model")

# PyTorch
mlflow.pytorch.log_model(pytorch_model, "model")

# TensorFlow/Keras
mlflow.tensorflow.log_model(tf_model, "model")

# نماذج مخصصة مع pyfunc
class CustomModel(mlflow.pyfunc.PythonModel):
def load_context(self, context):
# تحميل القطع الأثرية
self.model = load_model(context.artifacts["model_path"])

def predict(self, context, model_input):
return self.model.predict(model_input)

mlflow.pyfunc.log_model(
"model",
python_model=CustomModel(),
artifacts={"model_path": "path/to/model"}
)

النقاط الرئيسية​

ملخص
  1. تتبع MLflow يسجل المعلمات والمقاييس والقطع الأثرية
  2. التسجيل التلقائي يبسط التتبع للأطر المدعومة
  3. مشاريع MLflow تضمن تكرار كود تعلم الآلة
  4. نماذج MLflow توفر تغليفًا قياسيًا للنشر
  5. توقيعات النموذج تحدد المدخلات والمخرجات المتوقعة

التالي: الفصل 2: Weights and Biases