MLOps/MLOps-এর ভিত্তি/Lesson 03
Model versioning
Train করা model file-এ save করা (joblib), সাথে metadata (version, metric, feature, hash), আর একটা ছোট model registry যেটা প্রতিটা নতুন model-কে version নম্বর দেয় আর production-এ কোনটা চলছে মনে রাখে।
- সময়
- 24 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
Training শেষ হলে model থাকে memory-তে। Program বন্ধ করলেই হারিয়ে যায়। তাই model-কে file-এ save করতে হয়, যাতে পরে, অন্য computer-এ বা server-এ load করা যায়।
কিন্তু শুধু file যথেষ্ট না। model_final_v2_NEW_use_this.joblib-এর মতো নাম থেকে কিছু বোঝা যায় না। Model versioning মানে:
- প্রতিটা model-এর একটা স্পষ্ট version নম্বর
- সাথে metadata: কোন data, কোন feature, কোন metric
- আর একটা registry, যেটা জানে কোন version এখন production-এ
কেন দরকার?
- Rollback: নতুন model খারাপ করলে আগেরটায় এক মুহূর্তে ফেরা যায়
- Audit: "এই loan কেন reject হলো?" কোন model সিদ্ধান্তটা নিয়েছিল, তা জানা যায়
- নিরাপত্তা: কেউ model file বদলে দিলে hash মিলিয়ে ধরা যায়
Save আর load: joblib
scikit-learn model save করার প্রচলিত উপায় হলো joblib:
Load করা model হুবহু আগের মতো কাজ করে। কিন্তু খেয়াল করো, prediction দিতে জানতে হচ্ছে feature কোনগুলো আর কোন ক্রমে। এই তথ্য file-এ নেই। তাই metadata লাগে।
Metadata
sha256 হলো file-এর আঙুলের ছাপ। File-এর একটা byte বদলালেও hash পুরো বদলে যায়। Load করার আগে hash মিলিয়ে নিলে নিশ্চিত হওয়া যায় যে file-টা ঠিক সেটাই যেটা register করা হয়েছিল।
Registry: version আর stage
registry/
index.json {"versions": [v1, v2, v3], "production": 2}
v1.joblib
v2.joblib ← এখন production
v3.joblib ← নতুন, পরীক্ষাধীন
নতুন model আসে, register হয়, যাচাই হয় (আগের lesson-এর deploy gate), তারপর promote হয়ে production-এ যায়। সমস্যা হলে আবার আগের version-কে promote করলেই rollback হয়ে যায়।
⚠️ Pickle-এর ঝুঁকি
joblib ভেতরে pickle ব্যবহার করে। অবিশ্বস্ত উৎসের pickle file load করলে যেকোনো code চলতে পারে। Internet থেকে নামানো model file কখনো অন্ধভাবে load করবে না। Deep learning-এ এজন্য safetensors format জনপ্রিয়: এটা শুধু সংখ্যা রাখে, code রাখে না।
Exercise
Exercise
Save আর load
students_clean.csv-এর study_hours আর attendance দিয়ে passed প্রেডিক্ট করতে একটা LogisticRegression() train করো, পুরো data দিয়ে।
- Model-টা
"model.joblib"-এ save করো (joblib.dump) - আবার load করে
loadedvariable-এ রাখো (joblib.load) - প্রথম ৫টা ছাত্রের জন্য
loaded-এর predictionpreds-এ রাখো
Quiz
Challenge
Challenge
একটা ছোট model registry
একটা folder-ভিত্তিক registry। registry/index.json file-এ সব version-এর তালিকা থাকবে:
{"versions": [{"version": 1, "file": "...", "sha256": "...", "metrics": {...}}, ...], "production": null বা version নম্বর}
তিনটা function লেখো:
register(model, metrics, root="registry")— model-কেroot/v{n}.joblib-এ save করবে।n= এখন পর্যন্ত যতগুলো version, তার পরেরটা (প্রথমটা 1)। File-এর sha256 hash (hex) সহ index-এ entry যোগ করবে, তারপরnreturn করবে। Folder বা index না থাকলে তৈরি করবে (শুরুতে productionNone)।promote(version, root="registry")—production-কে এই version বানাবে। Version না থাকলেValueError।load_production(root="registry")— production model load করবে। তার আগে file-এর hash index-এর সাথে মিলিয়ে দেখবে, আর না মিললেValueErrorraise করবে, কারণ file বদলে গেছে বা নষ্ট হয়েছে। Production না থাকলেওValueError।
বাস্তবে কোথায় ব্যবহার হয়?
MLflow Model Registry ঠিক তোমার challenge-এর কাজ করে, সাথে UI আর permission দেয়:
import mlflow
result = mlflow.register_model("runs:/<run_id>/model", "student-pass-predictor")
client = mlflow.MlflowClient()
client.set_registered_model_alias("student-pass-predictor", "production", result.version)
model = mlflow.pyfunc.load_model("models:/student-pass-predictor@production")
Hugging Face Hub-ও একধরনের registry। প্রতিটা model-এর git-এর মতো version history থাকে।
Interview প্রশ্ন
- Beginner: Model কীভাবে save আর load করবে?
- Intermediate: Model registry কী? Model-এর সাথে কোন metadata রাখবে?
- Advanced: Pickle-এর নিরাপত্তা ঝুঁকি কী? Production-এ model artifact-এর অখণ্ডতা (integrity) কীভাবে নিশ্চিত করবে?
এরপর কী?
Model version হলো। কিন্তু ৬ মাস পরে v2-কে আবার হুবহু বানাতে পারবে কি? একই data, একই code আর একই random seed লাগবে। পরের lesson: Reproducibility।