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), ochtorch.use_deterministic_algorithms(True)— GPU-operationer är annars icke-deterministiska. - Versioner:
requirements.txtmed 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
- PyTorch — Reproducibility — BSD-3-Clause
- arXiv — Deep Reinforcement Learning that Matters — arXiv (öppen åtkomst; licens per artikel)