Model Versioning
Die systematische Verwaltung verschiedener Versionen von ML-Modellen – inklusive Gewichte, Hyperparameter, Trainingsdaten und Metriken für Reproduzierbarkeit.
Die Fähigkeit, ML-Experimente und Modelle exakt zu reproduzieren – gleiche Daten, gleicher Code, gleiche Ergebnisse. Grundprinzip für wissenschaftliche und produktive ML-Arbeit.
Reproducibility bedeutet: Wenn du ein ML-Experiment wiederholst, bekommst du exakt dieselben Ergebnisse. Das klingt selbstverständlich, ist aber in der Praxis überraschend schwer.
Warum ist das schwer?
Experiment am Montag:
- Daten: train.csv (Version?)
- Code: model.py (welcher Commit?)
- Libraries: torch (welche Version?)
- Random Seed: (gesetzt?)
- GPU: (deterministisch?)
→ Accuracy: 94.5%
Experiment am Freitag:
- "Dieselben" Inputs
→ Accuracy: 93.8% ← Warum anders?!
Was muss versioniert werden?
| Komponente | Beispiel | Tool |
|---|---|---|
| Code | model.py, train.py | Git |
| Daten | train.csv, test.csv | DVC, Git LFS |
| Config | hyperparameters.yaml | Git |
| Environment | Python 3.11, torch 2.2 | Docker, pip freeze |
| Random State | seed=42 | Im Code setzen |
import random
import numpy as np
import torch
def set_seed(seed: int = 42):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
# Für volle Determinismus (langsamer)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.use_deterministic_algorithms(True)
set_seed(42)
# requirements.txt mit exakten Versionen
pip freeze > requirements.txt
# Oder mit pip-tools
pip-compile requirements.in --generate-hashes
# requirements.txt
torch==2.2.0
transformers==4.38.0
numpy==1.26.4
scikit-learn==1.4.0
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Reproduzierbar: Gleicher Container = Gleiche Umgebung
CMD ["python", "train.py"]
# dvc.yaml
stages:
preprocess:
cmd: python preprocess.py
deps:
- data/raw/
- preprocess.py
outs:
- data/processed/
train:
cmd: python train.py
deps:
- data/processed/
- train.py
- config.yaml
params:
- config.yaml:
outs:
- models/model.pkl
metrics:
- metrics.json:
cache: false
# Pipeline reproduzieren
dvc repro
# Zu alter Version zurück
git checkout v1.0
dvc checkout
dvc repro
import mlflow
mlflow.set_experiment("fraud_detection")
with mlflow.start_run():
# Config loggen
mlflow.log_params({
"learning_rate": 0.001,
"epochs": 10,
"batch_size": 32,
"seed": 42
})
# Code-Version
mlflow.log_param("git_commit", get_git_commit())
# Daten-Hash
mlflow.log_param("data_hash", hash_file("train.csv"))
# Training
model = train(...)
# Metriken
mlflow.log_metrics({"accuracy": 0.95, "f1": 0.93})
# Modell
mlflow.sklearn.log_model(model, "model")
Reproducibility ist wie ein Kochrezept mit exakten Mengenangaben: Wenn du dieselben Zutaten in derselben Menge verwendest, sollte das Gericht jedes Mal gleich schmecken – nicht 'ungefähr ähnlich'.
Gleiche Daten + Code + Config = Gleiche Ergebnisse
Erfordert Versionierung von Daten, Code und Umgebung
Random Seeds, deterministische Operationen, Dependency Pinning
Wissenschaftliche Validierung
Andere können deine Ergebnisse verifizieren
Debugging
Probleme reproduzieren um sie zu fixen
Sicherheit
Audit-Anforderungen erfüllen
Teamarbeit
Kollegen können deine Experimente nachvollziehen
Zufälligkeit (Random Seeds), GPU-Nondeterminismus, unterschiedliche Library-Versionen, fehlende Daten-Versionierung, undokumentierte Preprocessing-Schritte.
Schwierig. CUDA-Operationen sind oft nondeterministisch für Performance. PyTorch bietet torch.use_deterministic_algorithms(True), aber mit Performance-Einbußen.
Reproducibility: Gleiche Daten, gleicher Code → gleiche Ergebnisse. Replicability: Neue Daten, gleiche Methode → ähnliche Ergebnisse. Beides wichtig, aber unterschiedlich.