guides

Development and publication maintenance

Retain source evidence, regenerate the publication, and build the documentation website.

Publication workflow

The current publication is self-contained under doc/data/current-training/. Its 1,782 seed/horizon records include metrics, final results, resolved configurations, receipts, referenced environment records, campaign definitions, coverage, audits, and WSD continuation metadata. Checkpoints and environment installation bundles are not publication inputs.

Retained artifacts are grouped into gzipped JSONL containers, one line per artifact, so the bundle is roughly ninety files rather than twelve thousand:

{"path":"logs/cosine/sync/h20/lr-0.01-b1-0.9-b2-0.99/s42/metrics.jsonl",
 "bytes":71410,"sha256":"…","text":"<the artifact verbatim>"}

Placement is a pure rule of schedule, training mode, and horizon, so a misfiled or renamed container fails verification. Metrics containers concatenate one gzip member per line, and sources.json records each log’s offset, so a single run stays directly addressable without inflating its container. sources.json is the index: it maps every artifact to its container and keeps the checksum of the original file, while checksums.json covers the containers as stored. Campaign directory names are provenance; public labels use schedule, training mode, horizon, and hyperparameters.

Import an authoritative source snapshot once:

uv run python scripts/export_publication.py --import-runs runs

The import reads the selected campaign reports and their successful attempts, checks their identities, and retains the necessary files.

What is retained, and what is not

Most retained artifacts are byte-identical to the files training wrote. The exception is the metrics logs of the decentralized runs, which had two members deleted from every train event: local_grad_norms and local_losses. These are per-worker diagnostics for the packed models. No published figure, table, or curve reads them, and they were 37% of the logged bytes.

The transform is a deletion, not a re-serialization: no other byte of any line, and no line, was changed, added, or reordered. sources.json keeps each log’s original digest but can no longer recompute it from this copy — for the cosine runs that digest stays independently attested by the retained receipt.json, which records the trainer’s own hash and is checked on every verification run. The complete pre-repack bundle, with the arrays intact, is archived at zesen-kth/tiny-llm at revision per-file-original.

A bundle still in the original per-file layout migrates once with --repack, which verifies every artifact against its recorded digest, proves the deletion against the bytes it replaces, and refuses to publish if any measurement moves.

Hugging Face mirror

The same bundle is published as a dataset, so regeneration does not require the git copy and the logs stay available independently of repository history:

uv run python scripts/export_publication.py --publish-hf
uv run python scripts/export_publication.py --check --bundle hf://zesen-kth/tiny-llm

Publishing needs a token with write access. Nothing else does: the website build, the tests, and CI read only the committed bundle and never reach the network.

Regenerate results, curves, performance, and publication figures from the retained documentation bundle:

uv run python scripts/export_publication.py
uv run python scripts/export_publication.py --check

No source campaign directories, Slurm commands, checkpoints, or GPUs are needed for regeneration. Python uses YAML and Matplotlib, without importing the trainer. To validate another copy or write a separate export, pass --bundle PATH and --output PATH. Outputs are validated in a staging directory before replacing the previous publication. Missing required inputs leave the prior snapshot intact.

The exporter recomputes full-validation rankings and sample SDs, matches hyperparameters and seeds, reconstructs WSD continuation curves, and calculates per-run steady throughput. It also updates marked tables in the README, results article, and performance article. Keep those table markers intact.

Authoring and preview

Compare local training runs

In the current results explorer, choose Add local runs and select one or more plain metrics.jsonl files. Each file joins the trajectory comparison as a single run, with an editable name and matching colors in the loss and gradient-norm charts. Dotted lines identify local runs. The comparison holds up to eight published configurations and local runs combined.

Files are read in your browser without uploading them. Imports survive filter changes but disappear on refresh; comparison links include only published runs. To update a growing log, remove its imported run and select the file again.

The charts use global tokens, train.loss, validation.loss, and train.grad_norm. Full-validation events are separate from subset-validation curves. Unfinished logs and missing series are supported, and an incomplete final record is skipped with a warning. Repeated token positions use the last logged measurement. Each file contributes only its own history; continuation parents are not reconstructed. Local runs do not change published rankings or statistics.

Preview the website

Markdown under doc/ is authoritative. Articles have a title, optional description, and archive: true for archived references. Keep relative Markdown links; the build translates article, configuration, and data links for the website base.

Use natural scientific labels. Put source path details and campaign identities in downloadable provenance. Results, Usage, and Performance are the current navigation; historical reports and original explorers remain accessible in the archive and retain their URLs. Archived pages and maintenance instructions are excluded from current search.

The website uses its independent Node 24+ environment:

npm --prefix site ci
npm --prefix site run build
npm --prefix site run dev

Open http://127.0.0.1:4321/tiny-llm/. Production builds generate local search; use npm --prefix site run preview to inspect it. Website builds validate committed publication checksums and statistics using Node, without Python or campaign access. Generated data, copied assets, and build outputs are ignored by Git.

Validation

scripts/test-cpu.sh tests/test_publication_export.py
uv run python scripts/export_publication.py --check
npm --prefix site run check
npm --prefix site test
npm --prefix site run build
cd site
npx playwright install chromium
npm run test:browser

Checks cover retained evidence, ranking/seed statistics, continuation boundaries, throughput windows, missing inputs, internal links, math, filters, URL restoration, downloads, light/dark themes, mobile layout, and non-JavaScript summaries.

Development

uv run pyright
scripts/test-cpu.sh
uv run ruff check .
uv run ruff format --check .

The CPU launcher reuses a node-local environment and one PyTorch CPU thread. GPU tests require a CUDA allocation. Slow compilation/figure checks and tokenizer multiprocessing checks can be enabled separately:

scripts/test-cpu.sh --run-slow -m slow
scripts/test-cpu.sh --run-integration -m integration

Refresh recorded curves

The historical cosine exporter is retained for archived studies:

npm --prefix site run data:refresh:archive -- --runs-root /path/to/runs

It refreshes only the older 753-result publication, which retains at least 726 recorded curves. Use the current publication exporter for current experiments. Archive refresh should use the authoritative source copy to preserve coverage.

WSD horizon campaigns

The original WSD publication and explorer remain archived. Their committed dataset, checksum validation, and reconstructed trajectories remain available. The current publication additionally retains the raw logs, requests, and continuation records necessary to regenerate these measurements from doc/. Continuations include parent history only through the pre-decay cursor; longer horizons are not independent fresh training runs.

GitHub Pages

Pull requests build and validate the site. Successful pushes to main publish through the existing GitHub Pages workflow, with manual dispatch also available. Deployment uses the github-pages environment and the repository’s Pages source must be GitHub Actions. Build artifacts are uploaded rather than committed to a deployment branch.

View Markdown source ↗
Search current documentation

Historical reports are available in the archive.