File size: 15,188 Bytes
0693474 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | # Second-pass full training and full G2
This procedure follows the real pilot-2 ACE PASS only (Amendment 8, original source d1dd41a). It prepares a separate FAST
checkpoint and a full development-population G2 receipt. It does not package,
qualify a fresh TEST set, run a worker, access a Spark or deploy anything.
See [admission audit](FULL-ADMISSION.md) and [pilot staging](PILOT-STAGE.md).
## Cost and scope sheet
MEASURED inputs: coordinator's D2-FULL-PREP brief records FAST approximately
0.85 seconds per B128 optimizer update and REF approximately 40 seconds per
update, on unchanged 225 W solo cards. The pilot has 159 updates per arm; these
are historical first-pilot KL rates; ACE throughput is unmeasured here. Historical reference evaluation is approximately
0.5 seconds per round per pass (D2 plan amendment 4). These rates are inputs,
not full-run measurements by this lane. All costs below are ESTIMATED and omit
startup, I/O, validation, checkpoint writes, interruptions and queueing.
MEASURED metadata: S36-inputs/shards/MANIFEST.json SHA256
`450bb71653f3def68cd95ee9579a456c74c469d08a016940cceda24de48b4f30`:
65 training sequences / 496,416 captured rows; 30 dev / 233,500 rows;
24 heldout_legal / 220,458 rows; 12 heldout_general / 40,566 rows.
Captured rows include context and are NOT training blocks. The same manifest
reports 990,940 total rows and 974,172 generated span positions; their difference
is 131 * 128, so every sequence has all 128 initial context rows. D2Blocks
makes L-gen_start-1 overlapping training blocks per sequence. This yields
488,096 training span positions and **488,031 unique training blocks**.
The coordinator must confirm len(D2Blocks(manifest, 'train')) against actual
sidecars before launch; Controller's receipt-only copies cannot do that read.
Keep PILOT.md's **three epochs**, fresh from the native base and zero LoRA B;
do not continue a 20K pilot checkpoint under a new cosine schedule. B128,
chunk8192, rank32, raw taps, AdamW .0002/.01, clipping 1 and seed23 retain
the qualified ACE recipe from the admitted receipt. No recipe CLI override exists.
Other supported receipts use their own qualified recipe: TVD or KL at 2e-4,
LR at 5e-5 with ceil(.1 * total_updates) warm-up followed by cosine.
These cost estimates extrapolate historical KL rates, not measured full ACE rates. Three epochs present 1,464,093 blocks in
3 * ceil(488031 / 128) = **11,439 updates**. Overlapping five-target windows
and repeated epochs do not create more unique data.
| Work | ESTIMATED solo GPU-hours | ESTIMATED wall time |
|---|---:|---:|
| Full FAST, three epochs, one solo | 2.701 | 2.701 h |
| Same full run in REF (cost comparison only; not scheduled) | 127.100 | 127.100 h |
| Full dev baseline + candidate, 90,837 complete rounds each | 25.233 | 25.233 h on solo A |
| Full legal baseline + candidate, 77,949 complete rounds each | 21.653 | 21.653 h on solo B |
| General baseline + candidate, at most 14,624 rounds each | <=4.062 | <=4.062 h on solo B after legal |
| Full G2 including general | <=50.947 | about 25.715 h with two solos |
| FAST followed by full G2 | <=53.648 | about 28.416 h with two solos for G2 |
MEASURED complete dev/legal round counts come from the real pilot-plan header's
`sample.population_rounds`, not the 1,000-round samples. General's 14,624 comes
from its G1 receipt and includes possible incomplete tails; the full scorer
excludes those, so it is a planning upper count. Each full G2 request is scored
twice, once unadapted and once adapted, through reference arithmetic. The
historical 0.5 seconds/round is not a guarantee on these longer real contexts.
A pilot evaluation cost must not be substituted for this approximately day-long
full G2. Request-boundary journals allow interruptions without discarding
completed requests. Repeating a partially scored request adds overhead.
**Data sufficiency:** this is enough unique training data for the approved
20K matched pilot and an evidence-gated Phase 2a adapter run. The plan approves
approximately 1M generated tokens across the dataset; it does not impose a
1M-unique-training-block floor. The pass generated MEASURED 974,303 tokens in
3.0 Spark-hours (coordinator brief), close to that dataset-scale intent.
However, **the available unique training population is only about 0.488M**;
it is not enough to claim training on 1M unique blocks. Three epochs do not
fix that distinction. There is no basis to promise adaptation from the size:
the actual pilot, full G2, fresh reserved TEST and real-worker/GB10 G3 decide.
If 1M unique TRAIN blocks are required as a larger data objective, the deficit
is approximately 511,969. At the pass-2 rate 974303/3 = 324,768 generated tokens
per Spark-hour, additional generation costs ESTIMATED **1.58 Spark-hours** if
all new eligible source families enter train and current heldouts remain frozen,
or approximately **3.15 Spark-hours** at the current approximately 50.1% train
allocation. These are optimistic generation-only costs: new prompts/families,
context rows, incomplete tails, top20 verification, copying, assembly and G1
add work. Merely reaching 1M total generated tokens instead needs approximately
25,697 more tokens, **0.079 Spark-hours**; that does not yield 1M training blocks.
Spark-hours here use exactly the brief's 974,303/3.0 accounting unit; do not
silently confuse deployment wall-hours with two-rank GPU-card-hours.
No extra generation is launched or newly authorized by this sheet. Phase 2b's
3–5M tokens/full-dense or expert-LoRA training still needs a costed NDM decision.
## Coordinator procedure (local x86host only)
Do not run these execute commands in a lane. No script connects to another host.
Review/transfer the integration commit through the coordinator's existing process;
keep that clean checkout and the original pilot snapshot available unchanged.
The full snapshot must be NEW and separate from the pilot. Production units,
production-pair cards, power/clock settings and live requests are outside this
procedure. The existing interpreter and requirements-x86host.lock are sufficient.
In the reviewed full checkout on x86host, render first:
```bash
set -euo pipefail
source ~/.config/ndm/paths.sh
export PYTHONPATH="$PWD:$PWD/offload/dspark"
export CUDA_VISIBLE_DEVICES=''
D2_FULL_PYTHON=$HOME/dsv41-offload/e/venv/bin/python
full_args=(
--source "$PWD" --commit REVIEWED_FULL_40_HEX_COMMIT
--snapshot "$HOME/dsv41-offload/d2/full/decode-d2pass2-r1-p2-ace-full"
--output /opt/dsv41/x86host-data/d2/full/decode-d2pass2-r1-p2-ace-full
--assembly /opt/dsv41/x86host-data/d2/decode-d2pass2-r1-c2
--pilot-source "$HOME/dsv41-offload/d2/pilot/decode-d2pass2-r1-p2-ace/repo"
--pilot-receipt /opt/dsv41/x86host-data/d2/pilot/decode-d2pass2-r1-p2-ace/receipt.json
--g1 /opt/dsv41/x86host-data/d2/g1-d2pass2-r1/dev.json
--k2-dev /opt/dsv41/x86host-data/d2/g1-d2pass2-r1/dev.k2_drafts.jsonl
--k2-legal /opt/dsv41/x86host-data/d2/g1-d2pass2-r1/heldout_legal.k2_drafts.jsonl
--k2-general /opt/dsv41/x86host-data/d2/g1-d2pass2-r1/heldout_general.k2_drafts.jsonl)
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}"
# Confirm receipt.json reports a genuine PASS; FAIL/INCONCLUSIVE stops here.
# LOCAL CPU admission, no GPU or detached job:
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --check-inputs
```
Dry default does not read missing inputs, invoke git/tmux or initialize CUDA.
Explicit CPU admission rechecks pilot_stage's genuine -c2 assembly/provenance,
G1(a), exact dev G1(b), VALID hash-bound live sources, parity and K2. It pins the complete d1dd41a pilot-2 map and verifies
the original pilot source and invokes its unchanged require_pilot on CPU to
recompute real PASS, intervals, sample/unit identities and every checkpoint,
then redraws the frozen sample from both exact K2 files in that original namespace.
It also checks full general K2 coverage. Synthetic, missing, FAIL/INCONCLUSIVE,
modified-source, withdrawn acap or mismatched receipts stop admission.
Check free RAM and the existing exact `dsv41-powerlog` session before launch.
Only the coordinator, on local x86host with the exact assembly path, can execute:
```bash
export D2_COORDINATOR=Deepseek/coordinator
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --execute --phase stage
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --execute --phase full-train --job full-fast
# Wait for full-fast's detached process to exit successfully and inspect the final checkpoint/log.
# full-g2 admission independently verifies all three epochs and the exact PASS identity.
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --execute --phase full-g2 --job g2-dev
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --execute --phase full-g2 --job g2-legal
# After legal finishes and releases solo B (do not launch both on that card):
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --execute --phase full-g2 --job g2-general
# After dev.json, heldout_legal.json and heldout_general.json all exist:
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --execute --phase finish --job g2-finish
```
Stage uses git archive, SOURCE_COMMIT and STAGED.json in the NEW full snapshot;
records include input hashes, the admitted recipe and exact rendered commands.
Snapshot/output basenames must equal the pilot receipt namespace plus -full;
these commands use decode-d2pass2-r1-p2-ace-full. A different qualified recipe
requires its own original receipt/snapshot and correspondingly distinct namespace. Every subsequent
phase revalidates source bytes/file set, inputs and the command contract before
starting a session. Inherited GIT_* variables are stripped from child git calls.
Session names are `d2full-decode-d2pass2-r1-p2-ace-full-{full-fast,g2-dev,g2-legal,g2-general,g2-finish}`;
existing sessions/scripts refuse. Only these new sessions belong to this run.
No session is killed. Snapshot scripts and logs are `NAME.sh` and
`logs/NAME.coordinator.log`; leased child logs append in `logs/full-fast.log`
and `logs/full-g2-SPLIT.log`.
Full FAST runs on 240876ad; G2 dev uses 240876ad, legal then general use bc62df2a.
All GPU commands go through unchanged run_pilot_locked.sh: UUID-only pinning,
nonblocking per-solo flock, unchanged 225 W, power logger, child RSS <=128 GiB,
no swap, supervised cancellation. Full initialization uses seed23 before model
construction; it never resumes a pilot checkpoint. Fresh initialization must match the pilot initialization hash. Numerical source
files and the pilot verdict implementation remain byte-identical to pilot 2 d1dd41a.
The final train file is `full-fast.pt`, with immutable
`full-fast.checkpoints/step-NNNNNNNNN.pt` boundaries. The loop saves every 300 s
and on its supervised stop. Resume binds run/data/precision/base/backend/pilot
hash, explicit full_recipe and RNG/scheduler/optimizer state. Inspect an interrupted job's saved
boundary; resume only that job in its existing namespace:
```bash
# Example only after an actual incomplete full-fast interruption:
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --execute --phase full-train --job full-fast --resume --attempt 1
# Example only after an incomplete dev scoring interruption:
"$D2_FULL_PYTHON" -m offload.dspark.d2.train.full_stage "${full_args[@]}" --execute --phase full-g2 --job g2-dev --resume --attempt 1
```
If interrupted again, increment --attempt for a fresh session/script name.
Never rerun a completed training/scoring job. G2 creates SPLIT.requests/contract.json
and one aggregate receipt per completed request. Resume requires unchanged
manifest, all source hashes, adapter, pilot, recipe and K2/population identities, and
reuses only completed requests; the interrupted request restarts. It never
samples/limits the complete-round population. Final SPLIT.json creation is
exclusive. Keep the journals private alongside the full outputs.
`g2.json` binds all three part receipts to the same recipe, manifest, source, pilot and
completed adapter. Accepted length is the committed-K2 trajectory proxy, bonus
excluded. Full dev/legal checks retain legal gain >=.15 accepted draft tokens,
request-bootstrap 95% lower bound >0, every-request gain >=-.2, strictly lower
mean teacher KL at each position, and amendment-6 no-native-regression floor
of -.01 on each development split. Dev must contain all 30 requests and legal
at least 20; the scorer enumerates the full actual manifest populations.
All splits refuse NaN/inf or incomplete summaries. heldout_general keeps the
D2-TRAIN G2 gates of `evaluate.g2` (amendment 4: final G2 unchanged): at least
10 requests, gain >=-.03, every-request gain >=-.2 and strictly lower KL at each
position; it has no native-regression floor and cannot rescue a failing
dev/legal verdict. The old
four-acap requirement is replaced by the amendment-7 dev population; no acap
receipt or old `evaluate g2 --acap` command is used.
On G2 FAIL, preserve the receipt and report it; do not retune on heldouts or
redraw the pilot sample. G2 PASS is full DEVELOPMENT evidence only. Fresh reserved
public TEST families, isolated real-worker qualification, the floating native
adapter package/profile (WORKER-EVAL.md), V1 and coordinator GB10 G3/depth work
remain required. No checkpoint, package or service is automatically promoted.
## CPU validation
Use Controller's HARNESS_PYTHON. No new dependencies or installs. The private tmux
base must already exist and be short enough for a Unix socket; the lane scratch
path below plus `/t/s33tXXXXXXXX/tmux-1000/default` is 96 bytes.
```bash
source ~/.config/ndm/paths.sh
D2_FULL_SCRATCH=/opt/dsv41/campaigns/DSV41-OFFLOAD/scratch/D2-FULL2-ADMIT
mkdir -p "$D2_FULL_SCRATCH/t" "$D2_FULL_SCRATCH/tmux"
env -u TMUX OMP_NUM_THREADS=2 CUDA_VISIBLE_DEVICES='' \
PYTHONPATH="$PWD:$PWD/offload/dspark" TMPDIR="$D2_FULL_SCRATCH" \
TMUX_TMPDIR="$D2_FULL_SCRATCH/tmux" S33_SHORT_DIR="$D2_FULL_SCRATCH/t" \
"$HARNESS_PYTHON" -m pytest -q offload/dspark/d2/tests \
offload/dspark/d2/train/tests offload/dspark/d2/s34 offload/dspark/d2/s35 offload/dspark/d2/s36 offload/dspark/d2/s37 \
--basetemp "$D2_FULL_SCRATCH/pytest" -o tmp_path_retention_policy=failed
"$HARNESS_PYTHON" -m mypy --strict --explicit-package-bases --follow-imports=silent \
offload/dspark/d2/train/{loop,full_admission,full_stage,full_train,full_eval}.py \
offload/dspark/d2/train/tests/{test_full_admission,test_full_stage,test_full_recipes,snapshot_git}.py \
offload/dspark/d2/s37/test_s37_{admission,numerics,stage,g2,cost}.py
```
Successful fixture cleanup prevents the broad suite retaining multiple GB.
CPU tests verify dry/no-access behavior, source lineage and unqualified pilot
refusals, UUID/namespace protections, full populations, the original G2 bootstrap,
threshold failures/nonfinite/mismatched coverage, and interruption/resume using
tiny real reference arithmetic. They cannot establish real pilot PASS, GPU
throughput, adaptation, serving equivalence or production readiness.
|