Data Engineering

أنابيب تعلم الآلة القابلة للتكرار باستخدام DVC وMLflow

يُعدّ أحد أكثر التحديات الدائمة في هندسة تعلم الآلة هو مشكلة "كان يعمل على جهازى". على عكس تطوير البرمجيات التقليدي، حيث تكون المدخلات ثابتة، يتم تدريب نماذج تعلم الآلة على البيانات. عندما تتغير تلك البيانات، تتغير النماذج. بدون إصدارات وتتبع صارمين، غالبًا ما تهدر الفرق ساعات في تصحيح الأخطاء لمعرفة سبب فشل نموذج كان يعمل بشكل جيد في الاختبار عند الانتقال إلى بيئة الإنتاج، أو سبب عدم إمكانية إعادة إنتاج تحسين محدد في الدقة. تستكشف هذه المقالة سير عمل قويًا باستخدام التحكم في إصدار البيانات (DVC) وMLflow لإنشاء أنابيب تدريب قابلة للتكرار بالكامل.

الأساس: إصدار البيانات باستخدام DVC

أنظمة التحكم في الإصدار التقليدية مثل Git مُحسّنة للملفات النصية، وليس مجموعات البيانات الكبيرة. يوسّع التحكم في إصدار البيانات (DVC) قدرات Git للتعامل مع الملفات الثنائية الكبيرة، مثل الصور وملفات CSV ومخرجات النماذج. يقوم بذلك عن طريق تخزين تجزئات الملفات (hashes) في Git مع إبقاء البيانات الفعلية في موقع تخزين بعيد (مثل S3 أو GCS أو ذاكرة تخزين مؤقت محلية).

من خلال دمج DVC في سير عملك، تضمن أن كل نموذج تدربه مرتبط بلقطة محددة وغير قابلة للتغيير من بيانات التدريب. إذا قمت بتحديث كودك لكنك تريد مقارنته بإصدار البيانات نفسه تمامًا الذي استخدمته الأسبوع الماضي، يمكنك ببساطة استرجاع (checkout) ذلك الإصدار المحدد من البيانات.

# Initialize DVC in your repository
dvc init
dvc add data/raw_dataset.csv

# Track changes in the data pipeline
dvc add data/processed_dataset.csv -m
dvc run -n train_model -d data/processed_dataset.csv -o model.pkl python train.py

تتبع التجارب باستخدام MLflow

بينما يتولى DVC تتبع نسب البيانات، يتولى MLflow تتبع نسب التجارب. يتضمن تدريب النموذج مصفوفة معقدة من المعلمات الفائقة (hyperparameters) وإصدارات الكود ومتغيرات البيئة. يوفر MLflow واجهة موحدة لتتبع هذه المعلمات وتسجيل المقاييس وتخزين المخرجات (artifacts).

في سكربت تدريب قياسي، تغلف منطقك بتشغيل (run) في MLflow. هذا يتيح لك تسجيل المعلمات الفائقة المستخدمة بالضبط (مثل معدل التعلم، عدد الطبقات) إلى جانب مقاييس الأداء الناتجة (مثل الدقة، درجة F1). والأهم من ذلك، يمكنك ربط هذا التشغيل في MLflow بتجزئة الإصدار (commit hash) المحددة في DVC، مما ينشئ مسار تدقيق كامل من البيانات إلى النتيجة.

import mlflow
import dvc
import sys

def main():
    # Get the current DVC commit hash for reproducibility
    dvc_commit = dvc.repo.Repo().index.state.state_id

    with mlflow.start_run():
        # Log parameters
        mlflow.log_param("dvc_commit", dvc_commit)
        mlflow.log_param("learning_rate", 0.01)
        
        # Train model
        model = train_model(data_path="data/processed_dataset.csv")
        
        # Log metrics
        accuracy = evaluate(model)
        mlflow.log_metric("accuracy", accuracy)
        
        # Log artifacts
        mlflow.log_artifact("model.pkl")

if __name__ == "__main__":
    main()

الدمج في خط التكامل والتسليم المستمر (CI/CD)

يتجلى القوة الحقيقية لهذه البنية في التكامل المستمر. عندما يدفع المطور الكود، يمكن لنظام CI الخاص بك تشغيل خط أنابيب DVC تلقائيًا للتأكد من مزامنة البيانات ثم تشغيل تجارب MLflow. إذا تدهورت مقاييس النموذج الجديد مقارنة بالخط الأساسي (baseline)، يمكن للخط أن يفشل البناء تلقائيًا. هذا النهج الذي يزيح الاختبار إلى المراحل المبكرة (shift-left) في ضمان جودة تعلم الآلة يلتقط المشكلات مبكرًا في دورة التطوير.

الخلاصة

بناء أنظمة تعلم آلة قابلة للتكرار يتطلب أكثر من مجرد كتابة كود نظيف؛ فهو يتطلب بنية تحتية صارمة للبيانات والتجارب. من خلال الجمع بين DVC للوصول الحتمي إلى البيانات وMLflow لتتبع التجارب الدقيق، تقضي على التخمين في نشر النماذج. تضمن هذه البنية أن أي نتيجة تدّعيها مدعومة ببيانات وكود قابلين للتحقق، مما يعزز الثقة والموثوقية في عمليات تعلم الآلة الخاصة بك.

Share: