| #!/bin/bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| set -e |
|
|
| SCRIPT_DIR=$(dirname "$(readlink -f "$0")") |
| CONFIG="${DAIMON_CONFIG:-$SCRIPT_DIR/train_daimon_config.yaml}" |
| DS_CONFIG="$SCRIPT_DIR/ds_config_zero2.json" |
|
|
| |
| if grep -qi "lora\|peft\|adapter" "$CONFIG" 2>/dev/null; then |
| echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" |
| echo "β BLOCKED: LoRA/adapter config detected in YAML. β" |
| echo "β This is FULL SFT. Do not modify the training method. β" |
| echo "β If OOM: adjust batch_size, grad_accum, or seq_length. β" |
| echo "β Report errors to Thomas. Do not 'fix' by downgrading. β" |
| echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" |
| exit 1 |
| fi |
| if pip list 2>/dev/null | grep -qi "^peft "; then |
| echo "WARNING: peft is installed. This is a full SFT pipeline." |
| echo "peft should not be in this environment. Continuing but flagging." |
| fi |
| LOG_DIR="/workspace/daimon-sft/logs" |
| mkdir -p "$LOG_DIR" |
|
|
| echo "============================================================" |
| echo " DAIMON FULL-PARAMETER SFT β LAUNCH" |
| echo " Liberation Labs" |
| echo " $(date)" |
| echo "============================================================" |
|
|
| |
|
|
| echo "" |
| echo "=== Pre-flight Checks ===" |
|
|
| |
| GPU_COUNT=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | wc -l) |
| if [ "$GPU_COUNT" -lt 1 ]; then |
| echo "FATAL: No GPUs detected." |
| exit 1 |
| fi |
| echo " GPUs: $GPU_COUNT" |
|
|
| |
| VRAM_MIB=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -1 | tr -d ' ') |
| if [ "$VRAM_MIB" -lt 140000 ]; then |
| echo "FATAL: GPU has ${VRAM_MIB} MiB VRAM. Need >= 140,000 MiB (H200 SXM)." |
| echo "Full SFT memory budget: ~70GB model + ~20GB activations = ~90GB GPU." |
| exit 1 |
| fi |
| echo " VRAM: ${VRAM_MIB} MiB" |
|
|
| |
| TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}') |
| TOTAL_RAM_GB=$((TOTAL_RAM_KB / 1024 / 1024)) |
| if [ "$TOTAL_RAM_GB" -lt 180 ]; then |
| echo "FATAL: System RAM is ${TOTAL_RAM_GB}GB. Need >= 180GB." |
| echo "Adafactor optimizer states (~35GB) + gradients (~70GB) are CPU-offloaded." |
| echo "Total CPU memory needed: ~105GB, but need headroom for OS and data loading." |
| exit 1 |
| fi |
| echo " System RAM: ${TOTAL_RAM_GB} GB" |
|
|
| |
| AVAIL_GB=$(df -BG /workspace | tail -1 | awk '{print $4}' | tr -d 'G') |
| if [ "$AVAIL_GB" -lt 200 ]; then |
| echo "FATAL: Only ${AVAIL_GB}GB free on /workspace. Need at least 200GB." |
| echo "Full model checkpoints are ~70GB each. With save_total_limit=3, need ~210GB." |
| exit 1 |
| fi |
| echo " Disk: ${AVAIL_GB}GB free" |
|
|
| |
| MODEL_DIR="/workspace/models/Qwen3.6-35B-A3B" |
| if [ -d "$MODEL_DIR" ] && [ -f "$MODEL_DIR/config.json" ]; then |
| echo " Model: $MODEL_DIR (local)" |
| else |
| echo " Model: will use HuggingFace ID from config" |
| if [ -z "$HF_TOKEN" ]; then |
| echo " WARNING: HF_TOKEN not set. May fail if model is gated." |
| fi |
| fi |
|
|
| |
| if [ ! -f "$CONFIG" ]; then |
| echo "FATAL: Config not found at $CONFIG" |
| exit 1 |
| fi |
| echo " Config: $CONFIG" |
|
|
| |
| if [ ! -f "$DS_CONFIG" ]; then |
| echo "FATAL: DeepSpeed config not found at $DS_CONFIG" |
| exit 1 |
| fi |
| echo " DeepSpeed: $DS_CONFIG" |
|
|
| |
| TRAIN_SCRIPT="$SCRIPT_DIR/train_daimon.py" |
| if [ ! -f "$TRAIN_SCRIPT" ]; then |
| echo "FATAL: Training script not found at $TRAIN_SCRIPT" |
| exit 1 |
| fi |
| echo " Script: $TRAIN_SCRIPT" |
|
|
| |
| OUTPUT_DIR=$(python3 -c "import yaml; print(yaml.safe_load(open('$CONFIG'))['output_dir'])" 2>/dev/null || echo "/workspace/daimon-sft") |
| CKPT_COUNT=$(find "$OUTPUT_DIR" -maxdepth 1 -name "checkpoint-*" -type d 2>/dev/null | wc -l) |
| if [ "$CKPT_COUNT" -gt 0 ]; then |
| LATEST_CKPT=$(ls -dt "$OUTPUT_DIR"/checkpoint-* 2>/dev/null | head -1) |
| echo " Resume: $CKPT_COUNT checkpoint(s) found, will resume from $LATEST_CKPT" |
| else |
| echo " Resume: No checkpoints found, starting fresh" |
| fi |
|
|
| echo "" |
| echo "Pre-flight: PASSED" |
|
|
| |
| export PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True" |
| export CUDA_DEVICE_MAX_CONNECTIONS=1 |
|
|
| |
| export TOKENIZERS_PARALLELISM=false |
|
|
| |
| echo "" |
| echo "=== Launching Training ===" |
| echo " Command: deepspeed --num_gpus=1 $TRAIN_SCRIPT --deepspeed $DS_CONFIG --config $CONFIG" |
| echo " Logging to: $LOG_DIR/" |
| echo "" |
|
|
| |
| |
| deepspeed --num_gpus=1 "$TRAIN_SCRIPT" \ |
| --deepspeed "$DS_CONFIG" \ |
| --config "$CONFIG" \ |
| 2>&1 | tee "$LOG_DIR/training_$(date +%Y%m%d_%H%M%S).log" |
|
|
| echo "" |
| echo "============================================================" |
| echo " TRAINING FINISHED" |
| echo " $(date)" |
| echo " Output: $OUTPUT_DIR" |
| echo "============================================================" |
|
|