File size: 5,585 Bytes
b4b2877
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/bash
# Exp1 small3: Data augmentation + Frozen pretrained IMU + Label smoothing
# Goal: Break the IMU-alone F1=0.771 ceiling with emg+imu fusion
# Phase 0: pretrain IMU with hidden_dim=48 (matches fusion branch)
# Baselines: IMU+aug+ls, emg+imu early+aug+ls
# Group A: 7 fusion + aug + ls (no freeze)
# Group B: 7 fusion + frozen IMU + ls (no aug)  [dep: phase0]
# Group C: 7 fusion + frozen IMU + aug + ls      [dep: phase0]
# Total: 1 + 2 + 7 + 7 + 7 = 24 jobs

PYTHON=python
SCRIPT=${PULSE_ROOT}/experiments/train_exp1.py
OUTDIR=${PULSE_ROOT}/results/exp1_small3
LOGDIR=${OUTDIR}/slurm_logs
mkdir -p $LOGDIR

COMMON="--model transformer --epochs 100 --batch_size 16 --lr 1e-3 --weight_decay 1e-3 --hidden_dim 32 --downsample 5 --patience 15 --seed 42"
FUSIONS=(late attention weighted_late gated_late stacking product moe)

# ============================================================
# Phase 0: Pretrain IMU with hidden_dim=48 (matches fusion branch)
# ============================================================
PHASE0_JOB=$(sbatch --parsable \
    -J "s3_phase0_imu48" \
    -p gpuA800 \
    --gres=gpu:1 \
    -N 1 -n 1 \
    --cpus-per-task=8 \
    --mem=32G \
    -t 1:00:00 \
    -o "${LOGDIR}/phase0_imu48_%j.out" \
    -e "${LOGDIR}/phase0_imu48_%j.err" \
    --export=ALL \
    --wrap="export PYTHONUNBUFFERED=1; cd ${PULSE_ROOT}; $PYTHON $SCRIPT --model transformer --fusion early --modalities imu --hidden_dim 48 --epochs 100 --batch_size 16 --lr 1e-3 --weight_decay 1e-3 --downsample 5 --patience 15 --seed 42 --output_dir ${OUTDIR}/phase0")
echo "Phase 0 (IMU h48): job $PHASE0_JOB"

PRETRAINED="${OUTDIR}/phase0/transformer_imu_early/model_best.pt"

# ============================================================
# Baselines (no dependency)
# ============================================================

# Baseline 1: IMU alone + augment + label_smoothing
sbatch \
    -J "s3_bl_imu_aug" \
    -p gpuA800 \
    --gres=gpu:1 \
    -N 1 -n 1 \
    --cpus-per-task=8 \
    --mem=32G \
    -t 1:00:00 \
    -o "${LOGDIR}/bl_imu_aug_%j.out" \
    -e "${LOGDIR}/bl_imu_aug_%j.err" \
    --export=ALL \
    --wrap="export PYTHONUNBUFFERED=1; cd ${PULSE_ROOT}; $PYTHON $SCRIPT --fusion early --modalities imu $COMMON --augment --label_smoothing 0.1 --tag bl_aug --output_dir $OUTDIR"
echo "Submitted: baseline IMU+aug+ls"

# Baseline 2: emg,imu early + augment + label_smoothing
sbatch \
    -J "s3_bl_ei_aug" \
    -p gpuA800 \
    --gres=gpu:1 \
    -N 1 -n 1 \
    --cpus-per-task=8 \
    --mem=32G \
    -t 1:00:00 \
    -o "${LOGDIR}/bl_ei_aug_%j.out" \
    -e "${LOGDIR}/bl_ei_aug_%j.err" \
    --export=ALL \
    --wrap="export PYTHONUNBUFFERED=1; cd ${PULSE_ROOT}; $PYTHON $SCRIPT --fusion early --modalities emg,imu $COMMON --augment --label_smoothing 0.1 --tag bl_aug --output_dir $OUTDIR"
echo "Submitted: baseline emg+imu early+aug+ls"

# ============================================================
# Group A: emg+imu x 7 fusion + augment + label_smoothing (no freeze)
# ============================================================
for fusion in "${FUSIONS[@]}"; do
    sbatch \
        -J "s3_A_${fusion}" \
        -p gpuA800 \
        --gres=gpu:1 \
        -N 1 -n 1 \
        --cpus-per-task=8 \
        --mem=32G \
        -t 1:00:00 \
        -o "${LOGDIR}/grpA_${fusion}_%j.out" \
        -e "${LOGDIR}/grpA_${fusion}_%j.err" \
        --export=ALL \
        --wrap="export PYTHONUNBUFFERED=1; cd ${PULSE_ROOT}; $PYTHON $SCRIPT --fusion $fusion --modalities emg,imu $COMMON --augment --label_smoothing 0.1 --tag grpA --output_dir $OUTDIR"
    echo "Submitted: Group A $fusion"
done

# ============================================================
# Group B: emg+imu x 7 fusion + frozen IMU + label_smoothing (no augment)
# Depends on Phase 0
# ============================================================
for fusion in "${FUSIONS[@]}"; do
    sbatch \
        --dependency=afterok:${PHASE0_JOB} \
        -J "s3_B_${fusion}" \
        -p gpuA800 \
        --gres=gpu:1 \
        -N 1 -n 1 \
        --cpus-per-task=8 \
        --mem=32G \
        -t 1:00:00 \
        -o "${LOGDIR}/grpB_${fusion}_%j.out" \
        -e "${LOGDIR}/grpB_${fusion}_%j.err" \
        --export=ALL \
        --wrap="export PYTHONUNBUFFERED=1; cd ${PULSE_ROOT}; $PYTHON $SCRIPT --fusion $fusion --modalities emg,imu $COMMON --label_smoothing 0.1 --pretrained_backbone $PRETRAINED --freeze_backbone_idx 1 --tag grpB --output_dir $OUTDIR"
    echo "Submitted: Group B $fusion (dep: $PHASE0_JOB)"
done

# ============================================================
# Group C: emg+imu x 7 fusion + frozen IMU + augment + label_smoothing
# Depends on Phase 0
# ============================================================
for fusion in "${FUSIONS[@]}"; do
    sbatch \
        --dependency=afterok:${PHASE0_JOB} \
        -J "s3_C_${fusion}" \
        -p gpuA800 \
        --gres=gpu:1 \
        -N 1 -n 1 \
        --cpus-per-task=8 \
        --mem=32G \
        -t 1:00:00 \
        -o "${LOGDIR}/grpC_${fusion}_%j.out" \
        -e "${LOGDIR}/grpC_${fusion}_%j.err" \
        --export=ALL \
        --wrap="export PYTHONUNBUFFERED=1; cd ${PULSE_ROOT}; $PYTHON $SCRIPT --fusion $fusion --modalities emg,imu $COMMON --augment --label_smoothing 0.1 --pretrained_backbone $PRETRAINED --freeze_backbone_idx 1 --tag grpC --output_dir $OUTDIR"
    echo "Submitted: Group C $fusion (dep: $PHASE0_JOB)"
done

echo ""
echo "Total: 1 phase0 + 2 baselines + 7 grpA + 7 grpB + 7 grpC = 24 jobs"
echo "Results: $OUTDIR"
echo "Phase 0 job ID: $PHASE0_JOB (Groups B & C depend on it)"