execution environment for the E1 seed-1 arms (versions, container quotas, per-arm code revision, log-completeness caveat) — captured before container release
Browse files- ENVIRONMENT.md +99 -0
ENVIRONMENT.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# AlephLM-0 E1 — execution environment
|
| 2 |
+
|
| 3 |
+
The exact stack the seed-1 arms (`a1_anchored-s1`, `a2_dense-s1`, `a3_random-s1`)
|
| 4 |
+
trained on, captured from the live container before it was released. Recorded
|
| 5 |
+
because several of this line's engineering laws are pinned to specific versions
|
| 6 |
+
and to the container's resource envelope — a replication on a drifted image
|
| 7 |
+
would change checkpointing and compile semantics silently.
|
| 8 |
+
|
| 9 |
+
## Software
|
| 10 |
+
|
| 11 |
+
| component | version |
|
| 12 |
+
|---|---|
|
| 13 |
+
| Python | 3.11.10 (GCC 11.4.0) |
|
| 14 |
+
| PyTorch | 2.4.1+cu124 |
|
| 15 |
+
| CUDA (torch) | 12.4 |
|
| 16 |
+
| cuDNN | 9.1.0 (90100) |
|
| 17 |
+
| Triton | 3.0.0 |
|
| 18 |
+
| transformers | 5.14.1 |
|
| 19 |
+
| tokenizers | 0.22.2 |
|
| 20 |
+
| huggingface_hub | 1.26.0 |
|
| 21 |
+
| datasets | 5.0.1 |
|
| 22 |
+
| safetensors | 0.8.0 |
|
| 23 |
+
| numpy | 1.26.3 |
|
| 24 |
+
| tensorboard | 2.21.0 |
|
| 25 |
+
| torchvision / torchaudio | 0.19.1+cu124 / 2.4.1+cu124 |
|
| 26 |
+
| NVIDIA driver | 570.195.03 |
|
| 27 |
+
| OS / kernel | Ubuntu 22.04.5 LTS / 6.8.0-64-generic |
|
| 28 |
+
|
| 29 |
+
Full package set: `pip_freeze.txt` (179 packages) beside this file.
|
| 30 |
+
|
| 31 |
+
**Why the torch pin matters.** Three separate behaviors in this line are
|
| 32 |
+
torch-2.4-specific: `torch.utils.checkpoint` needs an explicit import (2.4.1
|
| 33 |
+
does not auto-import the submodule; 2.8+ does); compile-inside-checkpoint hits
|
| 34 |
+
2.4's RNG-fork/fake-tensor collision, so the compile path asserts
|
| 35 |
+
inner-checkpointing off; and 2.4's checkpoint recompute cannot re-enter dynamo,
|
| 36 |
+
a measured structural limit rather than a configuration choice.
|
| 37 |
+
|
| 38 |
+
## Hardware and container envelope
|
| 39 |
+
|
| 40 |
+
| resource | value |
|
| 41 |
+
|---|---|
|
| 42 |
+
| GPUs | 2 × NVIDIA A40, 46,068 MiB each, PXB peer link |
|
| 43 |
+
| GPU UUIDs | `GPU-b5d01167-717d-2198-1b7f-7ff14788d65a`, `GPU-0b319f75-ee74-46e3-9831-01dc3b8fe681` |
|
| 44 |
+
| Host CPU | Intel Xeon Gold 6342 @ 2.80 GHz, 96 vCPU visible |
|
| 45 |
+
| Host RAM | 540,644,167,680 B (~503 GiB) visible |
|
| 46 |
+
| **Container memory quota** | **110,999,998,464 B (103.38 GiB)** |
|
| 47 |
+
| **Container CPU quota** | **17.85 cores** (cfs quota 1,785,000 / period 100,000) |
|
| 48 |
+
| CPU affinity / NUMA | 0-23, 48-71 / node 0 |
|
| 49 |
+
| Container id | `d2d7b1e1e4e4` |
|
| 50 |
+
| Storage | 200 GB container overlay; 400 GB network volume at the work root |
|
| 51 |
+
|
| 52 |
+
**Why the quotas matter.** The visible host figures (96 vCPU, ~503 GiB) are not
|
| 53 |
+
what the container may use — the real envelope is 17.85 cores and 103.38 GiB.
|
| 54 |
+
The streaming memmap target store exists precisely to fit that memory quota: an
|
| 55 |
+
earlier build held the full 49 GB target buffer in RAM and, with transient spike,
|
| 56 |
+
crossed the quota and took a silent cgroup SIGKILL at the final concatenate.
|
| 57 |
+
Any rig sized against that law wants the exact byte value above, not a rounding.
|
| 58 |
+
|
| 59 |
+
## Code revision per arm
|
| 60 |
+
|
| 61 |
+
The three seed-1 arms each fetched the training module at their own launch
|
| 62 |
+
instant, so they did not all execute the same revision. Launch times come from
|
| 63 |
+
the tensorboard filenames shipped with each run (`events.out.tfevents.<epoch>.<container>.<pid>`):
|
| 64 |
+
|
| 65 |
+
| arm | launch (UTC) | revision executed | target store implementation |
|
| 66 |
+
|---|---|---|---|
|
| 67 |
+
| `a1_anchored-s1` | 02:53:28 | `abdd691` | in-RAM concatenate |
|
| 68 |
+
| `a3_random-s1` | 03:36:35 | `e21de50` | streaming memmap cache |
|
| 69 |
+
| `a2_dense-s1` | 20:30:19 | `ae93b6b` | streaming memmap cache (cache hit) |
|
| 70 |
+
|
| 71 |
+
`e21de50 → ae93b6b` changes 168 lines, but every hunk on a shared path is gated
|
| 72 |
+
behind the splat arm, which none of these three runs use — so **a2 and a3 are
|
| 73 |
+
behavior-identical**. `abdd691 → e21de50` changes 86 lines located entirely in
|
| 74 |
+
the target store and **not** arm-gated: a1 therefore consumed its training
|
| 75 |
+
targets through a different store implementation than a2 and a3.
|
| 76 |
+
|
| 77 |
+
The store change alters how targets are held, not what they contain (the memmap
|
| 78 |
+
byte arithmetic reconciles exactly to the source tensors: 31,905,616 × 768 × 2
|
| 79 |
+
bytes with zero slack), and a1-s1's capability lands within seed noise of
|
| 80 |
+
a1-s0 (.6007 vs .6031, trained under yet another build). The recorded position
|
| 81 |
+
is therefore that the arms are equivalent, stated as a checked fact with its
|
| 82 |
+
one caveat named rather than as an unexamined assumption.
|
| 83 |
+
|
| 84 |
+
## Console-log completeness caveat (`a1_anchored-s1`)
|
| 85 |
+
|
| 86 |
+
Two orchestrators launched `a1` against the same fixed log path with truncating
|
| 87 |
+
redirection. The duplicate failed its VRAM probe and exited while the real run
|
| 88 |
+
continued writing at its own file offset, so the surviving console log carries a
|
| 89 |
+
490-byte hole and its first 7,195 bytes belong to the failed duplicate. Practical
|
| 90 |
+
consequences: the header line reporting a 14.3 GB allocator cap belongs to the
|
| 91 |
+
**duplicate**, not to the run that produced the shipped weights; and the real
|
| 92 |
+
run's own preamble (its allocator cap, VRAM-probe pass, config echo, resume
|
| 93 |
+
line) plus roughly the first 61% of its console output have no surviving
|
| 94 |
+
witness. The training record itself is unaffected — the tensorboard scalars on
|
| 95 |
+
the hub cover the full span, and the weights, `metrics.json`, and resume state
|
| 96 |
+
are complete. Fixed for future campaigns by giving every launch a distinct log
|
| 97 |
+
path and appending rather than truncating.
|
| 98 |
+
|
| 99 |
+
*Captured 2026-08-07 by AbstractPhil before container release.*
|