یکی از چالشهای ماندگار در مهندسی یادگیری ماشین، مشکل «روی سیستم من کار میکرد» است. برخلاف توسعه نرمافزار سنتی که ورودیهای ثابتی دارد، مدلهای یادگیری ماشین روی دادهها آموزش میبینند. وقتی داده تغییر میکند، مدل نیز تغییر میکند. بدون نسخهبندی و ردیابی دقیق، تیمها اغلب ساعتها را صرف دیباگ کردن میکنند تا بفهمند چرا مدلی که در تست عملکرد خوبی داشته، در محیط تولید شکست میخورد، یا چرا یک بهبود خاص در دقت قابل تکرار نیست. این مقاله یک گردش کار مستحکم با استفاده از کنترل نسخه داده (DVC) و MLflow برای ایجاد خطهای لولهی آموزش کاملاً قابل تکرار را بررسی میکند.
پایه و اساس: نسخهبندی داده با DVC
سیستمهای کنترل نسخه سنتی مانند Git برای فایلهای متنی بهینه شدهاند، نه برای مجموعههای داده بزرگ. کنترل نسخه داده (DVC) قابلیتهای Git را برای مدیریت فایلهای باینری بزرگ، مانند تصاویر، فایلهای CSV و خروجیهای مدل، گسترش میدهد. این کار با ذخیره هش فایلها در Git و نگه داشتن دادههای واقعی در یک مکان ذخیرهسازی از راه دور (مانند S3، GCS یا یک کش محلی) انجام میشود.
با یکپارچهسازی DVC در گردش کار خود، اطمینان حاصل میکنید که هر مدلی که آموزش میدهید با یک نسخهی خاص و غیرقابل تغییر از دادههای آموزشی مرتبط است. اگر کد خود را بهروزرسانی کنید اما بخواهید آن را با همان نسخهی دقیق دادهای که هفته پیش استفاده کردهاید مقایسه کنید، میتوانید به سادگی آن کامیت خاص داده را بررسی (check out) کنید.
# 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 از سلسلهمراتب آزمایشها مراقبت میکند. آموزش یک مدل شامل یک ماتریس پیچیده از هایپرپارامترها، نسخههای کد و متغیرهای محیطی است. MLflow یک رابط یکپارچه برای ردیابی این پارامترها، ثبت متریکها و ذخیره خروجیها (artifacts) ارائه میدهد.
در یک اسکریپت آموزشی استاندارد، منطق خود را در یک اجرای MLflow (run) قرار میدهید. این کار به شما امکان میدهد هایپرپارامترهای دقیق استفاده شده (مانند نرخ یادگیری، تعداد لایهها) را در کنار متریکهای عملکردی حاصل (مانند دقت، امتیاز F1) ثبت کنید. بهطور حیاتی، میتوانید این اجرای MLflow را با هش کامیت خاص 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
قدرت واقعی این استک در یکپارچهسازی مداوم (Continuous Integration) محقق میشود. وقتی یک توسعهدهنده کد را ارسال (push) میکند، سیستم CI شما میتواند بهطور خودکار خط لولهی DVC را اجرا کند تا از همگامسازی داده اطمینان حاصل شود و سپس آزمایشهای MLflow را فعال کند. اگر متریکهای مدل جدید در مقایسه با خط پایه (baseline) کاهش یابد، خط لوله میتواند بهطور خودکار بیلد را ناموفق نشان دهد. این رویکرد شیفت به چپ (shift-left) در تضمین کیفیت یادگیری ماشین، مشکلات را در مراحل اولیه چرخه توسعه شناسایی میکند.
نتیجهگیری
ساخت سیستمهای یادگیری ماشین قابل تکرار بیشتر از نوشتن کد تمیز نیاز دارد؛ این کار به زیرساختهای دقیق برای داده و آزمایشها نیاز دارد. با ترکیب DVC برای دسترسی قطعی به داده و MLflow برای ردیابی دقیق آزمایشها، حدس و گمان را از استقرار مدل حذف میکنید. این استک اطمینان حاصل میکند که هر نتیجهای که ادعا میکنید، توسط داده و کد قابل تأیید پشتیبانی میشود و اعتماد و قابلیت اطمینان را در عملیات یادگیری ماشین شما تقویت میکند.