Hoppa till innehållet
AI-grafen
E· Universitetvetenskaplig-metod· ca 60 min· utvecklande· verifierad 2026-09-20

Reproducerbarhet

Kunna låsa slumpfrön, versioner och data, dokumentera en körning i labbjournal, och reproducera ett eget resultat.

Förkunskaper

Intuition

Reproducerbart = någon annan kör din kod på din data och får ditt resultat. Kräver att allt är låst:

  • Frön: Python random, NumPy, PyTorch (CPU+CUDA), och torch.use_deterministic_algorithms(True) — GPU-operationer är annars icke-deterministiska.
  • Versioner: requirements.txt med exakta versioner (eller lock-fil), Python-version, CUDA-version.
  • Data: hash av datafilen, eller versionerad snapshot (DVC, git-lfs). «Nedladdad från X» räcker inte — X ändras.
  • Kod: git-commit, rent arbetsträd.
  • Konfiguration: alla hyperparametrar i en fil, inte i huvudet.
  • Miljö: container-image om det ska hålla i år.

Även med allt låst kan GPU-resultat skilja i sista decimalen. Rapportera därför spridning över frön — det är den ärliga siffran, och den gör små avvikelser irrelevanta.

Kod

import os, random, hashlib, json, subprocess, sys
import numpy as np, torch

def seed_everything(seed=0):
    random.seed(seed); np.random.seed(seed); torch.manual_seed(seed); torch.cuda.manual_seed_all(seed)
    os.environ["PYTHONHASHSEED"] = str(seed)
    torch.use_deterministic_algorithms(True, warn_only=True)
    torch.backends.cudnn.benchmark = False

def fingerprint(path):
    return hashlib.sha256(open(path, "rb").read()).hexdigest()[:16]

def provenance(config, data_path):
    return {
        "config": config, "data_sha256": fingerprint(data_path),
        "git": subprocess.run(["git", "rev-parse", "HEAD"], capture_output=True, text=True).stdout.strip(),
        "python": sys.version.split()[0], "torch": torch.__version__, "numpy": np.__version__,
        "cuda": torch.version.cuda, "gpu": torch.cuda.get_device_name(0) if torch.cuda.is_available() else None,
    }

seed_everything(0)
print(json.dumps(provenance({"lr": 1e-3, "seed": 0}, "data/train.csv"), indent=2))

Spara utskriften bredvid resultatet. Kör sedan om — får du samma siffra? Om inte har du hittat en icke-deterministisk källa; leta i dataladdning (shuffle utan frö, set-ordning, parallella workers).

Behärskning innebär

  • Låser frön, versioner och data för en körning
  • Dokumenterar så att en annan person reproducerar resultatet
  • Skiljer reproducerbarhet (samma kod/data) från replikerbarhet (ny data)

Logga in för att göra övningarna och bygga upp din behärskning.

Källor

Alla källor och licenser