alephlm-0 / ENVIRONMENT.md
AbstractPhil's picture
execution environment for the E1 seed-1 arms (versions, container quotas, per-arm code revision, log-completeness caveat) β€” captured before container release
b0cd6d2 verified
|
Raw History Blame Contribute Delete
5.01 kB

AlephLM-0 E1 β€” execution environment

The exact stack the seed-1 arms (a1_anchored-s1, a2_dense-s1, a3_random-s1) trained on, captured from the live container before it was released. Recorded because several of this line's engineering laws are pinned to specific versions and to the container's resource envelope β€” a replication on a drifted image would change checkpointing and compile semantics silently.

Software

component version
Python 3.11.10 (GCC 11.4.0)
PyTorch 2.4.1+cu124
CUDA (torch) 12.4
cuDNN 9.1.0 (90100)
Triton 3.0.0
transformers 5.14.1
tokenizers 0.22.2
huggingface_hub 1.26.0
datasets 5.0.1
safetensors 0.8.0
numpy 1.26.3
tensorboard 2.21.0
torchvision / torchaudio 0.19.1+cu124 / 2.4.1+cu124
NVIDIA driver 570.195.03
OS / kernel Ubuntu 22.04.5 LTS / 6.8.0-64-generic

Full package set: pip_freeze.txt (179 packages) beside this file.

Why the torch pin matters. Three separate behaviors in this line are torch-2.4-specific: torch.utils.checkpoint needs an explicit import (2.4.1 does not auto-import the submodule; 2.8+ does); compile-inside-checkpoint hits 2.4's RNG-fork/fake-tensor collision, so the compile path asserts inner-checkpointing off; and 2.4's checkpoint recompute cannot re-enter dynamo, a measured structural limit rather than a configuration choice.

Hardware and container envelope

resource value
GPUs 2 Γ— NVIDIA A40, 46,068 MiB each, PXB peer link
GPU UUIDs GPU-b5d01167-717d-2198-1b7f-7ff14788d65a, GPU-0b319f75-ee74-46e3-9831-01dc3b8fe681
Host CPU Intel Xeon Gold 6342 @ 2.80 GHz, 96 vCPU visible
Host RAM 540,644,167,680 B (~503 GiB) visible
Container memory quota 110,999,998,464 B (103.38 GiB)
Container CPU quota 17.85 cores (cfs quota 1,785,000 / period 100,000)
CPU affinity / NUMA 0-23, 48-71 / node 0
Container id d2d7b1e1e4e4
Storage 200 GB container overlay; 400 GB network volume at the work root

Why the quotas matter. The visible host figures (96 vCPU, ~503 GiB) are not what the container may use β€” the real envelope is 17.85 cores and 103.38 GiB. The streaming memmap target store exists precisely to fit that memory quota: an earlier build held the full 49 GB target buffer in RAM and, with transient spike, crossed the quota and took a silent cgroup SIGKILL at the final concatenate. Any rig sized against that law wants the exact byte value above, not a rounding.

Code revision per arm

The three seed-1 arms each fetched the training module at their own launch instant, so they did not all execute the same revision. Launch times come from the tensorboard filenames shipped with each run (events.out.tfevents.<epoch>.<container>.<pid>):

arm launch (UTC) revision executed target store implementation
a1_anchored-s1 02:53:28 abdd691 in-RAM concatenate
a3_random-s1 03:36:35 e21de50 streaming memmap cache
a2_dense-s1 20:30:19 ae93b6b streaming memmap cache (cache hit)

e21de50 β†’ ae93b6b changes 168 lines, but every hunk on a shared path is gated behind the splat arm, which none of these three runs use β€” so a2 and a3 are behavior-identical. abdd691 β†’ e21de50 changes 86 lines located entirely in the target store and not arm-gated: a1 therefore consumed its training targets through a different store implementation than a2 and a3.

The store change alters how targets are held, not what they contain (the memmap byte arithmetic reconciles exactly to the source tensors: 31,905,616 Γ— 768 Γ— 2 bytes with zero slack), and a1-s1's capability lands within seed noise of a1-s0 (.6007 vs .6031, trained under yet another build). The recorded position is therefore that the arms are equivalent, stated as a checked fact with its one caveat named rather than as an unexamined assumption.

Console-log completeness caveat (a1_anchored-s1)

Two orchestrators launched a1 against the same fixed log path with truncating redirection. The duplicate failed its VRAM probe and exited while the real run continued writing at its own file offset, so the surviving console log carries a 490-byte hole and its first 7,195 bytes belong to the failed duplicate. Practical consequences: the header line reporting a 14.3 GB allocator cap belongs to the duplicate, not to the run that produced the shipped weights; and the real run's own preamble (its allocator cap, VRAM-probe pass, config echo, resume line) plus roughly the first 61% of its console output have no surviving witness. The training record itself is unaffected β€” the tensorboard scalars on the hub cover the full span, and the weights, metrics.json, and resume state are complete. Fixed for future campaigns by giving every launch a distinct log path and appending rather than truncating.

Captured 2026-08-07 by AbstractPhil before container release.