File size: 6,850 Bytes
b3b21cc | 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 | #!/usr/bin/env bash
# =============================================================================
# Corrected finisher. The driver (mix64k_h200.sh) cannot run the evals:
# run_seg 695 waits for a checkpoint at step 695, but CP_CKPT_FREQ=100 means
# none can exist (695 % 100 = 95). So its watcher never fired, training ran
# straight to CP_MAX_STEPS=1300, and the driver will die at
# "step 695 checkpoint missing". The training itself is CORRECT and complete --
# only the eval orchestration is lost.
#
# This runs the evals itself off the janitor-preserved keep_step_*.ckpt, which
# exist at every multiple of 100 precisely because the janitor copies rank_0
# before CP_CKPT_KEEP can prune it. Eval loads rank_0 only (NP=1), so that is
# all it needs.
#
# 1. wait for the trainer to exit (eval needs the GPUs)
# 2. eval step 1200 at 4 lengths, one GPU each
# 3. plot+upload as 32,744 lands, again when 65,512 lands
# 4. cliff verdict; if CLIFF, also eval the last pre-cliff checkpoint
# 5. upload everything byte-verified, print a teardown verdict
# =============================================================================
set -uo pipefail
cd "$(dirname "$0")"
source /root/Adhi/BluTrain/envv/bin/activate
export LD_LIBRARY_PATH="/root/Adhi/BluTrain/Tensor-Implementations/lib:/root/Adhi/BluTrain/Profiler/lib:${LD_LIBRARY_PATH:-}"
PY=python; HF=hf
REPO=unparallelled/BluScriptCP
LOG=mix64k_logs; CK=checkpoints_bluscriptcp/rank_0
T=65536; ORIG=32768; SCALE=2
DATA=Data_Loader/Data/mix50
HAY="$PWD/Data_Loader/Data/b2_8192_16384/val_shard_00000.bin"
F="$LOG/finish.log"; : > "$F"
say(){ echo "[$(date -u +%H:%M:%S)] $*" | tee -a "$F" >&2; }
up(){ local src=$1 dst=$2
[ -e "$src" ] || { say " MISSING (not uploaded): $src"; return 1; }
$HF upload "$REPO" "$src" "$dst" >>"$LOG/upload.log" 2>&1 || { say " UPLOAD FAILED $dst"; return 1; }
if [ -f "$src" ]; then
$PY - "$REPO" "$src" "$dst" <<'PYEOF' | tee -a "$F"
import sys, os
from huggingface_hub import HfApi
repo, loc, rem = sys.argv[1], sys.argv[2], sys.argv[3]
want=os.path.getsize(loc)
got={f.rfilename:(f.size or 0) for f in HfApi().repo_info(repo,files_metadata=True).siblings}.get(rem)
print((" VERIFIED " if got==want else " *** MISMATCH/ABSENT ")+f"{rem} local={want:,} remote={got}")
sys.exit(0 if got==want else 1)
PYEOF
else say " sent (dir) $dst"; fi
}
plot(){ $PY mk_mix64k_plots.py --tag "$1" --out mix64k_results >>"$F" 2>&1 \
&& say " plotted mix64k_results_$1.{png,html}" || say " PLOT FAILED ($1)"; }
run_eval(){ # $1 = tag $2 = ckpt basename in rank_0
local TAG=$1 CKF=$2
[ -f "$CK/$CKF" ] || { say "eval $TAG: $CKF absent, SKIP"; return 1; }
say "EVAL $TAG from $CKF -- 4 lengths, one GPU each"
for LEN in 8192 16360 32744 65512; do
( GEN_DATA_ROOT=$DATA HAY="$HAY" PY=$PY OUT=mix64k_${TAG}_len_$LEN TASKS="niah_single" \
CKPTS="m$TAG" N=100 PROMPT_LEN=$LEN MAX_NEW=24 T=$T \
DEPTHS="0.0,0.25,0.5,0.75,1.0" YARN_ORIG=$ORIG YARN=$SCALE \
GPUS=$(( (LEN==8192)?0:(LEN==16360)?1:(LEN==32744)?2:3 )) JOBS_PER_GPU=1 \
BF16=1 GREEDY=1 CKPT_EXTRA="m$TAG=$CKF" ./run_longeval.sh \
>> "$LOG/eval_${TAG}_$LEN.log" 2>&1 ) &
done
# plot as soon as 32,744 scores, without waiting for the slow 65,512 job
( for i in $(seq 1 400); do
[ -s "mix64k_${TAG}_len_32744/summary.csv" ] && break; sleep 20; done
for L in 8192 16360 32744; do
v=$(sed -n 2p "mix64k_${TAG}_len_$L/summary.csv" 2>/dev/null); say " $TAG len $L -> ${v:-pending}"; done
plot "$TAG"
up "mix64k_results_${TAG}.png" "plots/mix64k_results_${TAG}.png"
up "mix64k_results_${TAG}.html" "plots/mix64k_results_${TAG}.html"
say " EARLY PLOT for $TAG is on HF (8k/16k/32k)" ) &
wait
for LEN in 8192 16360 32744 65512; do
v=$(sed -n 2p "mix64k_${TAG}_len_$LEN/summary.csv" 2>/dev/null)
say " FINAL $TAG len $LEN -> ${v:-NO RESULT}"
done
plot "$TAG"
up "mix64k_results_${TAG}.png" "plots/mix64k_results_${TAG}.png"
up "mix64k_results_${TAG}.html" "plots/mix64k_results_${TAG}.html"
}
say "=== corrected finisher armed ==="
say "waiting for the trainer to exit (it runs to step 1300, then frees the GPUs)"
for i in $(seq 1 900); do
pgrep -f 'build/bluscriptCP_exe[c]' >/dev/null || break
sleep 20
done
sleep 20
say "trainer exited; last step: $(grep -aE '^step +[0-9]+' "$LOG/train.log" | tail -1 | grep -oE '^step +[0-9]+')"
say "preserved checkpoints: $(ls $CK/keep_step_*.ckpt 2>/dev/null | wc -l)"
# ---- FINAL checkpoint first. Eval 1200 only if the final looks BAD. --------
FIN=$(ls $CK/keep_step_*.ckpt 2>/dev/null | sed -E 's/.*keep_step_([0-9]+)\.ckpt/\1/' | sort -n | tail -1)
[ -n "$FIN" ] || { say "no preserved checkpoint to evaluate"; FIN=""; }
if [ -n "$FIN" ]; then
say "=== evaluating the FINAL checkpoint, step $FIN ==="
run_eval "$FIN" "keep_step_${FIN}.ckpt"
say "--- verdict for step $FIN against the parent (67/65/52/29) ---"
$PY /root/verdict.py "$FIN" 2>&1 | tee -a "$F"
VER=$($PY /root/verdict.py "$FIN" 2>/dev/null | grep -oE '^VERDICT [A-Z]+' | awk '{print $2}')
say "verdict: ${VER:-UNKNOWN}"
if [ "$VER" = "BAD" ] || [ "$VER" = "UNKNOWN" ]; then
say "=== final is ${VER} -- evaluating step 1200 to bracket where it turned ==="
[ -f "$CK/keep_step_1200.ckpt" ] && run_eval 1200 keep_step_1200.ckpt \
|| say " keep_step_1200.ckpt absent"
else
say "=== final is GOOD -- skipping the 1200 eval (saves ~38 min of GPU) ==="
fi
fi
read -r V O B C <<<"$($PY /root/cliff.py "$LOG/train.log")"
say "cliff detector on the MIX run: $V (onset=$O baseline=$B current=$C)"
say " for contrast, 100% b5 from the SAME parent: CLIFF at step 1199, ended 45/17/2/1"
if [ "$V" = "CLIFF" ]; then
PRE=$(( ((O - 49) / 100) * 100 ))
say "cliff at $O -- also evaluating the pre-cliff checkpoint at $PRE"
[ -f "$CK/keep_step_${PRE}.ckpt" ] && run_eval "pre${PRE}" "keep_step_${PRE}.ckpt"
fi
say "=== uploading everything ==="
for d in mix64k_*_len_*; do [ -d "$d" ] && up "$d" "logs/$d/"; done
up "$LOG/master.log" "logs/mix64k/master.log"
up "$LOG/train.log" "logs/mix64k/train.log"
up "$LOG/probe.log" "logs/mix64k/probe.log"
up "$F" "logs/mix64k/finish.log"
for f in mix64k_h200.sh finish2_mix64k.sh mk_mix64k_plots.py mix_buckets.py; do up "$f" "scripts/$f"; done
up "$DATA/MANIFEST.txt" "docs/mix50_MANIFEST.txt"
say "=== uploading model checkpoints (rank_0; eval and CP_INIT_FROM need only this) ==="
for k in $CK/keep_step_*.ckpt; do
[ -e "$k" ] || continue
s=$(basename "$k" | grep -oE '[0-9]+')
up "$k" "checkpoints/mix64k_step_${s}.ckpt"
done
BAD=$(grep -c 'MISMATCH/ABSENT\|UPLOAD FAILED\|MISSING (not uploaded)' "$F" 2>/dev/null || echo 0)
[ "$BAD" -eq 0 ] && say "=== ALL UPLOADS VERIFIED -- safe to tear down ===" \
|| say "=== $BAD UPLOAD PROBLEM(S) -- DO NOT TEAR DOWN ==="
|