#!/usr/bin/env bash # VLA + CoT smoke test — end-to-end on a 5090 in ~45-90 min. # # Steps: # 1. Pick 30 train clips (15 pos + 15 neg) → GPT-4o CoT labels (~4 min, ~$0.30) # 2. Pick a disjoint 20 clips for local eval (list only — no CoT needed) # 3. LoRA-train Qwen2.5-VL-3B on the 30-clip CoT set (~20-40 min) # 4. Infer on the 20 eval clips, compute local AP/AUC # # Hard-fail on any error so we catch issues early. set -euo pipefail cd "$(dirname "$0")/../.." ROOT="$(pwd)" export PYTHONUNBUFFERED=1 export TOKENIZERS_PARALLELISM=false export OPENAI_API_KEY="$(cat ~/Desktop/openai_api_key.txt | tr -d '[:space:]')" TRAIN_CSV="nexar-collision-prediction/train.csv" VIDEO_DIR="nexar-collision-prediction/train" COT_OUT="data/vla_cot/smoke_train_cot.jsonl" EVAL_CSV="data/vla_cot/smoke_eval.csv" CKPT_DIR="checkpoints/VLA/qwen_cot_smoke" INFER_OUT="eval_results/vla_cot_smoke/eval_scores.csv" LOG_DIR="runs/vla_cot_smoke" mkdir -p "$LOG_DIR" "$(dirname "$EVAL_CSV")" "$(dirname "$INFER_OUT")" N_TRAIN=30 # CoT clips → teacher distil N_EVAL=20 # local eval clips (disjoint) SEED=0 echo "==== [1/4] Build eval split (disjoint from training) ====" python - <&1 | tee "${LOG_DIR}/01_cot.log" echo echo "==== [3/4] LoRA-train Qwen2.5-VL-3B on CoT ====" python -m training.VLA.train_vla_cot \ --cot_jsonl "${COT_OUT}" \ --video_dir "${VIDEO_DIR}" \ --out_dir "${CKPT_DIR}" \ --lora_r 32 --lora_alpha 16 --lora_dropout 0.05 \ --lr 2e-4 \ --epochs 3 \ --batch_size 1 --grad_accum 4 \ --n_frames 8 --resize_short 336 \ --seed ${SEED} \ 2>&1 | tee "${LOG_DIR}/02_train.log" echo echo "==== [4/4] Inference + local AP ====" python -m training.VLA.infer_vla_cot \ --base_model Qwen/Qwen2.5-VL-3B-Instruct \ --lora_dir "${CKPT_DIR}/best" \ --video_dir "${VIDEO_DIR}" \ --ids_csv "${EVAL_CSV}" \ --out_csv "${INFER_OUT}" \ --n_frames 8 --resize_short 336 \ 2>&1 | tee "${LOG_DIR}/03_infer.log" echo echo "==== DONE ====" echo "Logs : ${LOG_DIR}/" echo "Scores : ${INFER_OUT}" echo "Ckpt : ${CKPT_DIR}/best"