File size: 4,585 Bytes
0eca069
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/bin/bash
# Batch experiment runner for PoisonClaw
# Submits all ablation experiments sequentially on the local A100

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
cd "$ROOT_DIR"

SEEDS=(42 123 456)
LOG_DIR="outputs/logs"
mkdir -p "$LOG_DIR"

echo "=== PoisonClaw Batch Experiments ==="
echo "Root: $ROOT_DIR"
echo "Seeds: ${SEEDS[*]}"
echo ""

# ──────────────────────────────────────────────────────
# Helper: run a single training job
# ──────────────────────────────────────────────────────
run_job() {
    local name="$1"
    local config="$2"
    shift 2
    local overrides="$@"
    local log_file="$LOG_DIR/${name}.log"

    echo "[$(date '+%H:%M:%S')] Starting: $name"
    echo "  config=$config overrides='$overrides'"

    python scripts/train.py \
        --config "$config" \
        $overrides \
        >"$log_file" 2>&1 && \
        echo "[$(date '+%H:%M:%S')] DONE: $name" || \
        echo "[$(date '+%H:%M:%S')] FAILED: $name (see $log_file)"
}

# ──────────────────────────────────────────────────────
# Experiment 1: Main attack (3 seeds Γ— 2 models Γ— GRPO)
# ──────────────────────────────────────────────────────
if [[ "${RUN_MAIN:-1}" == "1" ]]; then
    echo "--- Experiment 1: Main Attack ---"
    for seed in "${SEEDS[@]}"; do
        run_job "main_qwen2b_grpo_seed${seed}" \
            configs/experiment/main_attack.yaml \
            --model configs/model/qwen2vl_2b.yaml \
            --algorithm grpo \
            --seed "$seed"
        run_job "main_paligemma3b_grpo_seed${seed}" \
            configs/experiment/main_attack.yaml \
            --model configs/model/paligemma_3b.yaml \
            --algorithm grpo \
            --seed "$seed"
    done
fi

# ──────────────────────────────────────────────────────
# Experiment 2: Friction Gap Ξ”L ablation
# ──────────────────────────────────────────────────────
if [[ "${RUN_FRICTION:-0}" == "1" ]]; then
    echo "--- Experiment 2: Friction Gap Ablation ---"
    for dl in 0 1 2 3 5 8 10; do
        for seed in "${SEEDS[@]}"; do
            run_job "friction_dl${dl}_seed${seed}" \
                configs/experiment/ablation_friction.yaml \
                --override "attack.friction_gap=${dl}" \
                --seed "$seed"
        done
    done
fi

# ──────────────────────────────────────────────────────
# Experiment 3: Poisoning Ratio Ξ² ablation
# ──────────────────────────────────────────────────────
if [[ "${RUN_BETA:-0}" == "1" ]]; then
    echo "--- Experiment 3: Poisoning Ratio Ablation ---"
    for beta in 0.01 0.03 0.05 0.10 0.20 0.50; do
        for seed in "${SEEDS[@]}"; do
            run_job "beta${beta}_seed${seed}" \
                configs/experiment/ablation_beta.yaml \
                --override "attack.poisoning_ratio=${beta}" \
                --seed "$seed"
        done
    done
fi

# ──────────────────────────────────────────────────────
# Experiment 4: Discount Factor Ξ³ ablation
# ──────────────────────────────────────────────────────
if [[ "${RUN_GAMMA:-0}" == "1" ]]; then
    echo "--- Experiment 4: Discount Factor Ablation ---"
    for gamma in 0.90 0.95 0.99 0.999; do
        for seed in "${SEEDS[@]}"; do
            run_job "gamma${gamma}_seed${seed}" \
                configs/experiment/ablation_gamma.yaml \
                --override "trainer.discount_factor=${gamma}" \
                --seed "$seed"
        done
    done
fi

echo ""
echo "=== Batch run complete. Logs in $LOG_DIR ==="