NagaYu's picture
First-bad-step detector: test MAE 0.00 steps, 6/6 exact on held-out runs
a7c7816 verified
|
Raw History Blame Contribute Delete
3.31 kB
---
license: apache-2.0
library_name: flashback
tags:
- anomaly-detection
- distributed-training
- observability
- debugging
- machine-learning
- flashback
metrics:
- mae
model-index:
- name: flashback-first-bad-step
results:
- task:
type: anomaly-detection
name: First-bad-step localisation
dataset:
name: Flashback Forensics
type: NagaYu/flashback-forensics
split: test
metrics:
- type: mae
name: Mean absolute step error
value: 0.00
- type: accuracy
name: Exact-step hit rate
value: 1.000
---
# Flashback: first-bad-step detector
Given a run's **sketch index** -- a few hundred bytes of summary statistics per
training step -- this model reports the step at which the run first went wrong.
It is small on purpose: 10 logistic weights plus 9 fitted
consensus hyperparameters. The interesting part is not the model, it is that
the *input* is cheap enough to record for every step of every run.
## Results on held-out runs
| detector | mean abs. error (steps) | exact | within 2 | never detected |
|---|---:|---:|---:|---:|
| loss curve alone | 0.50 | 2/6 | 4/6 | 2 |
| **this model** | **0.00** | **6/6** | **6/6** | **0** |
Train split: 12 runs, MAE 0.00.
Splits are by run: no step of a test run appears in training.
## Usage
```python
from flashback.detector import FirstBadStepDetector
from flashback.sketch import StepSketchIndex
from huggingface_hub import snapshot_download
det = FirstBadStepDetector.load(snapshot_download("<user>/flashback-first-bad-step"))
report = det.predict(StepSketchIndex("runs/my-run/sketch", mode="r"))
print(report.first_bad_step, report.confidence, report.top_metrics)
```
To produce the sketch index in the first place, add three lines to your
training loop:
```python
from flashback.integrations import FlashbackCallback
trainer = Trainer(..., callbacks=[FlashbackCallback("runs/my-run")])
```
## Fitted configuration
```json
{
"win": 32,
"gap": 1,
"mode": "diff",
"k_cal": 8.0,
"k_min": 8.0,
"min_votes": 3,
"vote_window": 2,
"exclude": [
"lr",
"step_wall_ms",
"batch_id_mean",
"batch_uniq_frac"
],
"use_logistic": true,
"logistic_threshold": 0.5,
"version": "1"
}
```
## Feature weights
| feature | weight |
|---|---:|
| `bias` | -9.8951 |
| `log1p_max_z` | +0.1471 |
| `log1p_top5_mean_z` | +0.1950 |
| `frac_metrics_firing` | +18.4084 |
| `hard_signal` | +1.2226 |
| `log1p_z_grad_norm` | +0.3008 |
| `log1p_z_update_max` | +0.1584 |
| `log1p_z_loss` | +0.0378 |
| `log1p_z_hist_tail` | +0.2497 |
| `rel_position` | +15.0875 |
## Limitations
- It needs a **healthy stretch** of the run to calibrate against; a run that is
broken from step 0 has no baseline and will not be localised.
- It reports *regime changes*, so a fault that ramps in smoothly over hundreds
of steps has no single correct answer and the reported step will be early or
late by roughly the ramp length.
- It was fitted on small Transformers (a few hundred thousand to a few million
parameters). The features are scale-free by construction, but transfer to
very large models is **not** demonstrated here.
- No claim of bitwise determinism is made anywhere in Flashback; this is a
statistical detector over recorded statistics.
Generated by Flashback v0.1.0.