| --- |
| license: apache-2.0 |
| library_name: pytorch |
| tags: |
| - pretraining |
| - midtraining |
| - checkpoints |
| - pythia |
| datasets: |
| - Impliedhomeland/midtrain-bridge-data |
| --- |
| |
| # Midtrain-Bridge: C4-only backbone checkpoints (`branch_A`) |
| |
| Training-state checkpoints for the **C4-only reference runs** used in midtraining |
| intro-timing experiments. In that setup a single C4-only trunk is trained, then *forked* at |
| various points to introduce a new data mixture (code). `branch_A` is the control: the run |
| that never sees code at all. |
|
|
| These are **not** one model each. Each `branch_A` is a **trajectory of fork points**: every |
| intro-timing branch in the experiments resumes from one of these snapshots. Publishing the |
| whole trajectory is what makes those experiments reproducible. |
|
|
| Matching pre-tokenized data: **[`Impliedhomeland/midtrain-bridge-data`](https://huggingface.co/datasets/Impliedhomeland/midtrain-bridge-data)** (`pythia-70m/` tree). |
|
|
| ## Runs |
|
|
| | folder | params | schedule | peak LR | min LR | branch_A range | extensions | |
| |--------------------------------|--------|----------|---------|-----------|------------------|-------------------------------| |
| | `cosine/70M_14B_1e-3_10pct` | 70M | cosine | 1e-3 | 1e-4 (10%)| 2.80B - 12.60B | `_ext` 13.30B, `_ext2` 13.65B | |
| | `cosine/160M_14B_6e-4_10pct` | 160M | cosine | 6e-4 | 6e-5 (10%)| 2.10B - 14.00B | `_ext975` 13.65B | |
| | `WSD/70M_14B_1e-3` | 70M | WSD | 1e-3 | - | 2.80B - 14.00B | `_ext` 13.65B | |
|
|
| All runs target a 14B-token budget on C4, Pythia tokenizer. |
|
|
| **Note on `cosine/70M_14B_1e-3_10pct`:** its `branch_A` stops at 12.60B, not 14.00B. The |
| `_ext` and `_ext2` runs continue it to 13.30B and 13.65B to serve the late fork points, but |
| no checkpoint in that tree reaches 14.00B. The other two runs do. |
| |
| The `_ext*` directories are continuations past where the main `branch_A` ended, created to |
| supply late fork points (roughly 95% and 97.5% of the budget). They are separate runs on |
| disk, not extra files inside `branch_A`. |
| |
| ## What a checkpoint contains |
| |
| Full training state, not just weights, so you can resume or fork: |
| |
| ```python |
| import torch |
| ck = torch.load("branch_A_14.00B_step6676.pt", map_location="cpu", weights_only=False) |
| ck.keys() |
| # model, optimizer, completed_steps, global_tokens, config, torch_rng, numpy_rng, val_c4, val_code |
| ck["global_tokens"] # 14_000_000_000 |
| ck["completed_steps"] # 6676 |
| ``` |
| |
| | key | 70M | 160M | notes | |
| |----------------------------|----------|----------|------------------------------------------| |
| | `model` | 0.282 GB | 0.64 GB | fp32 weights | |
| | `optimizer` | 0.563 GB | 1.31 GB | Adam moments, two thirds of the file | |
| | `torch_rng` / `numpy_rng` | tiny | tiny | exact data-order reproducibility | |
| | `completed_steps`, `global_tokens`, `config`, `val_c4`, `val_code` | tiny | tiny | run metadata | |
| |
| Weights-only use is fine (`ck["model"]`), but dropping `optimizer` makes the checkpoint |
| unusable for resuming or forking new branches. |
| |
| Each folder also ships `resolved_config.json` (the fully-resolved training config), |
| `metrics.jsonl` (per-eval loss trace) and the source `.yaml`. |
| |
| `latest.pt` was **not** uploaded: in every run it is byte-identical to the last named |
| checkpoint in the same folder. |
|
|
| ## Naming |
|
|
| ``` |
| branch_A_<tokens>B_step<N>.pt |
| ``` |
|
|
| `<tokens>` is cumulative tokens seen, `<N>` the optimizer step. Fork points are addressed by |
| token count, so `branch_A_8.40B_step4006.pt` is the state a branch introducing code at 8.4B |
| would resume from. |
|
|
| ## Downloading |
|
|
| ```bash |
| # one run |
| hf download Impliedhomeland/midtrain-bridge-backbones \ |
| --include 'WSD/70M_14B_1e-3/branch_A/*' --local-dir ./ckpt |
| |
| # a single fork point |
| hf download Impliedhomeland/midtrain-bridge-backbones \ |
| --include '*/branch_A/branch_A_14.00B_step6676.pt' --local-dir ./ckpt |
| ``` |
|
|
| ## Caveats |
|
|
| - fp32 throughout; no safetensors conversion, these are raw `torch.save` training states. |
| - Loading requires `weights_only=False` since the payload includes RNG and config objects. |
| Only load checkpoints you trust. |
| - The model class is the project's own GPT implementation (`src/model.py`), not a |
| `transformers` architecture. `config` in the checkpoint records the hyperparameters. |
|
|