الفصل 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"}
)
النقاط الرئيسية
ملخص
- تتبع MLflow يسجل المعلمات والمقاييس والقطع الأثرية
- التسجيل التلقائي يبسط التتبع للأطر المدعومة
- مشاريع MLflow تضمن تكرار كود تعلم الآلة
- نماذج MLflow توفر تغليفًا قياسيًا للنشر
- توقيعات النموذج تحدد المدخلات والمخرجات المتوقعة
التالي: الفصل 2: Weights and Biases