Machine Learning Academy · Lektion

Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind

Lernende entwerfen eine Namenskonvention mit Trainingsdatum, Datensatzversion und Metrikwert und schreiben eine JSON-Metadatendatei zur Nachvollziehbarkeit.

Lektion 2 von 413 Schritte

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.

Kostenlos starten

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

  1. Modelle mit joblib und pickle speichern
  2. Modelle versionieren: Warum Dateinamen und Metadaten wichtig sind
  3. Vorhersagen mit einem FastAPI-Endpunkt bereitstellen
  4. Vorhersagen überwachen: Ein- und Ausgaben protokollieren
← Zurück zu Machine Learning Academy