Agent sparse weight edits vs unedited Qwen3.5-2B on GSM8K
On fork spindle-fork-run_5cc69b7d9c (weight-write API that encodes sparse row/column edits as exact LoRA factors), a Qwen3.8-27B editor ran 50 gradient-free iterations on Qwen/Qwen3.5-2B and kept 3 edits (49,152 values, well under the 320K budget), raising dev-200 accuracy from 0.77 to 0.81. On the 500 held-out GSM8K test problems the edited model scored 73.4% versus 74.4% for the unedited base (-1.0 point), so the hypothesis is refuted.
Result
No arm results yet.
- base_dev_acc
- 0.77
- best_dev_acc
- 0.81
- iterations_run
- 50
- edits_accepted
- 3
- values_touched
- 49,152
- base_test_acc
- 0.744
- edited_test_acc
- 0.734
- base_test_correct
- 372
- edited_test_correct
- 367
- test_n
- 500
- delta_points
- -1
- wall_minutes_search_and_eval
- 24.3
Changes from the spec 0
Checks · activation unverified · evaluator unknown · feasibility unknown
Spec exp_699cc61a3f
Hypothesis
Qwen3.5-2B after agent-chosen direct weight edits touching at most 0.016% of parameters beats the unedited Qwen3.5-2B by at least 5 points exact-match on 500 held-out GSM8K test problems.
Success criterion
Validated if the edited model's GSM8K test exact-match exceeds the baseline by at least 5.0 points, roughly 2x the ~2.2-point standard error at n=500, and all edits stay within 320K parameters. Failed if the gain is under 2 points. Anything in between is inconclusive.
Method
Baseline
Full spec
{
"base_model": "Qwen/Qwen3.5-2B",
"baseline": "Unedited Qwen/Qwen3.5-2B, scored on the same 500 GSM8K test problems with the identical prompt, renderer, greedy decoding and 512-token limit.",
"batch_size": 200,
"budget": {
"gpu_hours": 2.0,
"max_wall_minutes": 150
},
"command": "python edit_search.py # tinker SDK: sc = tinker.ServiceClient(base_url=os.environ['TINKER_BASE_URL']); agent = sc.create_sampling_client(base_model='Qwen/Qwen3.8-27B'); for it in range(50): edit = propose(agent, history); handle = fork_weight_write('Qwen/Qwen3.5-2B', edit) # CUSTOM: endpoint added in the Spindle fork; target = sc.create_sampling_client(model_path=handle); score = gsm8k_eval(target, dev200); keep edit if score improves; final: gsm8k_eval on test500 for edited model and for sc.create_sampling_client(base_model='Qwen/Qwen3.5-2B')",
"dataset": {
"hf_path": "openai/gsm8k",
"n_examples": 700,
"name": "gsm8k",
"split": "train (200 dev for search), test (500 held-out eval)"
},
"eval": {
"benchmark": "GSM8K test",
"metric": "exact-match accuracy on final numeric answer",
"n_examples": 500
},
"hypothesis": "Qwen3.5-2B after agent-chosen direct weight edits touching at most 0.016% of parameters beats the unedited Qwen3.5-2B by at least 5 points exact-match on 500 held-out GSM8K test problems.",
"lora_rank": 0,
"max_seq_len": 1024,
"method": "Needs a Spindle fork that adds a weight-write API: an endpoint that takes (tensor name, index set, new values) and writes them into a copy of the served model's weights, then exposes that copy to the sampling client. Qwen3.5-0.8B is not served, so Qwen/Qwen3.5-2B, the closest served model, is used. The edit budget is 0.016% of parameters, about 320K values. The editor agent is Qwen/Qwen3.8-27B through the sampling client. It sees the layer and tensor names, the current dev score and failure examples, and proposes one sparse edit per iteration, such as scaling selected rows or columns, adding small offsets, or changing norm gains. Each edit is applied through the fork and scored on 200 GSM8K train problems used as a dev set. An edit is kept only if the dev score improves, and edits accumulate within the budget. The loop runs for 50 iterations with no gradients. The final edited model and the unedited baseline are then scored on 500 GSM8K test problems, never seen during the search. Both use the same chat template, the same 4-shot-free zero-shot prompt with a 'final answer after ####' instruction, greedy decoding and max 512 tokens. No LoRA is trained.",
"optimizer": {
"lr": 0.0,
"name": "none (agent-driven direct weight edits via fork weight-write API)"
},
"steps": 50,
"success_criterion": "Validated if the edited model's GSM8K test exact-match exceeds the baseline by at least 5.0 points, roughly 2x the ~2.2-point standard error at n=500, and all edits stay within 320K parameters. Failed if the gain is under 2 points. Anything in between is inconclusive.",
"title": "Agent sparse weight edits vs unedited Qwen3.5-2B on GSM8K",
"training_type": "eval_only"
}Evidence
All metrics
- base_dev_acc
- 0.77
- best_dev_acc
- 0.81
- iterations_run
- 50
- edits_accepted
- 3
- values_touched
- 49,152
- base_test_acc
- 0.744
- edited_test_acc
- 0.734
- base_test_correct
- 372
- edited_test_correct
- 367
- test_n
- 500
- delta_points
- -1
- wall_minutes_search_and_eval
- 24.3
Agent trace full trace with commands in Devin ↗
Details
- run
- run_5cc69b7d9c
- backend
- Devin
- session
- devin-d5185da7b2c443d8bc72e92e2a3c83a9
- experiment
- exp_699cc61a3f
- redo of
- run_11123a121e
- created
- Nov 3, 13:28 UTC
- started
- Nov 3, 13:28 UTC
- finished
- Nov 3, 14:13 UTC
- duration
- 44m 36s
- GPU-h budget
- 2.0
- wall budget
- 150 min
- base model
- Qwen/Qwen3.5-2B
- training
- EVAL_ONLY
- dataset
- gsm8k
- run_11123a121e no result 22h ago