Skip to content

v0.14.0 — the third-framework release

Choose a tag to compare

@Mormolykos Mormolykos released this 01 Aug 15:34

Every rule shipped so far had only ever been tested against HuggingFace trainer_state.json. PyTorch Lightning, Fish Speech and most research code write their metrics to TensorBoard event files and nowhere else — so those runs were invisible. A Lightning run could overfit for three hours and trainproof had nothing to read.

Added

A fifth log format: tfevents. A TensorBoard event-file reader written from the wire format — TFRecord framing plus the Event / Summary / TensorProto fields it needs.

It imports no tensorflow, no tensorboard, no protobuf, no torch, no numpy. Reading a log file should not require installing a training stack, and trainproof's zero-dependency guarantee is unchanged.

Validated against the reference implementation rather than against itself: on a real 2049-step Lightning run it reproduces tensorboard's own EventAccumulator byte-exact — all 13 tags, every point count, first and last values to 1e-6.

  • Rank-0 tensor scalars decoded alongside simple_value (Lightning writes the former; a reader handling only the latter sees an empty run)
  • Cross-framework tag normalisation — train/loss, TrainIterStats/loss, training/lossloss; val/loss, EvalStats/avg_losseval_loss; lr-AdamW/pg1lr
  • When several tags claim one column, the denser series wins, ties alphabetical — deterministic, not dict-order dependent
  • --format tfevents on epoch, doctor, compare, watch; directories are scanned and shards merged
  • Truncated files — the normal state of a killed run — are read up to the cut

Fixed

TP-ZERO-GRAD false positive. The rule condemned any run whose finite gradient norms were all exactly 0.0, reporting a severed backward graph. Coqui writes avg_grad_norm as 0.0 when clipping is off, so a healthy 125,000-step XTTS fine-tune that reached loss 0.017 was reported FAIL.

A run cannot both learn and receive no gradient. The check now stands down when the loss improved, recording the reason as a skip, and stays armed when the loss is stuck.

Found by running the shipped rules against a real training run — not by a test.

Evidence

evidence/ now ships the logs behind these claims: a 125,000-step Coqui XTTS v2 fine-tune as both a text log and the event file from the same run, and a 2049-step Fish Speech LoRA fine-tune. Both on an RTX 5080.

Judged by the shipped rules at generation time:

framework format records verdict
Coqui XTTS v2 coqui 2501 FAIL TP-DIVERGE, TP-THROUGHPUT
Coqui XTTS v2 tfevents 1255 FAIL TP-DIVERGE, TP-THROUGHPUT
Lightning / Fish Speech tfevents 82 WARN TP-OVERFIT, TP-THROUGHPUT

The two XTTS rows are the same run read by completely independent parsers. They agree exactly — and EVIDENCE_MATRIX.md now computes that agreement as a derived observation rather than asserting it in prose.

Contract

No new rule IDs (62, unchanged) and no schema change (schema_version 3). 0.14.0 adds a capability, it does not break one.

Tests: 179 → 210.

pip install trainproof==0.14.0
trainproof doctor results/my_run/tensorboard/version_0