Skip to content

Commit ed14345

Browse files
andre15silvaclaude
andcommitted
fix(labeler-pro): pre-load dataset once, add memory spec and thin extraction script
Pre-load ScaleAI/SWE-bench_Pro dataset once in main() instead of once per worker thread to avoid N concurrent load_dataset() calls causing OOM. Add --mem=128G and 48h wall time to swebench_pro_label.sh. Add extract_swebench_thin.sh (4 GPUs, no fat constraint) for Laguna extraction. Add laguna_xs2_swebench_pro_full_labeler.yaml config. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 7508674 commit ed14345

4 files changed

Lines changed: 67 additions & 7 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Label full Laguna-XS.2 run on SWE-bench Pro (all available trajectories, resume-safe)
2+
# Usage:
3+
# sbatch slurm/swebench_pro_label.sh \
4+
# --config configs/labeling/laguna_xs2_swebench_pro_full_labeler.yaml
5+
6+
trajectory_dir: generations/swebench_pro/laguna_xs2_full
7+
output_dir: labels/swebench_pro/laguna_xs2_full
8+
scripts_dir: SWE-bench_Pro-os
9+
modal_app_name: program-probes-labeler-pro
10+
sandbox_timeout: 3600
11+
eval_timeout: 600
12+
resume: true
13+
n_workers: 100

run_labeler_pro.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
from pathlib import Path
1919

2020
from src.configs import SwebenchProLabelerConfig, load_config
21-
from src.labeling.swebench_pro_labeler import label_pro_trajectory, load_pro_instance
21+
from src.labeling.swebench_pro_labeler import label_pro_trajectory
2222

2323

2424
def _process(
2525
tf: Path,
26-
iid: str,
26+
instance: dict,
2727
cfg: SwebenchProLabelerConfig,
2828
out_dir: Path,
2929
scripts_dir: Path,
@@ -34,7 +34,6 @@ def _process(
3434
return f"{tf.name}: skipped (labels exist)"
3535
if jitter > 0:
3636
time.sleep(random.uniform(0, jitter))
37-
instance = load_pro_instance(iid)
3837
label_pro_trajectory(
3938
tf,
4039
instance=instance,
@@ -82,17 +81,28 @@ def _iid(tf: Path) -> str:
8281

8382
print(f"Labeling {len(traj_files)} trajectories from {traj_dir}{out_dir}", flush=True)
8483

84+
# Pre-load dataset once to avoid N concurrent load_dataset() calls in threads
85+
print("Loading SWE-bench Pro dataset ...", flush=True)
86+
from datasets import load_dataset as _hf_load
87+
_data = _hf_load("ScaleAI/SWE-bench_Pro", split="test")
88+
instances: dict[str, dict] = {inst["instance_id"]: dict(inst) for inst in _data}
89+
print(f"Loaded {len(instances)} instances.", flush=True)
90+
91+
def _get_instance(iid: str) -> dict:
92+
if iid not in instances:
93+
raise ValueError(f"Instance {iid!r} not found in SWE-bench Pro")
94+
return instances[iid]
95+
8596
jitter = 2.0 if cfg.n_workers > 1 else 0.0
8697

8798
if cfg.n_workers == 1:
8899
for tf in traj_files:
89-
iid = _iid(tf)
90-
result = _process(tf, iid, cfg, out_dir, scripts_dir, jitter=0.0)
100+
result = _process(tf, _get_instance(_iid(tf)), cfg, out_dir, scripts_dir, jitter=0.0)
91101
print(result, flush=True)
92102
else:
93103
with ThreadPoolExecutor(max_workers=cfg.n_workers) as pool:
94104
futures = {
95-
pool.submit(_process, tf, _iid(tf), cfg, out_dir, scripts_dir, jitter): tf.name
105+
pool.submit(_process, tf, _get_instance(_iid(tf)), cfg, out_dir, scripts_dir, jitter): tf.name
96106
for tf in traj_files
97107
}
98108
for fut in as_completed(futures):

slurm/extract_swebench_thin.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/bash
2+
# Extract hidden states from SWE-bench trajectories — thin A100 nodes (4 GPUs, no fat constraint).
3+
#
4+
# Array job (8 shards):
5+
# sbatch --array=0-7 slurm/extract_swebench_thin.sh \
6+
# --model-config configs/models/laguna_xs2.yaml \
7+
# --generation-config configs/generation_laguna_xs2.yaml \
8+
# --traj-dir generations/swebench_pro/laguna_xs2_full \
9+
# --output-dir outputs/swebench_pro/laguna_xs2_full
10+
#
11+
#SBATCH -J pp-extract-swebench
12+
#SBATCH -p berzelius
13+
#SBATCH --gpus=4
14+
#SBATCH -t 12:00:00
15+
#SBATCH -o logs/extract_swebench_%A_%a.out
16+
#SBATCH -e logs/extract_swebench_%A_%a.err
17+
18+
set -euo pipefail
19+
mkdir -p logs
20+
21+
module load buildenv-gcccuda/12.4.1-gcc13.3.0
22+
unset CPATH
23+
export LIBRARY_PATH="/usr/local/cuda/lib64:${LIBRARY_PATH:-}"
24+
export CUDA_HOME=/usr/local/cuda
25+
export PATH="/usr/local/cuda/bin:$PATH"
26+
27+
RANK=${SLURM_ARRAY_TASK_ID:-0}
28+
NUM_SHARDS=${SLURM_ARRAY_TASK_COUNT:-1}
29+
30+
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
31+
32+
uv run python run_extract_swebench.py \
33+
--shard-rank "$RANK" \
34+
--num-shards "$NUM_SHARDS" \
35+
--extraction-batch-size 1 \
36+
"$@"

slurm/swebench_pro_label.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
#
77
#SBATCH -J pp-pro-label
88
#SBATCH -p berzelius-cpu
9-
#SBATCH -t 12:00:00
9+
#SBATCH --mem=128G
10+
#SBATCH -t 48:00:00
1011
#SBATCH -o logs/pro_labeler_%A_%a.out
1112
#SBATCH -e logs/pro_labeler_%A_%a.err
1213

0 commit comments

Comments
 (0)