لماذا خادم MLflow
عند تشغيله محليًا، يكتب MLflow نتائجه في مجلد mlruns على جهازك: لا يراها أحد غيرك، وتختفي مع الجهاز. خادم التتبّع يغيّر ذلك. يرسل كل دفتر وكل سكربت تدريب وكل عضو في الفريق عمليات تشغيله إلى المكان نفسه، وتقارنها الواجهة جنبًا إلى جنب.
ويحمل الخادم نفسه سجلّ النماذج — قائمة النماذج المعتمدة ذات الإصدارات، مع اسم مستعار للنموذج الموجود في الإنتاج — وبالنسبة للذكاء الاصطناعي التوليدي، تتبّعات استدعاءاتك للنماذج اللغوية.
ما يقدّمه MLflow
- تتبّع التجارب — معاملات ومقاييس وملفات كل تشغيل، تُصفّى وتُقارن في الواجهة.
- سجلّ النماذج — الإصدارات والأسماء المستعارة والتاريخ، لتعرف بالضبط ما يعمل في الإنتاج.
- تتبّع LLM — مدخلات ومخرجات وزمن استجابة وخطوات كل طلب في تطبيقات الذكاء الاصطناعي التوليدي.
- ملفات يقدّمها الخادم — ملفات ورسوم ونماذج تُرفع عبر HTTPS، دون تخزين S3 يحتاج إلى إعداد.
- تسجيل تلقائي —
autolog()لـ scikit-learn وPyTorch وTransformers وXGBoost وOpenAI وLangChain. - الحسابات والصلاحيات — حساب لكل شخص، وصلاحيات تُمنح تجربةً تجربةً.
MLflow مقابل التتبّع اليدوي
مرّر الجدول أفقيًا
| خادم MLflow | دفاتر وجدول بيانات | |
|---|---|---|
| سجلّ التجارب | كل تشغيل يُسجَّل تلقائيًا | ما تذكّر أحدهم تدوينه |
| مقارنة نموذجين | شاشة واحدة ومقاييس متجاورة | نسخ الأرقام يدويًا |
| الملفات الناتجة | محفوظة مع التشغيل الذي أنشأها | مبعثرة على الحواسيب |
| النموذج في الإنتاج | إصدار واسم مستعار في السجلّ | ملف باسم «final_v3» |
| العمل الجماعي | خادم مشترك وحسابات | تبادل الملفات |
المتطلبات
يكفي خادم VPS بنظام Ubuntu 24.04 وذاكرة 2 غيغابايت للبدء؛ وخطّط لـ 4 غيغابايت ومساحة قرص أكبر إذا كنت تخزّن نماذج كثيرة، لأن الملفات الناتجة هي التي تشغل المساحة. تحتاج إلى Docker مع إضافة Compose، وإلى اسم نطاق يشير إلى الخادم، مع nginx وشهادة HTTPS: ستتصل به سكربتاتك وفريقك.
تثبيت MLflow باستخدام Docker Compose
جهّز المجلد والأسرار
أنشئ مجلد التطبيق وملف
.envيحمل كلمة مرور الحسابadminومفتاح الجلسة ونطاقك.mkdir -p /opt/mlflow && cd /opt/mlflow cat > .env <<EOF ADMIN_PASSWORD=$(openssl rand -hex 16) SECRET_KEY=$(openssl rand -hex 24) DOMAIN=mlflow.example.ma EOF chmod 600 .envاكتب ملف docker-compose.yml
الصورة
-fullهي النسخة الرسمية التي تتضمّن وحدة المصادقة. عند التشغيل يكتب الأمر الملفbasic_auth.iniالذي يعرّف الحسابadmin، ولا يقبل--allowed-hostsإلا نطاقك والواجهة المحلية. لا يُنشر المنفذ إلا على الواجهة المحلية: وحده nginx يصل إليه. ويوقفMLFLOW_SERVER_ENABLE_JOB_EXECUTION=falseمنفّذ المهام الخلفية، المستهلك للذاكرة وغير الضروري للتتبّع.services: mlflow: image: ghcr.io/mlflow/mlflow:v3.18.0-full restart: unless-stopped ports: - "127.0.0.1:5000:5000" environment: ADMIN_PASSWORD: ${ADMIN_PASSWORD} DOMAIN: ${DOMAIN} MLFLOW_FLASK_SERVER_SECRET_KEY: ${SECRET_KEY} MLFLOW_AUTH_CONFIG_PATH: /mlflow/basic_auth.ini MLFLOW_SERVER_ENABLE_JOB_EXECUTION: "false" entrypoint: ["/bin/sh", "-c"] command: - >- mkdir -p /mlflow/artifacts && printf '[mlflow]\ndefault_permission = NO_PERMISSIONS\ndatabase_uri = sqlite:////mlflow/basic_auth.db\nadmin_username = admin\nadmin_password = %s\nauthorization_function = mlflow.server.auth:authenticate_request_basic_auth\n' "$$ADMIN_PASSWORD" > /mlflow/basic_auth.ini && exec mlflow server --app-name basic-auth --host 0.0.0.0 --port 5000 --workers 2 --backend-store-uri sqlite:////mlflow/mlflow.db --artifacts-destination /mlflow/artifacts --allowed-hosts "$$DOMAIN,localhost:*,127.0.0.1:*" volumes: - mlflow-data:/mlflow volumes: mlflow-data: {}شغّل وتحقّق
يستغرق التشغيل نحو خمس عشرة ثانية. يجيب
/healthدون مصادقة، أما الواجهة البرمجية فتعيد 401 دون بيانات دخول.docker compose up -d curl -fsS http://127.0.0.1:5000/health curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:5000/api/2.0/mlflow/experiments/searchانشر عبر HTTPS باستخدام nginx
في ملف vhost الخاص بنطاقك (بشهادة من certbot)، وجّه الطلبات إلى المنفذ المحلي مع تمرير الترويسة
Host. ارفع قيمةclient_max_body_size: يتجاوز نموذج مرفوع كملف الحدَّ الافتراضي بسرعة.location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 512m; }
دون --app-name basic-auth يبقى الخادم مفتوحًا
افتراضيًا لا يملك mlflow server أي مصادقة: يستطيع كل من يصل إلى العنوان قراءة تجاربك وتنزيل نماذجك وحذف كل شيء. أبقِ --app-name basic-auth، ولا تنشر المنفذ 5000 على عنوان IP العام أبدًا، واترك --allowed-hosts على نطاقك وحده: إنها حماية MLflow من هجمات DNS rebinding.
أرسل تجاربك من Python
ثبّت العميل (pip install mlflow) على جهاز التدريب، ثم وجّهه إلى خادمك. تُمرَّر بيانات الدخول عبر متغيّرات البيئة:
import os
import mlflow
os.environ["MLFLOW_TRACKING_USERNAME"] = "admin"
os.environ["MLFLOW_TRACKING_PASSWORD"] = "YOUR_PASSWORD"
mlflow.set_tracking_uri("https://mlflow.example.ma")
mlflow.set_experiment("churn-model")
with mlflow.start_run():
mlflow.log_param("learning_rate", 0.01)
mlflow.log_metric("accuracy", 0.93)
mlflow.log_artifact("confusion_matrix.png")يظهر التشغيل في الواجهة فورًا، بمعاملاته ومقاييسه والملف المرفوع. ويسجّل mlflow.sklearn.autolog() أو mlflow.pytorch.autolog() كل ذلك دون سطر إضافي.
تتبّع تطبيق LLM
بالنسبة لمساعد أو وكيل، يسجّل التتبّع كل طلب مع استدعاءاته للنموذج وخطواته ومدّتها. فعّل التسجيل التلقائي لمكتبتك، أو زيّن دوالك الخاصة:
import mlflow
mlflow.set_experiment("support-assistant")
mlflow.openai.autolog() # every OpenAI client call becomes a trace
@mlflow.trace
def answer(question: str) -> str:
...تظهر التتبّعات في تبويب التجربة: ترى أي استدعاء كان بطيئًا، وأي سياق أُرسل، وبماذا أجاب النموذج.
سجلّ النماذج
عندما تعتمد تجربة، سجّل نموذجها: يحصل على رقم إصدار، ويمكنك إعطاؤه اسمًا مستعارًا مثل production.
mlflow.register_model(f"runs:/{run_id}/model", "churn-model")تحمّل خدمة الاستدلال عندها models:/churn-model@production: تغيير النموذج يعني نقل الاسم المستعار، دون لمس الشيفرة.
الحسابات والصلاحيات
ينشئ الحساب admin الحسابات الأخرى عبر الواجهة البرمجية:
curl -u admin:YOUR_PASSWORD -X POST https://mlflow.example.ma/api/2.0/mlflow/users/create \
-H 'Content-Type: application/json' \
-d '{"username": "sara", "password": "A_LONG_PASSWORD"}'لا يرى الحساب الجديد أي تجربة حتى تُشارَك معه: تُمنح الصلاحيات (قراءة، تعديل، إدارة) تجربةً تجربةً ونموذجًا نموذجًا. غيّر كلمة مرور admin عبر الواجهة البرمجية users/update-password (مع تمرير القديمة في current_password)، وتبقى الجديدة محفوظة بعد إعادة التشغيل.
النسخ الاحتياطي والتحديث
تقع حالة MLflow كاملة في وحدة التخزين mlflow-data: قاعدة التجارب وقاعدة الحسابات ومجلد الملفات. انسخها احتياطيًا والحاوية متوقّفة، ثم انقل الأرشيف خارج الخادم:
cd /opt/mlflow
docker compose stop
docker run --rm -v mlflow_mlflow-data:/data -v "$PWD":/backup alpine \
tar czf /backup/mlflow-$(date +%F).tar.gz -C /data .
docker compose startللتحديث، اقرأ ملاحظات الإصدار أولًا — قد يرحّل التحديث مخطّط القاعدة —، وغيّر وسم الصورة في docker-compose.yml، ثم:
cd /opt/mlflow
docker compose pull && docker compose up -d
docker compose logs --tail 20التثبيت بنقرة واحدة مع ServOrbit
تثبّت «تطبيقات بنقرة واحدة» من ServOrbit تطبيق MLflow على خادمك دون سطر أوامر: ينشر الحاوية الرسمية، ويولّد كلمة مرور الحساب admin ومفتاح الجلسة، ويفعّل المصادقة على الواجهة والواجهة البرمجية، ويحصر أسماء المضيف المقبولة في عنوانك، وينشر الخادم عبر HTTPS على نطاق فرعي من نطاقك أو على النطاق الفرعي المجاني للخادم (mlflow.{dns_slug}.servorbit-dns.com). تظهر كلمة المرور في مساحة العميل، ولا يبقى إلا ربط دفاترك.