{ "scenarios": [ { "key": "bit_flip", "title": "bit flip (silent data corruption)", "blurb": "One flipped exponent bit in one gradient element. Adam normalises the update away, so the loss curve usually never reacts at all.", "truth": 372, "bytes": 609898 }, { "key": "lr_spike_loud", "title": "learning-rate spike (loud)", "blurb": "The easy case, included on purpose: the loss spikes, so watching the curve works here too.", "truth": 372, "bytes": 610213 }, { "key": "lr_spike_subtle", "title": "learning-rate drift (subtle)", "blurb": "A sustained 4x learning rate. The loss degrades gradually, so 'when did it start?' is genuinely hard by eye.", "truth": 372, "bytes": 608000 }, { "key": "overflow", "title": "fp8-range overflow", "blurb": "Gradients pushed outside an emulated fp8 range produce Inf, which propagates into the optimizer state.", "truth": 372, "bytes": 461278 }, { "key": "data_poison", "title": "data poisoning (12% of each batch)", "blurb": "A small contamination, inside the loss curve's own noise band.", "truth": 372, "bytes": 607198 }, { "key": "clean", "title": "healthy run (no fault)", "blurb": "A control. A good detector must report nothing here.", "truth": null, "bytes": 609191 } ], "n_metrics": 124, "metrics": [ "loss", "grad_norm", "update_norm", "param_norm", "grad_max_abs", "update_max_abs", "param_max_abs", "nonfinite_grad", "nonfinite_param", "sign_flip_rate", "cos_grad_prev", "update_param_ratio", "grad_mean", "grad_var", "grad_absmean", "grad_norm_tensor_max", "grad_norm_tensor_min", "grad_rms", "loss_delta", "update_norm_tensor_max", "group:all:mean", "group:all:var", "group:all:max_abs", "group:all:grad_l2", "group:all:update_l2", "group:all:sign_flip", "group:all:nonfinite", "group:all:upd_param_ratio", "group:embed:mean", "group:embed:var", "group:embed:max_abs", "group:embed:grad_l2", "group:embed:update_l2", "group:embed:sign_flip", "group:embed:nonfinite", "group:embed:upd_param_ratio", "group:attn_qkv:mean", "group:attn_qkv:var", "group:attn_qkv:max_abs", "group:attn_qkv:grad_l2", "group:attn_qkv:update_l2", "group:attn_qkv:sign_flip", "group:attn_qkv:nonfinite", "group:attn_qkv:upd_param_ratio", "group:attn_out:mean", "group:attn_out:var", "group:attn_out:max_abs", "group:attn_out:grad_l2", "group:attn_out:update_l2", "group:attn_out:sign_flip", "group:attn_out:nonfinite", "group:attn_out:upd_param_ratio", "group:mlp_in:mean", "group:mlp_in:var", "group:mlp_in:max_abs", "group:mlp_in:grad_l2", "group:mlp_in:update_l2", "group:mlp_in:sign_flip", "group:mlp_in:nonfinite", "group:mlp_in:upd_param_ratio", "group:mlp_out:mean", "group:mlp_out:var", "group:mlp_out:max_abs", "group:mlp_out:grad_l2", "group:mlp_out:update_l2", "group:mlp_out:sign_flip", "group:mlp_out:nonfinite", "group:mlp_out:upd_param_ratio", "group:norm:mean", "group:norm:var", "group:norm:max_abs", "group:norm:grad_l2", "group:norm:update_l2", "group:norm:sign_flip", "group:norm:nonfinite", "group:norm:upd_param_ratio", "group:head:mean", "group:head:var", "group:head:max_abs", "group:head:grad_l2", "group:head:update_l2", "group:head:sign_flip", "group:head:nonfinite", "group:head:upd_param_ratio", "hist_grad:0", "hist_grad:1", "hist_grad:2", "hist_grad:3", "hist_grad:4", "hist_grad:5", "hist_grad:6", "hist_grad:7", "hist_grad:8", "hist_grad:9", "hist_grad:10", "hist_grad:11", "hist_grad:12", "hist_grad:13", "hist_grad:14", "hist_grad:15", "hist_update:0", "hist_update:1", "hist_update:2", "hist_update:3", "hist_update:4", "hist_update:5", "hist_update:6", "hist_update:7", "hist_update:8", "hist_update:9", "hist_update:10", "hist_update:11", "hist_update:12", "hist_update:13", "hist_update:14", "hist_update:15", "qnorm:0", "qnorm:1", "qnorm:2", "qnorm:3", "qnorm:4", "qnorm:5", "qnorm:6", "qnorm:7" ], "bytes_per_step": 452, "win": 32, "preset": "nano", "steps": 600, "exclude": [ "lr", "step_wall_ms", "batch_id_mean", "batch_uniq_frac" ] }