Machine Learning Academy · leksjon

Versjonere modeller: Hvorfor filnavn og metadata er viktige

Deltakere vil utforme en navnekonvensjon som inkluderer treningsdato, datasettversjon og måltall, og skrive en JSON-sidefil med metadata for styring.

Leksjon 2 av 413 trinn

Versjonere modeller: Hvorfor filnavn og metadata er viktige er en gratis leksjon i Machine Learning Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Machine Learning Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Machine Learning Academy inneholder totalt 4 leksjoner.

Problemet uten versjonering

Uten en disiplinert strategi for versjonering samler team raskt opp filer som model.pkl, model_v2.pkl, model_final.pkl og model_FINAL_v2.pkl, uten informasjon om hvilke data hver modell ble trent på, hvilken metrikk den oppnådde, eller hvilken modell som faktisk kjører i produksjon. Dette kaoset fører til at utdaterte modeller settes i produksjon, at det beste kontrollpunktet går tapt, eller at det blir umulig å gjenskape et tidligere resultat for feilsøking.

Hva som bør kodes inn i filnavnet

Et godt modellfilnavn bør inneholde nok kontekst til å være selvforklarende: datasett, algoritme, dato og eventuelt den primære metrikken og datasettversjonen eller git SHA. Da blir mappen for modellregisteret et lettlest revisjonsspor ved første øyekast, uten at De må åpne hver fil.

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-filen ved siden av modellen

Hver modellfil bør ha en tilhørende JSON-sidefil med samme grunnnavn. Sidefilen dokumenterer alt filnavnet ikke kan inneholde: bibliotekversjoner, hyperparametere, størrelsen på treningssettet, ytelsen på testsettet for alle metrikker, funksjonslisten og eventuelle merknader om treningskjøringen. Dette er det minste brukbare modellkortet.

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'
)

Sporing av datasettversjoner

Selve treningsdatasettet må også versjoneres. En modell som er trent på data_v1.csv, og en annen som er trent på data_v2.csv, bør aldri ha samme modellidentifikator. Mulige metoder for datasettversjonering er å lagre en Git SHA for datafilen, registrere en MD5-/SHA256-hash av CSV-filen eller bruke et verktøy for dataversjonering, som DVC (Data Version Control), som håndterer datasettets opphav på samme måte som Git håndterer kode.

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)

Semantisk versjonering av modeller

Hent inspirasjon fra programvareutvikling: bruk semantisk versjonering (MAJOR.MINOR.PATCH) for modeller. MAJOR: brytende endring (annet funksjonssett eller inkompatibelt skjema). MINOR: ytelsesforbedring med samme API. PATCH: feilretting eller mindre rek kalibrering. Denne konvensjonen hjelper nedstrømsbrukere med å forstå konsekvensene av å oppdatere avhengigheten til modellen.

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']}")

Et enkelt lokalt modellregister

Et enkelt modellregister kan være en mappe med en registry.json-fil som indekserer alle lagrede modeller. Hver oppføring registrerer filnavnet, versjonen, nøkkelmetrikker og produksjonsflagget. Distribusjonsskriptet leser denne filen for å avgjøre hvilken modell som skal lastes inn.

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)

Lese produksjonsmodellen fra registeret

Ved inferens laster tjenesten inn registeret og finner modellen som er merket som produksjonsmodell, før den laster inn den aktuelle filen. Dette kobler distribusjonsskriptet fra hardkodede filnavn — å oppdatere produksjonsmodellen krever bare at registerflagget oppdateres, ikke at serveringskoden endres.

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: Profesjonelt modellregister

MLflow er bransjestandardverktøyet for eksperimentsporing og modellregistre. Det logger parametere, metrikker og artefakter for hver treningskjøring, lar Dem sammenligne kjøringer i et brukergrensesnitt og tilbyr et modellregister med tilstandene staging, production og archived. For team erstatter MLflow manuelle JSON-registre med en robust backend som kan spørres.

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')

Merking av modellversjoner

Tagger legger til fritt utformede nøkkel-verdi-merknader for en modellversjon — nyttig for å registrere eksperimentkontekst, analytikerens navn, oppgavetype eller om modellen besto en rettferdighetsrevisjon. Tagger kan brukes i spørringer, slik at det blir enkelt å filtrere registeret etter et hvilket som helst attributt.

# 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))

Automatiserte kriterier for promotering

Definer tydelige promoteringskriterier før en modell settes i produksjon: Den nye modellen må oppnå minst X % forbedring i AUC, bestå en rettferdighetssjekk, ikke gi dårligere resultater for noen overvåket demografisk delgruppe og fullføre inferens innen Y millisekunder. Når disse kriteriene kodes inn (og ikke bare dokumenteres), kan en CI/CD-pipeline automatisere promoteringsbeslutninger på en objektiv måte.

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}')

Modellkort og dokumentasjon

Et modellkort (et begrep lansert av Google) dokumenterer mer enn tekniske metadata: modellens tiltenkte bruk, begrensninger, egenskaper ved treningsdataene, ytelse på tvers av demografiske undergrupper og etiske hensyn. For modeller som tar beslutninger med store konsekvenser (godkjenning av lån, medisinsk triage) blir modellkort stadig oftere et regulatorisk krav. Ta som minimum med: tiltenkt bruk, bruk utenfor omfanget, ytelsesmetrikker og kjente feilmønstre.

Rask kontroll

Test forståelsen Deres av modellversjonering og metadata fra denne leksjonen.

Oppsummering av leksjonen

I denne leksjonen har De lært at beskrivende filnavn som inneholder datasett, algoritme, dato og metrikk gjør modellmappen selvforklarende, at JSON-sidefiler med metadata registrerer bibliotekversjoner, hyperparametere og metrikker som trengs for styring og reproduserbarhet, og at et modellregister (lokalt JSON-register eller MLflow) kobler serveringskoden fra hardkodede filnavn. Neste steg er å pakke en lagret modell inn i et FastAPI-endepunkt for å levere prediksjoner over HTTP.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Versjonere modeller: Hvorfor filnavn og metadata er viktige» gratis?

Ja – hele teksten i «Versjonere modeller: Hvorfor filnavn og metadata er viktige» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Machine Learning Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Machine Learning Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Versjonere modeller: Hvorfor filnavn og metadata er viktige»?

Deltakere vil utforme en navnekonvensjon som inkluderer treningsdato, datasettversjon og måltall, og skrive en JSON-sidefil med metadata for styring. Du øver på Machine Learning Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Machine Learning Academy?

Ingen tidligere erfaring er nødvendig. Machine Learning Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Versjonere modeller: Hvorfor filnavn og metadata er viktige»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Machine Learning Academy-leksjonen?

Ja. Alle Machine Learning Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Lagre modeller med joblib og pickle
  2. Versjonere modeller: Hvorfor filnavn og metadata er viktige
  3. Betjene prediksjoner med et FastAPI-endepunkt
  4. Overvåke prediksjoner: Loggføre inndata og utdata
← Tilbake til Machine Learning Academy