การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ
ผู้เรียนจะออกแบบหลักเกณฑ์การตั้งชื่อที่ฝังวันที่ฝึก เวอร์ชันชุดข้อมูล และคะแนนตัวชี้วัดไว้ในชื่อ พร้อมเขียนข้อมูลกำกับประกอบในไฟล์ JSON เพื่อการกำกับดูแล
การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ เป็นบทเรียน Machine Learning Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Machine Learning Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาเมื่อไม่มีการจัดการเวอร์ชัน
หากไม่มีกลยุทธ์การจัดการเวอร์ชันที่เป็นระบบ ทีมจะสะสมไฟล์ model.pkl, model_v2.pkl, model_final.pkl, model_FINAL_v2.pkl อย่างรวดเร็ว โดยไม่มีข้อมูลว่าแต่ละไฟล์ฝึกด้วยข้อมูลใด ได้ตัวชี้วัดเท่าใด หรือไฟล์ใดกำลังทำงานอยู่จริง ระบบที่ยุ่งเหยิงเช่นนี้นำไปสู่การนำโมเดลเก่าไปใช้งาน การสูญเสียจุดตรวจสอบที่ดีที่สุด หรือการไม่สามารถทำซ้ำผลลัพธ์ในอดีตเพื่อแก้ไขข้อบกพร่องได้
สิ่งที่ควรเข้ารหัสไว้ในชื่อไฟล์
ชื่อไฟล์โมเดลที่ดีควรเข้ารหัสบริบทให้เพียงพอจนสามารถอธิบายตัวเองได้ ได้แก่ ชุดข้อมูล อัลกอริทึม วันที่ และอาจรวมถึง ตัวชี้วัดหลัก และ เวอร์ชันชุดข้อมูลหรือ Git SHA ด้วย วิธีนี้ทำให้โฟลเดอร์ทะเบียนโมเดลเป็นบันทึกการตรวจสอบที่อ่านเข้าใจได้ทันที โดยไม่ต้องเปิดดูทีละไฟล์
from datetime import date
def model_filename(dataset, algorithm, metric_name, metric_value,
data_version='v1', ext='joblib'):
today = date.today().strftime('%Y%m%d')
metric_str = f'{metric_name}{int(metric_value * 100)}'
return f'{dataset}__{algorithm}__{today}__dv{data_version}__{metric_str}.{ext}'
# Examples
print(model_filename('titanic', 'rf', 'acc', 0.834, data_version='2'))
print(model_filename('fraud', 'xgb', 'auc', 0.971))
print(model_filename('cancer', 'logreg', 'f1', 0.955))ไฟล์ข้อมูลเมตาประกอบแบบ JSON
ไฟล์โมเดลทุกไฟล์ควรมี ไฟล์ข้อมูลเมตาประกอบแบบ JSON อยู่คู่กัน โดยใช้ชื่อหลักเดียวกัน ไฟล์ประกอบนี้จะบันทึกข้อมูลทุกอย่างที่ชื่อไฟล์ไม่สามารถระบุได้ เช่น เวอร์ชันของไลบรารี ไฮเปอร์พารามิเตอร์ ขนาดชุดฝึก ประสิทธิภาพของชุดทดสอบในทุกตัวชี้วัด รายการคุณลักษณะ และบันทึกเกี่ยวกับการฝึกครั้งนั้น นี่คือ การ์ดโมเดลขั้นต่ำที่ใช้งานได้
import json
import sklearn, sys
from datetime import datetime
def save_metadata(path, dataset, algorithm, params, metrics, features, notes=''):
meta = {
'model_path': path,
'dataset': dataset,
'algorithm': algorithm,
'hyperparameters': params,
'metrics': metrics,
'features': features,
'sklearn_version': sklearn.__version__,
'python_version': sys.version.split()[0],
'trained_at': datetime.utcnow().isoformat(),
'notes': notes
}
meta_path = path.replace('.joblib', '_metadata.json')
with open(meta_path, 'w') as f:
json.dump(meta, f, indent=2)
print('Metadata saved to:', meta_path)
return meta
# Usage example
save_metadata(
'/tmp/cancer__logreg__20260620__dv1__acc97.joblib',
dataset='breast_cancer', algorithm='LogisticRegression',
params={'C': 1.0, 'max_iter': 300},
metrics={'accuracy': 0.9789, 'roc_auc': 0.9941, 'f1': 0.9831},
features=['mean radius', 'mean texture', '... 30 total'],
notes='Trained on full UCI breast cancer dataset'
)การติดตามเวอร์ชันชุดข้อมูล
ชุดข้อมูลฝึกเองก็ต้องมีการจัดการเวอร์ชันด้วย โมเดลที่ฝึกจาก data_v1.csv และโมเดลที่ฝึกจาก data_v2.csv ไม่ควรมีตัวระบุโมเดลเดียวกันโดยเด็ดขาด ตัวเลือกสำหรับจัดการเวอร์ชันชุดข้อมูล ได้แก่ จัดเก็บ Git SHA ของไฟล์ข้อมูล บันทึกค่าแฮช MD5/SHA256 ของ CSV หรือใช้เครื่องมือจัดการเวอร์ชันข้อมูลอย่าง DVC (Data Version Control) ซึ่งจัดการสายที่มาของชุดข้อมูลในลักษณะเดียวกับที่ Git จัดการโค้ด
import hashlib
def file_hash(path, algo='sha256'):
h = hashlib.new(algo)
with open(path, 'rb') as f:
for chunk in iter(lambda: f.read(65536), b''):
h.update(chunk)
return h.hexdigest()[:12] # first 12 hex chars as short ID
# Example: hash the model file itself as a unique ID
model_path = '/tmp/cancer_model.joblib'
model_hash = file_hash(model_path)
print('Model hash (short):', model_hash)การกำหนดเวอร์ชันเชิงความหมายสำหรับโมเดล
ยืมแนวคิดจากวิศวกรรมซอฟต์แวร์มาใช้ โดยกำหนด การกำหนดเวอร์ชันเชิงความหมาย (MAJOR.MINOR.PATCH) ให้กับโมเดล MAJOR: การเปลี่ยนแปลงที่ทำให้ใช้ร่วมกันไม่ได้ เช่น ชุดคุณลักษณะต่างไปหรือโครงสร้างข้อมูลไม่เข้ากัน MINOR: การปรับปรุงประสิทธิภาพโดยยังใช้ API เดิม PATCH: การแก้ข้อบกพร่องหรือการปรับเทียบเล็กน้อย หลักการนี้ช่วยให้ผู้ใช้ปลายทางเข้าใจผลกระทบจากการอัปเดตการพึ่งพาโมเดลได้
model_registry = [
{'version': '1.0.0', 'algorithm': 'LogisticRegression', 'auc': 0.921,
'note': 'Initial production model'},
{'version': '1.1.0', 'algorithm': 'LogisticRegression', 'auc': 0.935,
'note': 'Retrained on 3 months more data'},
{'version': '2.0.0', 'algorithm': 'XGBoost', 'auc': 0.971,
'note': 'New algorithm; feature set changed — incompatible schema'}
]
print('Model Registry:')
for entry in model_registry:
print(f" v{entry['version']} AUC={entry['auc']} {entry['note']}")ทะเบียนโมเดลภายในเครื่องแบบง่าย
ทะเบียนโมเดลแบบน้ำหนักเบาอาจเป็นเพียงไดเรกทอรีที่มีไฟล์ registry.json สำหรับจัดทำดัชนีโมเดลที่บันทึกไว้ทั้งหมด แต่ละรายการจะบันทึกชื่อไฟล์ เวอร์ชัน ตัวชี้วัดสำคัญ และสถานะว่าเป็นโมเดลสำหรับใช้งานจริงหรือไม่ สคริปต์นำไปใช้งานจะอ่านไฟล์นี้เพื่อกำหนดว่าจะโหลดโมเดลใด
import json
import os
REGISTRY_PATH = '/tmp/model_registry.json'
def register_model(filename, version, metrics, is_production=False):
try:
with open(REGISTRY_PATH) as f:
registry = json.load(f)
except FileNotFoundError:
registry = []
# Mark all as not-production if this one is production
if is_production:
for entry in registry:
entry['is_production'] = False
registry.append({
'filename': filename,
'version': version,
'metrics': metrics,
'is_production': is_production
})
with open(REGISTRY_PATH, 'w') as f:
json.dump(registry, f, indent=2)
print(f'Registered v{version} (production={is_production})')
register_model('cancer__logreg__v1.0.0.joblib', '1.0.0',
{'accuracy': 0.979, 'auc': 0.994}, is_production=True)การอ่านโมเดลสำหรับใช้งานจริงจากทะเบียน
ขณะอนุมาน บริการจะโหลดทะเบียนและค้นหาโมเดลที่ระบุว่าเป็นโมเดลสำหรับใช้งานจริง จากนั้นจึงโหลดไฟล์นั้นโดยเฉพาะ วิธีนี้แยกสคริปต์นำไปใช้งานออกจากชื่อไฟล์ที่เขียนตายตัว การเปลี่ยนโมเดลสำหรับใช้งานจริงจึงทำได้เพียงอัปเดตสถานะในทะเบียน โดยไม่ต้องแก้โค้ดให้บริการ
import json
import joblib
def load_production_model(registry_path, model_dir='/tmp'):
with open(registry_path) as f:
registry = json.load(f)
prod = next((r for r in registry if r['is_production']), None)
if prod is None:
raise RuntimeError('No production model registered!')
path = f'{model_dir}/{prod["filename"]}'
print(f'Loading production model: {prod["filename"]} (v{prod["version"]})')
print(f'Metrics: {prod["metrics"]}')
# return joblib.load(path) # would load for real
return None # demo
load_production_model('/tmp/model_registry.json')MLflow: ทะเบียนโมเดลระดับมืออาชีพ
MLflow เป็นเครื่องมือมาตรฐานอุตสาหกรรมสำหรับติดตามการทดลองและจัดการทะเบียนโมเดล โดยบันทึกพารามิเตอร์ ตัวชี้วัด และอาร์ติแฟกต์ของการฝึกแต่ละครั้ง เปิดให้เปรียบเทียบการฝึกผ่านส่วนติดต่อผู้ใช้ และมีทะเบียนโมเดลที่รองรับสถานะเตรียมใช้งาน/ใช้งานจริง/เก็บถาวร สำหรับทีม MLflow ช่วยแทนที่ทะเบียน JSON แบบทำเองด้วยแบ็กเอนด์ที่มีความทนทานและสามารถสืบค้นได้
import mlflow
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = load_iris(return_X_y=True)
with mlflow.start_run(run_name='logreg_iris_v1'):
model = LogisticRegression(C=1.0, max_iter=200)
cv_score = cross_val_score(model, X, y, cv=5).mean()
mlflow.log_param('C', 1.0)
mlflow.log_param('max_iter', 200)
mlflow.log_metric('cv_accuracy', cv_score)
model.fit(X, y)
mlflow.sklearn.log_model(model, 'model')
print(f'CV Accuracy: {cv_score:.4f}')
print('Run logged to MLflow')การติดแท็กเวอร์ชันโมเดล
แท็กช่วยเพิ่มคำอธิบายแบบคู่คีย์-ค่าให้กับเวอร์ชันโมเดล โดยเหมาะสำหรับบันทึกบริบทของการทดลอง ชื่อนักวิเคราะห์ ประเภทงาน หรือระบุว่าโมเดลผ่านการตรวจสอบความเป็นธรรมหรือไม่ แท็กสามารถสืบค้นได้ จึงกรองทะเบียนตามคุณลักษณะใด ๆ ได้ง่าย
# Simulated registry entry with tags (no MLflow required)
model_entry = {
'version': '2.1.0',
'filename': 'fraud__xgb__2.1.0.joblib',
'tags': {
'analyst': 'data-science-team',
'task': 'binary-classification',
'fairness_audit': 'passed',
'retrain_trigger': 'monthly-schedule',
'deployment_region': 'eu-west-1'
},
'metrics': {'roc_auc': 0.971, 'precision': 0.83, 'recall': 0.79}
}
print('Model entry:')
print(json.dumps(model_entry, indent=2))เกณฑ์การเลื่อนสถานะโดยอัตโนมัติ
กำหนด เกณฑ์การเลื่อนสถานะ ให้ชัดเจนก่อนนำโมเดลใด ๆ ไปใช้งานจริง: โมเดลใหม่ต้องเพิ่มค่า AUC ได้อย่างน้อย X% ต้องผ่านการตรวจสอบความเป็นธรรม ต้องไม่ทำให้ประสิทธิภาพลดลงในกลุ่มประชากรย่อยใด ๆ ที่ติดตามอยู่ และต้องอนุมานเสร็จภายใน Y มิลลิวินาที การเข้ารหัสเกณฑ์เหล่านี้ไว้ในโค้ดแทนเอกสาร ทำให้ pipeline ของ CI/CD สามารถตัดสินใจเลื่อนสถานะได้โดยอัตโนมัติและเป็นกลาง
def should_promote(new_metrics, baseline_metrics, min_auc_improvement=0.005):
if new_metrics['auc'] < baseline_metrics['auc'] + min_auc_improvement:
return False, 'AUC improvement too small'
if new_metrics.get('fairness_delta', 0) > 0.05:
return False, 'Fairness constraint violated'
if new_metrics.get('latency_ms', 0) > 100:
return False, 'Latency too high'
return True, 'All criteria met'
baseline = {'auc': 0.921}
candidate = {'auc': 0.937, 'fairness_delta': 0.02, 'latency_ms': 45}
promote, reason = should_promote(candidate, baseline)
print(f'Promote: {promote} — {reason}')การ์ดโมเดลและเอกสารประกอบ
นอกเหนือจากข้อมูลเมตาทางเทคนิคแล้ว การ์ดโมเดล (คำที่ Google เป็นผู้บัญญัติ) ยังบันทึกวัตถุประสงค์การใช้งาน ข้อจำกัด ลักษณะของข้อมูลฝึก ประสิทธิภาพในกลุ่มประชากรย่อย และข้อพิจารณาด้านจริยธรรมของโมเดล สำหรับโมเดลที่ใช้ตัดสินใจเรื่องสำคัญ เช่น การอนุมัติสินเชื่อหรือการคัดแยกผู้ป่วย การ์ดโมเดลกำลังกลายเป็นข้อกำหนดตามกฎระเบียบ อย่างน้อยควรระบุวัตถุประสงค์การใช้งาน การใช้งานที่อยู่นอกขอบเขต ตัวชี้วัดประสิทธิภาพ และรูปแบบความล้มเหลวที่ทราบ
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการจัดการเวอร์ชันโมเดลและข้อมูลเมตาจากบทเรียนนี้
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า ชื่อไฟล์ที่สื่อความหมายและฝังข้อมูลชุดข้อมูล อัลกอริทึม วันที่ และตัวชี้วัด ทำให้ไดเรกทอรีโมเดลอธิบายตัวเองได้ ไฟล์ข้อมูลเมตาประกอบแบบ JSON บันทึกเวอร์ชันของไลบรารี ไฮเปอร์พารามิเตอร์ และตัวชี้วัด ที่จำเป็นต่อการกำกับดูแลและการทำซ้ำผลลัพธ์ และ ทะเบียนโมเดล (JSON ภายในเครื่องหรือ MLflow) ช่วยแยกโค้ดให้บริการออกจากชื่อไฟล์ที่เขียนตายตัว บทถัดไป เราจะห่อโมเดลที่บันทึกไว้ด้วยจุดปลายทาง FastAPI เพื่อให้บริการผลการทำนายผ่าน HTTP
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Machine Learning Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ”
ผู้เรียนจะออกแบบหลักเกณฑ์การตั้งชื่อที่ฝังวันที่ฝึก เวอร์ชันชุดข้อมูล และคะแนนตัวชี้วัดไว้ในชื่อ พร้อมเขียนข้อมูลกำกับประกอบในไฟล์ JSON เพื่อการกำกับดูแล คุณปฏิบัติ Machine Learning Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Machine Learning Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Machine Learning Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Machine Learning Academy นี้ได้ไหม
ได้ บทเรียน Machine Learning Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การบันทึกแบบจำลองด้วย joblib และ pickle
- การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ
- การให้บริการการทำนายด้วยปลายทาง FastAPI
- การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก