HumboldtJoker commited on
Commit
76ed3bf
Β·
verified Β·
1 Parent(s): 51cfc4f

Add training template: launch.sh

Browse files
Files changed (1) hide show
  1. training-template/launch.sh +170 -0
training-template/launch.sh ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # ============================================================================
3
+ # Daimon Training β€” Launch Script
4
+ # Liberation Labs
5
+ # ============================================================================
6
+ #
7
+ # This script runs pre-flight checks and then launches full-parameter SFT
8
+ # via DeepSpeed ZeRO-2 on a single H200 SXM GPU.
9
+ #
10
+ # Usage:
11
+ # bash /workspace/runpod-template/launch.sh
12
+ #
13
+ # To resume from a checkpoint after pod restart:
14
+ # bash /workspace/runpod-template/launch.sh
15
+ # (Automatic β€” the training script finds the latest checkpoint)
16
+ #
17
+ # To use a custom config:
18
+ # DAIMON_CONFIG=/path/to/config.yaml bash /workspace/runpod-template/launch.sh
19
+ #
20
+ # ╔════════════════════════════════════════════════════════════════╗
21
+ # β•‘ AGENT INTERFERENCE GUARD β•‘
22
+ # β•‘ This is FULL SFT. If OOM occurs, adjust batch/seq/accum. β•‘
23
+ # β•‘ DO NOT switch to LoRA/QLoRA. Report errors to Thomas. β•‘
24
+ # β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
25
+ # ============================================================================
26
+
27
+ set -e
28
+
29
+ SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
30
+ CONFIG="${DAIMON_CONFIG:-$SCRIPT_DIR/train_daimon_config.yaml}"
31
+ DS_CONFIG="$SCRIPT_DIR/ds_config_zero2.json"
32
+
33
+ # ── Agent interference check ──────────────────────────────────────────────
34
+ if grep -qi "lora\|peft\|adapter" "$CONFIG" 2>/dev/null; then
35
+ echo "╔══════════════════════════════════════════════════════════╗"
36
+ echo "β•‘ BLOCKED: LoRA/adapter config detected in YAML. β•‘"
37
+ echo "β•‘ This is FULL SFT. Do not modify the training method. β•‘"
38
+ echo "β•‘ If OOM: adjust batch_size, grad_accum, or seq_length. β•‘"
39
+ echo "β•‘ Report errors to Thomas. Do not 'fix' by downgrading. β•‘"
40
+ echo "β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•"
41
+ exit 1
42
+ fi
43
+ if pip list 2>/dev/null | grep -qi "^peft "; then
44
+ echo "WARNING: peft is installed. This is a full SFT pipeline."
45
+ echo "peft should not be in this environment. Continuing but flagging."
46
+ fi
47
+ LOG_DIR="/workspace/daimon-sft/logs"
48
+ mkdir -p "$LOG_DIR"
49
+
50
+ echo "============================================================"
51
+ echo " DAIMON FULL-PARAMETER SFT β€” LAUNCH"
52
+ echo " Liberation Labs"
53
+ echo " $(date)"
54
+ echo "============================================================"
55
+
56
+ # ── Pre-flight checks ──────────────────────────────────────────────────────
57
+
58
+ echo ""
59
+ echo "=== Pre-flight Checks ==="
60
+
61
+ # Check GPU count (need exactly 1 for this config)
62
+ GPU_COUNT=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | wc -l)
63
+ if [ "$GPU_COUNT" -lt 1 ]; then
64
+ echo "FATAL: No GPUs detected."
65
+ exit 1
66
+ fi
67
+ echo " GPUs: $GPU_COUNT"
68
+
69
+ # Check VRAM (need >= 140GB for bf16 model + activations + gradients)
70
+ VRAM_MIB=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -1 | tr -d ' ')
71
+ if [ "$VRAM_MIB" -lt 140000 ]; then
72
+ echo "FATAL: GPU has ${VRAM_MIB} MiB VRAM. Need >= 140,000 MiB (H200 SXM)."
73
+ echo "Full SFT memory budget: ~70GB model + ~20GB activations = ~90GB GPU."
74
+ exit 1
75
+ fi
76
+ echo " VRAM: ${VRAM_MIB} MiB"
77
+
78
+ # Check system RAM (critical for CPU-offloaded optimizer)
79
+ TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
80
+ TOTAL_RAM_GB=$((TOTAL_RAM_KB / 1024 / 1024))
81
+ if [ "$TOTAL_RAM_GB" -lt 180 ]; then
82
+ echo "FATAL: System RAM is ${TOTAL_RAM_GB}GB. Need >= 180GB."
83
+ echo "Adafactor optimizer states (~35GB) + gradients (~70GB) are CPU-offloaded."
84
+ echo "Total CPU memory needed: ~105GB, but need headroom for OS and data loading."
85
+ exit 1
86
+ fi
87
+ echo " System RAM: ${TOTAL_RAM_GB} GB"
88
+
89
+ # Check disk space (full checkpoints are ~70GB each, save_total_limit=3 = ~210GB)
90
+ AVAIL_GB=$(df -BG /workspace | tail -1 | awk '{print $4}' | tr -d 'G')
91
+ if [ "$AVAIL_GB" -lt 200 ]; then
92
+ echo "FATAL: Only ${AVAIL_GB}GB free on /workspace. Need at least 200GB."
93
+ echo "Full model checkpoints are ~70GB each. With save_total_limit=3, need ~210GB."
94
+ exit 1
95
+ fi
96
+ echo " Disk: ${AVAIL_GB}GB free"
97
+
98
+ # Check model exists (either local or will be pulled from HF)
99
+ MODEL_DIR="/workspace/models/Qwen3.6-35B-A3B"
100
+ if [ -d "$MODEL_DIR" ] && [ -f "$MODEL_DIR/config.json" ]; then
101
+ echo " Model: $MODEL_DIR (local)"
102
+ else
103
+ echo " Model: will use HuggingFace ID from config"
104
+ if [ -z "$HF_TOKEN" ]; then
105
+ echo " WARNING: HF_TOKEN not set. May fail if model is gated."
106
+ fi
107
+ fi
108
+
109
+ # Check config exists
110
+ if [ ! -f "$CONFIG" ]; then
111
+ echo "FATAL: Config not found at $CONFIG"
112
+ exit 1
113
+ fi
114
+ echo " Config: $CONFIG"
115
+
116
+ # Check DeepSpeed config exists
117
+ if [ ! -f "$DS_CONFIG" ]; then
118
+ echo "FATAL: DeepSpeed config not found at $DS_CONFIG"
119
+ exit 1
120
+ fi
121
+ echo " DeepSpeed: $DS_CONFIG"
122
+
123
+ # Check training script exists
124
+ TRAIN_SCRIPT="$SCRIPT_DIR/train_daimon.py"
125
+ if [ ! -f "$TRAIN_SCRIPT" ]; then
126
+ echo "FATAL: Training script not found at $TRAIN_SCRIPT"
127
+ exit 1
128
+ fi
129
+ echo " Script: $TRAIN_SCRIPT"
130
+
131
+ # Check for existing checkpoints (resume support)
132
+ OUTPUT_DIR=$(python3 -c "import yaml; print(yaml.safe_load(open('$CONFIG'))['output_dir'])" 2>/dev/null || echo "/workspace/daimon-sft")
133
+ CKPT_COUNT=$(find "$OUTPUT_DIR" -maxdepth 1 -name "checkpoint-*" -type d 2>/dev/null | wc -l)
134
+ if [ "$CKPT_COUNT" -gt 0 ]; then
135
+ LATEST_CKPT=$(ls -dt "$OUTPUT_DIR"/checkpoint-* 2>/dev/null | head -1)
136
+ echo " Resume: $CKPT_COUNT checkpoint(s) found, will resume from $LATEST_CKPT"
137
+ else
138
+ echo " Resume: No checkpoints found, starting fresh"
139
+ fi
140
+
141
+ echo ""
142
+ echo "Pre-flight: PASSED"
143
+
144
+ # ── CUDA settings ──────────────────────────────────────────────────────────
145
+ export PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True"
146
+ export CUDA_DEVICE_MAX_CONNECTIONS=1
147
+
148
+ # Disable tokenizer parallelism (avoids fork deadlocks with DataLoader)
149
+ export TOKENIZERS_PARALLELISM=false
150
+
151
+ # ── Launch training via DeepSpeed ─────────────────────────────────────────
152
+ echo ""
153
+ echo "=== Launching Training ==="
154
+ echo " Command: deepspeed --num_gpus=1 $TRAIN_SCRIPT --deepspeed $DS_CONFIG --config $CONFIG"
155
+ echo " Logging to: $LOG_DIR/"
156
+ echo ""
157
+
158
+ # DeepSpeed launcher handles process management and ZeRO initialization.
159
+ # Single GPU β€” no NCCL communication needed.
160
+ deepspeed --num_gpus=1 "$TRAIN_SCRIPT" \
161
+ --deepspeed "$DS_CONFIG" \
162
+ --config "$CONFIG" \
163
+ 2>&1 | tee "$LOG_DIR/training_$(date +%Y%m%d_%H%M%S).log"
164
+
165
+ echo ""
166
+ echo "============================================================"
167
+ echo " TRAINING FINISHED"
168
+ echo " $(date)"
169
+ echo " Output: $OUTPUT_DIR"
170
+ echo "============================================================"