MLOps/MLOps-এর ভিত্তি/Lesson 04
Reproducibility
একই input দিলে একই model। Random seed, data-র hash, config-এর fingerprint, আর প্যাকেজের version pin করা। "আমার computer-এ তো চলে" সমস্যার সমাধান।
- সময়
- 22 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
Reproducibility মানে: একই data, একই code আর একই setting দিলে হুবহু একই model আর একই ফলাফল আসবে, আজ বা ছয় মাস পরে, তোমার computer-এ বা অন্য কারো।
শুনতে সহজ, কিন্তু ML-এ এটা সহজে ভাঙে:
"গতকাল ৮৩% পেয়েছিলাম, আজ একই code-এ ৭৯%" ← random seed
"আমার laptop-এ চলে, server-এ চলে না" ← library version
"কেউ data file আপডেট করেছিল?" ← data version
কেন দরকার?
- Debugging: ফলাফল প্রতিবার বদলালে বোঝা যায় না কোনটা bug আর কোনটা ভাগ্য
- তুলনা: নতুন feature কি আসলে সাহায্য করল, নাকি random split ভালো পড়েছে?
- Audit আর আইন: কিছু ক্ষেত্রে, যেমন ঋণ, স্বাস্থ্য বা বিমা, model-এর সিদ্ধান্ত ব্যাখ্যা আর পুনরায় তৈরি করতে হতে পারে
Reproducibility-র চার স্তম্ভ
| কী | কীভাবে নিশ্চিত করবে |
|---|---|
| Randomness | সব জায়গায় seed: random_state, np.random.default_rng(seed) |
| Data | Data file-এর hash রাখো, অথবা DVC দিয়ে version করো |
| Code ও config | Git commit + config file (hash সহ) |
| Environment | Library version pin (requirements.txt), Docker |
Seed: random-কে নিয়ন্ত্রণে আনা
Computer-এর "random" সংখ্যা আসলে একটা নির্দিষ্ট সূত্রে তৈরি হয়। Seed হলো সেই সূত্রের শুরুর বিন্দু।
একই seed দিলে একই ক্রম, আলাদা seed দিলে আলাদা ক্রম। কিন্তু seed fix করা মানে সমস্যা লুকিয়ে ফেলা না। এক seed-এ ভালো ফলাফল ভাগ্যও হতে পারে:
Model একই, শুধু কোন ছাত্র test-এ পড়ল সেটা বদলেছে। তাতেই accuracy প্রায় ৭২% থেকে ৮৪% পর্যন্ত ওঠানামা করে, std প্রায় ৩%। Test set ছোট (~১০০ জন) হলে এমনই হয়। তাই দুটো model তুলনা করার সময় এক seed-এর ০.৫% পার্থক্য দেখে সিদ্ধান্ত নেবে না।
Data-র fingerprint
Model-এর metadata-য় এই hash রাখলে পরে নিশ্চিত হওয়া যায় যে training ঠিক এই data-তেই হয়েছিল। একটা অক্ষর বদলালেও hash আলাদা হয়ে যায়।
Environment: library version
# requirements.txt
numpy==2.4.6
pandas==3.0.2
scikit-learn==1.8.0
== দিয়ে নির্দিষ্ট version pin করো। এর পরের ধাপ হলো Docker: পুরো operating system আর library সহ একটা image, যেটা যেকোনো জায়গায় হুবহু একইভাবে চলে (পরের module)।
Exercise
Exercise
Seed-এর শক্তি
split_accuracy(seed) লেখো। students_clean.csv থেকে X (study_hours, attendance) আর y (passed) নেবে, তারপর:
train_test_split(X, y, test_size=0.25, random_state=seed)DecisionTreeClassifier(max_depth=3, random_state=0)train- test accuracy return
তারপর same = একই seed (7) দিয়ে দুবার চালালে ফলাফল সমান কিনা (bool), আর spread = seed 0 থেকে 9 পর্যন্ত accuracy-র সর্বোচ্চ − সর্বনিম্ন।
Quiz
Challenge
Challenge
Run-এর fingerprint
একটা training run পুনরায় তৈরি করতে তিনটা জিনিস হুবহু একই হতে হবে: data, config আর code। fingerprint(data_path, config) লেখো:
- Data file-এর sha256 (hex), পুরো file byte হিসেবে পড়ে
- Config dict-এর sha256:
json.dumps(config, sort_keys=True)দিয়ে string বানিয়ে, UTF-8 encode করে hash। (sort_keysদিলে key-এর ক্রম আলাদা হলেও hash একই থাকে।) - Return:
{"data": data_hash, "config": config_hash, "run_id": ...}। এখানেrun_idহলোdata_hash + config_hashstring-এর sha256-এর প্রথম ১২ অক্ষর।
বাস্তবে কোথায় ব্যবহার হয়?
DVC (Data Version Control) git-এর মতো কাজ করে, কিন্তু বড় data file-এর জন্য:
dvc init
dvc add data/students.csv # data-র hash রাখে, file নিজে git-এ যায় না
git add data/students.csv.dvc .gitignore
git commit -m "students data v1"
dvc push # আসল file যায় S3/Drive-এর মতো storage-এ
পরে যেকোনো পুরনো commit checkout করে dvc pull দিলে ঠিক সেই সময়ের data ফিরে আসে। Code (git) আর data (DVC) একসাথে version হয়।
Interview প্রশ্ন
- Beginner: ML-এ reproducibility কেন গুরুত্বপূর্ণ? Random seed কী?
- Intermediate: একটা training run পুরোপুরি পুনরায় তৈরি করতে কী কী রেকর্ড রাখবে?
- Advanced: Seed fix করলেও GPU training-এ ফলাফল কেন মাঝে মাঝে আলাদা হয়? এটা কতটা নিয়ন্ত্রণ করা যায়?
এরপর কী?
🎉 MLOps-এর ভিত্তি module শেষ: lifecycle, experiment tracking, model versioning আর reproducibility।
পরের module: Model deployment। Model-কে একটা API হিসেবে চালু করা, Docker-এ প্যাক করা, আর CI/CD দিয়ে স্বয়ংক্রিয় deploy।