Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind
Lernende entwerfen eine Namenskonvention mit Trainingsdatum, Datensatzversion und Metrikwert und schreiben eine JSON-Metadatendatei zur Nachvollziehbarkeit.
Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind ist eine kostenlose Machine Learning Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Machine Learning Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Machine Learning Academy-Kurs umfasst insgesamt 4 Lektionen.
Das Problem ohne Versionsverwaltung
Ohne eine disziplinierte Strategie für die Versionsverwaltung sammeln sich in Teams schnell Dateien wie model.pkl, model_v2.pkl, model_final.pkl und model_FINAL_v2.pkl an, ohne dass festgehalten wird, mit welchen Daten sie trainiert wurden, welche Metrik sie erreicht haben oder welches Modell tatsächlich in der Produktion läuft. Dieses Chaos führt dazu, dass veraltete Modelle bereitgestellt werden, der beste Checkpoint verloren geht oder ein früheres Ergebnis zur Fehleranalyse nicht reproduziert werden kann.
Was im Dateinamen festgehalten werden sollte
Ein guter Modellname sollte genügend Kontext enthalten, um selbsterklärend zu sein: Dataset, Algorithmus, Datum und optional die primäre Metrik sowie die Dataset-Version oder der Git-SHA. Dadurch wird der Ordner des Modellregisters auf einen Blick zu einem lesbaren Prüfpfad, ohne dass jede Datei geöffnet werden muss.
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))Die JSON-Metadaten-Begleitdatei
Zu jeder Modelldatei sollte eine zugehörige JSON-Begleitdatei mit demselben Stammnamen vorhanden sein. Die Begleitdatei dokumentiert alles, was der Dateiname nicht enthalten kann: Bibliotheksversionen, Hyperparameter, Größe des Trainingssets, Testleistung anhand aller Metriken, Feature-Liste und Hinweise zum Trainingslauf. Dies ist die kleinstmögliche vollständige model card.
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'
)Versionsverwaltung des Datasets
Auch das Trainingsdataset selbst muss versioniert werden. Ein Modell, das mit data_v1.csv trainiert wurde, und ein anderes, das mit data_v2.csv trainiert wurde, dürfen niemals dieselbe Modellkennung besitzen. Möglichkeiten zur Dataset-Versionierung sind: einen Git-SHA der Datendatei speichern, einen MD5-/SHA256-Hash der CSV-Datei festhalten oder ein Datenversionswerkzeug wie DVC (Data Version Control) verwenden, das die Herkunft von Datasets genauso verwaltet wie Git den Quellcode.
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)Semantische Versionierung für Modelle
Übernehmen Sie ein Konzept aus der Softwareentwicklung: Verwenden Sie semantische Versionierung (MAJOR.MINOR.PATCH) für Modelle. MAJOR: inkompatible Änderung (anderer Feature-Satz oder inkompatibles Schema). MINOR: Leistungsverbesserung bei unveränderter API. PATCH: Fehlerbehebung oder geringfügige Neukalibrierung. Diese Konvention hilft nachgelagerten Nutzern, die Auswirkungen einer Aktualisierung ihrer Modellabhängigkeit zu verstehen.
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']}")Ein einfaches lokales Modellregister
Ein schlankes Modellregister kann aus einem Verzeichnis mit einer Datei registry.json bestehen, die alle gespeicherten Modelle indiziert. Jeder Eintrag enthält den Dateinamen, die Version, wichtige Metriken und das Produktionskennzeichen. Das Bereitstellungsskript liest diese Datei, um zu bestimmen, welches Modell geladen werden soll.
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)Das Produktionsmodell aus dem Register lesen
Zur Inferenz lädt der Dienst das Register, sucht das als Produktionsmodell gekennzeichnete Modell und lädt anschließend genau diese Datei. Dadurch wird das Bereitstellungsskript von fest codierten Dateinamen entkoppelt — zur Aktualisierung des Produktionsmodells muss lediglich das Kennzeichen im Register geändert werden, nicht der Code für die Bereitstellung.
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: professionelles Modellregister
MLflow ist das branchenübliche Werkzeug für Experiment-Tracking und Modellregister. Es protokolliert Parameter, Metriken und Artefakte für jeden Trainingslauf, ermöglicht den Vergleich von Läufen über eine Benutzeroberfläche und stellt ein Modellregister mit den Zuständen Staging/Produktion/Archiviert bereit. Für Teams ersetzt MLflow manuelle JSON-Register durch ein robustes, abfragbares Backend.
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')Modellversionen mit Tags versehen
Tags fügen einer Modellversion frei definierbare Schlüssel-Wert-Anmerkungen hinzu — beispielsweise zum Festhalten des Experimentkontexts, des Namens der Analystin oder des Analysten, des Aufgabentyps oder der Frage, ob das Modell eine Fairness-Prüfung bestanden hat. Tags können abgefragt werden, sodass sich das Register einfach nach jedem beliebigen Attribut filtern lässt.
# 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))Automatisierte Kriterien für die Beförderung
Definieren Sie klare Beförderungskriterien, bevor ein Modell in die Produktion gelangt: Das neue Modell muss eine AUC-Verbesserung von mindestens X % erreichen, eine Fairness-Prüfung bestehen, darf sich bei keinem überwachten demografischen Teilbereich verschlechtern und muss die Inferenz innerhalb von Y Millisekunden abschließen. Werden diese Kriterien im Code statt in der Dokumentation festgelegt, kann eine CI/CD-Pipeline Beförderungsentscheidungen objektiv automatisieren.
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}')Model Cards und Dokumentation
Über technische Metadaten hinaus dokumentiert eine model card (ein von Google geprägter Begriff) den vorgesehenen Einsatzzweck des Modells, seine Einschränkungen, die Eigenschaften der Trainingsdaten, die Leistung in demografischen Untergruppen und ethische Aspekte. Für Modelle, die folgenreiche Entscheidungen treffen (Kreditgenehmigungen, medizinische Triage), werden Model Cards zunehmend zu einer regulatorischen Anforderung. Nehmen Sie mindestens den vorgesehenen Einsatzzweck, nicht vorgesehene Einsatzbereiche, Leistungsmetriken und bekannte Fehlermuster auf.
Schnelltest
Testen Sie Ihr Verständnis der Modellversionierung und Metadaten aus dieser Lektion.
Zusammenfassung der Lektion
In dieser Lektion haben Sie gelernt: beschreibende Dateinamen mit Dataset, Algorithmus, Datum und Metrik machen Ihr Modellverzeichnis selbstdokumentierend, JSON-Metadaten-Begleitdateien halten Bibliotheksversionen, Hyperparameter und für Governance und Reproduzierbarkeit erforderliche Metriken fest, und ein Modellregister (lokal als JSON oder mit MLflow) entkoppelt den Code für die Bereitstellung von fest codierten Dateinamen. Als Nächstes verpacken wir ein gespeichertes Modell in einen FastAPI-Endpunkt, um Vorhersagen über HTTP bereitzustellen.
Lerne Python mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 30
- Lektionen
- 120
Häufig gestellte Fragen
Ist die Lektion „Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind“ kostenlos?
Ja — der vollständige Text von „Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Machine Learning Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Machine Learning Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind“?
Lernende entwerfen eine Namenskonvention mit Trainingsdatum, Datensatzversion und Metrikwert und schreiben eine JSON-Metadatendatei zur Nachvollziehbarkeit. Du übst Machine Learning Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Machine Learning Academy zu starten?
Keine Vorkenntnisse erforderlich. Machine Learning Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Machine Learning Academy-Lektion Code schreiben und ausführen?
Ja. Jede Machine Learning Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Modelle mit joblib und pickle speichern
- Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind
- Vorhersagen mit einem FastAPI-Endpunkt bereitstellen
- Vorhersagen überwachen: Ein- und Ausgaben protokollieren