VLAlert / training /Policy /run_v3_alert_fix.sh
AsianPlayer's picture
Add VLAlert code
1e05592 verified
Raw
History Blame Contribute Delete
5.81 kB
#!/usr/bin/env bash
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# V3 baseline ไธŠ็š„ ALERT/OBSERVE ๆผๆ’ญไฟฎๅค A/B ๅฏน็…ง
# ไฝฟ็”จ็Žฐๆœ‰ legacy mean_pool cache: data/belief_cache/{train,val}.pt
# ๆ— ้œ€้‡ๅปบ cache, ็›ดๆŽฅๅœจ v3 trainer ไธŠๅš loss-only ไฟฎๅค.
#
# 4 ไธชๅฎž้ชŒ:
# v3_baseline ่€้…็ฝฎ, ๆ— ไฟฎๅค (ๅค็Žฐ 32% ๆผๆ’ญ)
# v3_F1_only +cost_lambda=0.3
# v3_F2_only +ordinal_lambda=0.2
# v3_F1F2_full +cost_lambda=0.3 +ordinal_lambda=0.2 (ๆŽจ่)
#
# ๆ—ถ้•ฟ: ๅ•ๅฎž้ชŒ ~12-15 min (cache ๆจกๅผ, 15 epoch, early stop ~3 epoch)
# 4 ไธชไธฒ่กŒ ~1h
#
# Usage:
# bash training/Policy/run_v3_alert_fix.sh # ๅ…จ้ƒจ 4 ็ป„
# SKIP_BASELINE=1 bash training/Policy/run_v3_alert_fix.sh # ่ทณ่ฟ‡ baseline
# ONLY_FULL=1 bash training/Policy/run_v3_alert_fix.sh # ๅช่ท‘ F1+F2
# bash training/Policy/run_v3_alert_fix.sh --debug # 128 ๆ ทๆœฌๅฟซๆต‹
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
set -euo pipefail
cd "$(dirname "$0")/../.."
source ~/miniconda3/etc/profile.d/conda.sh 2>/dev/null || true
conda activate lkalert 2>/dev/null || true
SFT_CKPT="${SFT_CKPT:-checkpoints/SFT/sft_v2/best}"
LABEL_DIR="${LABEL_DIR:-data/policy_labels}"
CACHE_DIR="${CACHE_DIR:-data/belief_cache}"
OUTPUT_DIR="${OUTPUT_DIR:-checkpoints/Policy}"
NUM_EPOCHS="${NUM_EPOCHS:-15}"
BATCH_SIZE="${BATCH_SIZE:-256}"
LR="${LR:-3e-4}"
PATIENCE="${PATIENCE:-5}"
GPU="${GPU:-0}"
RUNS_DIR="${RUNS_DIR:-runs/v3_alert_fix}"
DEBUG_FLAG=""
for a in "$@"; do [[ "$a" == "--debug" ]] && DEBUG_FLAG="--debug"; done
export CUDA_VISIBLE_DEVICES="${GPU}"
mkdir -p "${RUNS_DIR}"
run_one () {
local name="$1"; shift
local extra="$*"
local ts="$(date +%Y%m%d_%H%M%S)"
local log="${RUNS_DIR}/${name}_${ts}.log"
echo
echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•"
echo " EXP: ${name} extra: ${extra}"
echo " log โ†’ ${log}"
echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•"
python -m training.Policy.warm_start_trainer \
--sft_checkpoint "${SFT_CKPT}" \
--label_dir "${LABEL_DIR}" \
--belief_cache_dir "${CACHE_DIR}" \
--output_dir "${OUTPUT_DIR}" \
--experiment_name "${name}" \
--num_epochs "${NUM_EPOCHS}" \
--batch_size "${BATCH_SIZE}" \
--learning_rate "${LR}" \
--focal_alpha 0.1 0.3 0.6 \
--focal_gamma 2.0 \
--belief_noise_std 0.01 \
--label_smoothing 0.1 \
--use_balanced_sampler \
--early_stop_patience "${PATIENCE}" \
--val_every_n_steps 200 \
${DEBUG_FLAG} \
${extra} 2>&1 | tee "${log}"
}
# โ”€โ”€ 4 ไธชๅฎž้ชŒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if [[ "${ONLY_FULL:-0}" == "1" ]]; then
run_one "v3_F1F2_full" --cost_lambda 0.3 --ordinal_lambda 0.2 --ordinal_margin 0.2
else
[[ "${SKIP_BASELINE:-0}" != "1" ]] && \
run_one "v3_baseline"
run_one "v3_F1_only" --cost_lambda 0.3 --ordinal_lambda 0
run_one "v3_F2_only" --cost_lambda 0 --ordinal_lambda 0.2 --ordinal_margin 0.2
run_one "v3_F1F2_full" --cost_lambda 0.3 --ordinal_lambda 0.2 --ordinal_margin 0.2
fi
# โ”€โ”€ ๆฑ‡ๆ€ปๅฏนๆฏ”่กจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
echo
echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•"
echo " ๆฑ‡ๆ€ป: 4 ็ป„ๅฎž้ชŒๅ…ณ้”ฎๆŒ‡ๆ ‡ (val best ckpt)"
echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•"
python3 - <<PY
import json, pathlib
rows = []
for name in ("v3_baseline", "v3_F1_only", "v3_F2_only", "v3_F1F2_full"):
p = pathlib.Path("${OUTPUT_DIR}") / name / "best" / "policy_meta.json"
if not p.exists():
continue
d = json.loads(p.read_text())
rows.append((
name,
d.get("policy_score", 0),
d.get("ego_alert_recall", 0),
d.get("alert_leak_to_observe", float('nan')),
d.get("alert_leak_to_silent", float('nan')),
d.get("safe_neg_silent_rate", 0),
d.get("overall_acc", 0),
))
print(f"{'experiment':<22}{'PScore':>9}{'ego_rec':>9}{'leakโ†’O':>9}{'leakโ†’S':>9}{'sn_silent':>11}{'acc':>8}")
print("โ”€" * 78)
for r in rows:
leak_o = f"{r[3]:.3f}" if r[3] == r[3] else " n/a"
leak_s = f"{r[4]:.3f}" if r[4] == r[4] else " n/a"
print(f"{r[0]:<22}{r[1]:>9.4f}{r[2]:>9.3f}{leak_o:>9}{leak_s:>9}{r[5]:>11.3f}{r[6]:>8.3f}")
print()
print("่งฃ่ฏป: leakโ†’O ๆ˜ฏๆ ธๅฟƒๆŒ‡ๆ ‡. v3_baseline ๅบ” โ‰ˆ0.32, F1+F2 ็›ฎๆ ‡ โ‰ค0.10.")
PY