AbstractPhil commited on
Commit
b0cd6d2
·
verified ·
1 Parent(s): 6ef14fb

execution environment for the E1 seed-1 arms (versions, container quotas, per-arm code revision, log-completeness caveat) — captured before container release

Browse files
Files changed (1) hide show
  1. 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.*