GS1 kernel-baseline RL vs GRPO at an equal rollout budget on GSM8K
Redo
Both 40-step rank-32 LoRA RL arms on Qwen/Qwen3.5-2B ran on shared Spindle with 64 rollouts/step from a shared init: GRPO (8x8) reached 0.7824 and GS1 kernel-baseline (64x1, bandwidth 1.0) reached 0.7551 GSM8K test greedy accuracy (base 0.7074). The paired difference -0.0273 has a one-sided 95% Hoeffding lower bound of -0.0947, which does not clear the -0.03 noninferiority margin.
Result gsm8k_test_accuracy
| arm | gsm8k_test_accuracy | train_mean_reward_all_steps | train_mean_reward_last10 | frac_nonzero_adv_mean | steps | train_wall_s |
|---|---|---|---|---|---|---|
| grpo_gs8 | 0.7824 | 0.7193 | 0.7827 | 0.5969 | 40 | 725.4 |
| gs1_kernel | 0.7551 | 0.6508 | 0.687 | 1 | 40 | 783.3 |
| Δ gs1_kernel − grpo_gs8 | -0.02729 | -0.06852 | -0.09563 | +0.4031 | 0 | +57.9 |
Changes from the spec 1
| what | spec | ran with | why | recorded |
|---|---|---|---|---|
| Evaluator | stock math_rl renderer (cookbook get_recommended_renderer_name) | qwen3_5_disable_thinking renderer for training prompts and eval (stock MathEnv few-shot prefix, boxed suffix, sympy grader) | Qwen3.5-2B is not in cookbook model_info, so no stock renderer is defined; the qwen3_5 thinking renderer truncated 100% of 64 train-prompt samples at max_tokens=512, the non-thinking variant gave 0.60 mean reward. | before the run ended |
Original hypothesis tested: yes
Checks · activation unverified · evaluator invalid · feasibility unknown
Parity errors and accepted tolerances
[
{
"check": "baseline_loss",
"measured": {
"cosine_similarity": 1.0,
"max_abs_error": 0.00017547607421875,
"reference_max_abs": 1146.7787895202637,
"relative_l2_error": 1.5301649788287205e-07
},
"path": "gs1_kernel_advantage_loop",
"status": "passed",
"tolerance": {
"atol": 1e-06,
"rtol": 1e-05
}
},
{
"check": "baseline_gradient",
"measured": {
"cosine_similarity": 0.9999999999999978,
"max_abs_error": 8.552952135421066e-08,
"reference_max_abs": 1.083759156562594,
"relative_l2_error": 7.124869514136638e-08
},
"path": "gs1_kernel_advantage_loop",
"status": "passed",
"tolerance": {
"atol": 1e-05,
"min_cosine": 0.99999,
"rtol": 0.0001
}
},
{
"check": "reference_loss",
"measured": {
"cosine_similarity": 1.0,
"max_abs_error": 0.0,
"reference_max_abs": 2228.912169456482,
"relative_l2_error": 0.0
},
"path": "gs1_kernel_advantage_loop",
"status": "passed",
"tolerance": {
"atol": 1e-06,
"rtol": 1e-05
}
},
{
"check": "reference_gradient",
"measured": {
"cosine_similarity": 1.0000000000000002,
"max_abs_error": 0.0,
"reference_max_abs": 1.1835557855038958,
"relative_l2_error": 0.0
},
"path": "gs1_kernel_advantage_loop",
"status": "unverified",
"tolerance": {
"atol": 1e-05,
"min_cosine": 0.99999,
"rtol": 0.0001
}
}
]- executed_group_size_treatment
- 1 needs one of 1 · passed
- executed_group_size_baseline
- 8 needs one of 8 · passed
- pilot_mean_reward
- not reported needs >= 0.1 and <= 0.9 · missing
- kernel_effective_neighbors_p10
- not reported needs >= 8 · missing
- frac_nonzero_advantage_treatment
- not reported needs >= 0.5 · missing
- baseline_reward_corr
- not reported needs >= 0.1 · missing
Evaluator identities and per-arm scores
{
"comparisons": [
{
"arms": [
"grpo_gs8",
"gs1_kernel"
],
"metric": "accuracy"
}
],
"evaluators": {
"6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59": {
"code_sha256": "see evidence/score.json (sha256 of rx_gs1.py + tinker 0.37.0 + cookbook 6daabe08)",
"decoding": {
"max_tokens": 512,
"stop": [
"renderer stop sequences"
],
"temperature": 0
},
"items": {
"ids_pattern": "gsm8k-test-0 .. gsm8k-test-1318",
"manifest_ref": "items.jsonl"
},
"parser": "MathEnv.check_answer: extract_boxed + sympy grade_answer vs GSM8K #### answer (cookbook 6daabe08)",
"prompt_template": "tinker_cookbook MathEnv: renderer qwen3_5_disable_thinking; standard_fewshot_prefix + user(question + ' Write your answer in \\\\boxed{} format.')"
}
},
"scores": [
{
"arm": "base",
"evaluator_id": "6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59",
"metric": "accuracy",
"predictions_ref": "predictions_base.jsonl",
"seed": 0,
"value": 0.7073540561031084
},
{
"arm": "grpo_gs8",
"evaluator_id": "6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59",
"metric": "accuracy",
"predictions_ref": "predictions_grpo_gs8.jsonl",
"seed": 0,
"value": 0.7824109173616376
},
{
"arm": "gs1_kernel",
"evaluator_id": "6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59",
"metric": "accuracy",
"predictions_ref": "predictions_gs1_kernel.jsonl",
"seed": 0,
"value": 0.755117513267627
}
],
"version": 1
}- Projected wall time
- unknown
- Projected GPU allocation
- unknown
- Re-projection required: base_model changed or was not recorded
- Re-projection required: lora_rank changed or was not recorded
- Re-projection required: dataset changed or was not recorded
- Re-projection required: steps changed or was not recorded
- Re-projection required: batch_size changed or was not recorded
- Re-projection required: max_seq_len changed or was not recorded
- Re-projection required: max_tokens changed or was not recorded
- Re-projection required: arms changed or was not recorded
- Re-projection required: n_examples changed or was not recorded
- Re-projection required: n_eval changed or was not recorded
Timing, sample counts and allocation evidence
{
"generation_applicability": {
"check": "generation_audit",
"enforce": false,
"features": {
"generated_training_data": false
},
"reasons": [
"spec.generation_audit opts out and no feature it covers is true"
],
"status": "not_applicable"
},
"generation_counts": null,
"gpu_hours": null,
"known_gpu_hours": 0,
"phases": {
"evaluation": {
"gpu_hours": null,
"planned_samples": 3957.0,
"planned_units": 3957,
"wall_seconds": 664.2
},
"recovery": {
"gpu_hours": null,
"wall_seconds": 600
},
"setup": {
"gpu_hours": null,
"planned_samples": 0.0,
"planned_units": 1,
"wall_seconds": 24.3
},
"training": {
"gpu_hours": null,
"planned_samples": 5504.0,
"planned_units": 86,
"wall_seconds": 1694.2
}
},
"problems": [
"Re-projection required: base_model changed or was not recorded",
"Re-projection required: lora_rank changed or was not recorded",
"Re-projection required: dataset changed or was not recorded",
"Re-projection required: steps changed or was not recorded",
"Re-projection required: batch_size changed or was not recorded",
"Re-projection required: max_seq_len changed or was not recorded",
"Re-projection required: max_tokens changed or was not recorded",
"Re-projection required: arms changed or was not recorded",
"Re-projection required: n_examples changed or was not recorded",
"Re-projection required: n_eval changed or was not recorded"
],
"record": {
"config": {
"pilot": "gs1_kernel 2 steps bw1.0, 64 rollouts/step, max_tokens 512; base eval 1319 items greedy"
},
"effective_config": {
"arms": [
"grpo_gs8",
"gs1_kernel"
],
"base_model": "Qwen/Qwen3.5-2B",
"batch_size": 64,
"gs1_bandwidth": 1.0,
"max_seq_len": 1024,
"max_tokens": 512,
"n_eval": 1319,
"renderer": "qwen3_5_disable_thinking",
"steps": 40
},
"generation": null,
"measurements": {
"evaluation": {
"allocation_source": null,
"gpu_count": null,
"planned_units": 3957,
"samples": 1319,
"seconds": 221.4,
"units": 1319
},
"setup": {
"allocation_source": null,
"gpu_count": null,
"planned_units": 1,
"samples": 0,
"seconds": 24.3,
"units": 1
},
"training": {
"allocation_source": null,
"gpu_count": null,
"planned_units": 86,
"samples": 128,
"seconds": 39.4,
"units": 2
}
},
"primary_endpoint": "gsm8k_test_exact_match_accuracy_final_checkpoint",
"recovery": {
"allocation_source": null,
"gpu_count": null,
"seconds": 600
},
"source": "/tmp/rx-gs1/pilot_gs1_kernel_bw1/train_log.jsonl, /tmp/rx-gs1/base/eval_summary.json"
},
"recorded_at": 1793799957.066918,
"status": "unknown",
"wall_seconds": null
}Spec exp_32150a771c
Hypothesis
At 64 rollouts per step for 40 steps on Qwen3.5-2B, GS1 RL with a kernel-weighted cross-prompt baseline is noninferior to GRPO (group_size=8) on GSM8K test exact-match accuracy. The noninferiority margin is 3 points.
Success criterion
GS1 minus GRPO GSM8K test exact-match accuracy, as a lower 95% Hoeffding bound over 1319 paired items, must exceed -0.03 (noninferiority margin of 3 points). If the interval straddles -0.03, the pilot is inconclusive and is not counted as a win.
Method
Baseline
Full spec
{
"activation_gate": {
"applicable": true,
"checks": [
{
"measures": "rollouts per distinct prompt in logged treatment batches",
"metric": "executed_group_size_treatment",
"one_of": [
"1"
]
},
{
"measures": "rollouts per distinct prompt in logged baseline batches",
"metric": "executed_group_size_baseline",
"one_of": [
"8"
]
},
{
"max": 0.9,
"measures": "mean training reward over the first 2 treatment steps",
"metric": "pilot_mean_reward",
"min": 0.1
},
{
"measures": "10th percentile over rollouts of (sum w)^2/sum w^2 for the kernel weights",
"metric": "kernel_effective_neighbors_p10",
"min": 8.0
},
{
"measures": "fraction of treatment rollouts with |advantage|>1e-6",
"metric": "frac_nonzero_advantage_treatment",
"min": 0.5
},
{
"measures": "Pearson correlation of b_i with a held-out 8-sample per-prompt mean reward, over 64 pilot prompts",
"metric": "baseline_reward_corr",
"min": 0.1
}
],
"reason": "A GS1 baseline only differs from a constant baseline if the kernel draws on several neighbors with varied rewards, and the prompts give a non-degenerate reward. The executed group size must actually be 1 for the treatment and 8 for the baseline."
},
"arms": [
{
"advantage": "group_mean",
"group_size": 8,
"groups_per_batch": 8,
"lr": 4e-05,
"name": "grpo_gs8",
"seed": 0
},
{
"advantage": "kernel_cross_prompt_baseline",
"group_size": 1,
"groups_per_batch": 64,
"lr": 4e-05,
"name": "gs1_kernel",
"seed": 0
}
],
"base_model": "Qwen/Qwen3.5-2B",
"baseline": "GRPO via the same client loop with group_size=8, groups_per_batch=8 and group-mean advantages. It uses the same model, LoRA rank, LR, steps, rollouts per step, max_tokens, renderer, reward, seed and GSM8K eval.",
"batch_size": 64,
"budget": {
"gpu_hours": 2.0,
"max_wall_minutes": 120
},
"command": "Custom client loop (python rx_gs1.py --arm {grpo_gs8|gs1_kernel}); the only custom part is the compute_advantages function.\n\nSetup:\n import os, tinker\n sc = tinker.ServiceClient(base_url=os.environ['TINKER_BASE_URL'])\n tc = sc.create_lora_training_client(base_model='Qwen/Qwen3.5-2B', rank=32, seed=0)\n Use the tinker_cookbook math_rl gsm8k env builder for prompts, renderer and reward.\n\nEach of 40 steps:\n 1. sampler = tc.save_weights_and_get_sampling_client(...).\n 2. Draw prompts from a fixed seed-0 shuffled order: GRPO takes 8 prompts x 8 samples, GS1 takes 64 prompts x 1 sample. max_tokens=512, temperature=1.0.\n 3. Grade with the env reward.\n 4. Compute advantages: GRPO uses r minus group mean. GS1 uses r_i minus a Gaussian-kernel-weighted mean over a 256-rollout window excluding i, with phi = (log prompt length, sampler mean prompt-token logprob) and bandwidth 0.5.\n 5. Build Datums with sampling logprobs and advantages.\n 6. tc.forward_backward(datums, loss_fn='importance_sampling').\n 7. tc.optim_step(tinker.AdamParams(learning_rate=4e-5)).\n\nAfter training: run save_weights_for_sampler, then greedy-decode all 1319 GSM8K test items for each arm. Write per-item correctness to /tmp/rx-gs1/{arm}/eval.jsonl, and score the paired Hoeffding rule from those files.\n\nActivation-failure plan:\n- (a) Offline first: unit-test compute_advantages in float64 on synthetic rewards. Check forced activation (heterogeneous phi gives nonconstant b_i) and forced nonactivation (huge bandwidth gives b_i equal to the window mean, i.e. a batch-mean REINFORCE baseline). Run gradient checks of the new loop with the treatment disabled against stock cookbook GRPO advantages on one fixed batch.\n- (b) A 2-step treatment pilot logs the gate metrics.\n- (c) If kernel_effective_neighbors fails, the single pre-registered calibration is bandwidth in {0.5, 1.0}, chosen by the gate on pilot training prompts only, never on GSM8K test. The cap is 2 pilot steps and 10 wall minutes.\n- (d) Keep the original failed pilot logs. Any other setting change requires a recorded revised spec before execution. Gates are never relaxed.\n\nNo full run happens while correctness_preflight is unresolved.",
"correctness_preflight": {
"paths": [
{
"baseline_revision": "UNRESOLVED: pin the tinker-cookbook commit SHA whose rl loop / math_rl group-mean advantage is the stock baseline",
"id": "gs1_kernel_advantage_loop",
"kind": "loss",
"reference_revision": "UNRESOLVED: pin a commit of an independently written float64 numpy reference of the kernel baseline (or the Trajectory reference if released)",
"tolerances": {
"baseline_gradient": {
"atol": 1e-05,
"min_cosine": 0.99999,
"rtol": 0.0001
},
"baseline_loss": {
"atol": 1e-06,
"rtol": 1e-05
},
"reference_gradient": {
"atol": 1e-05,
"min_cosine": 0.99999,
"rtol": 0.0001
},
"reference_loss": {
"atol": 1e-06,
"rtol": 1e-05
}
}
}
],
"required": true,
"status": "unresolved: the source was not fetched and its kernel is unreleased, so there is no trusted treatment reference; pin revisions and an independent reference before any full sweep"
},
"dataset": {
"hf_path": "openai/gsm8k",
"n_examples": 2560,
"name": "gsm8k",
"split": "main/train"
},
"decision_rule": {
"alpha": 0.05,
"criteria": [
{
"bounds": [
0,
1
],
"id": "primary",
"margin": -0.03,
"metric": "accuracy",
"weights": {
"baseline": -1,
"treatment": 1
}
}
],
"estimand": "Paired difference in GSM8K test exact-match accuracy (GS1 kernel minus GRPO) for these fixed seed-0 final checkpoints; larger is better",
"method": "paired_hoeffding",
"seeds": [
0
],
"unit": "fixed_checkpoint_items",
"version": 1
},
"eval": {
"aggregation": null,
"benchmark": "GSM8K test (openai/gsm8k main/test)",
"metric": "exact-match accuracy, greedy, final checkpoint",
"n_examples": 1319
},
"experiment_features": {
"adaptive_selection": false,
"checkpoint_restore": false,
"custom_loss": true,
"custom_optimizer": false,
"generated_training_data": false,
"heldout_loss": false,
"learned_generator": false,
"paired_comparison": true,
"paired_training_arms": true,
"warmup_adaptation": false
},
"feasibility": {
"config": null,
"effective_config": {
"arms": [
"grpo_gs8",
"gs1_kernel"
],
"base_model": "Qwen/Qwen3.5-2B",
"batch_size": 64,
"max_seq_len": 1024,
"max_tokens": 512,
"n_eval": 1319,
"steps": 40
},
"generation": null,
"measurements": null,
"primary_endpoint": "gsm8k_test_exact_match_accuracy_final_checkpoint",
"recovery": null,
"source": null
},
"feasibility_check": {
"generation_applicability": {
"check": "generation_audit",
"enforce": false,
"features": {
"generated_training_data": false
},
"reasons": [
"spec.generation_audit opts out and no feature it covers is true"
],
"status": "not_applicable"
},
"generation_counts": null,
"gpu_hours": null,
"known_gpu_hours": 0,
"phases": {},
"problems": [
"Effective configuration not recorded",
"Pilot evidence source not recorded",
"Representative training timing not recorded",
"Representative setup timing not recorded",
"Representative evaluation timing not recorded",
"Positive recovery reserve not recorded"
],
"status": "unknown",
"wall_seconds": null
},
"feasibility_required": true,
"generation_audit": {
"answer_comparison": "numeric_exact",
"max_eval_overlaps": 0,
"max_label_errors": 0,
"min_sample_size": 100,
"required": false
},
"hypothesis": "At 64 rollouts per step for 40 steps on Qwen3.5-2B, GS1 RL with a kernel-weighted cross-prompt baseline is noninferior to GRPO (group_size=8) on GSM8K test exact-match accuracy. The noninferiority margin is 3 points.",
"lora_rank": 32,
"max_seq_len": 1024,
"method": "Both arms train a rank-32 LoRA on Qwen/Qwen3.5-2B from the same base. They use one client-side RL loop built on the tinker-cookbook rl loop, with the stock importance_sampling loss and AdamW. The prompts come from GSM8K train with the stock math_rl renderer and the verifiable exact-answer reward. Each step uses 64 rollouts, max_tokens=512 and temperature 1.0.\n\nThe arms differ only in the advantage estimator:\n- GRPO baseline: 8 prompts x 8 rollouts. Advantage = reward minus group mean, matching the cookbook's default.\n- GS1 treatment: 64 distinct prompts x 1 rollout. Advantage = r_i minus b_i. Here b_i is a kernel-weighted mean of rewards from other prompts in a sliding window of the last 256 rollouts. The window covers the current batch excluding i, plus the previous steps.\n\nThe kernel is fixed before running: a Gaussian kernel exp(-||phi_i - phi_j||^2 / (2*0.5^2)) on a 2-d standardized prompt feature phi = (log prompt-token length, sampling-policy mean token logprob of the prompt). The prompt logprob is computed by the sampling client before rollout. If kernel mass is below 1e-3, the estimator falls back to the window mean.\n\nThe Trajectory post could not be fetched and does not release its kernel, so this kernel is our own pre-registered choice and not the paper's exact method. Kernel hillclimbing, FlashREINFORCE, the trained-critic comparison and cross-task transfer are out of scope for this first node. Each is a follow-up spec.\n\nThe shared Spindle is enough; no fork is needed. Evaluation is greedy decoding on the full GSM8K test split (1319 items), scored by exact match, for the final checkpoint of each arm.",
"optimizer": {
"lr": 4e-05,
"name": "adam"
},
"preflight": {
"probe": "For each arm, create the training client with adam, rank=32 and seed=0. Run one forward_backward with loss_fn='importance_sampling' on one sampled GSM8K example carrying that arm's computed advantage, then one optim_step(tinker.AdamParams(learning_rate=4e-5)). Confirm both succeed and the loss is finite. Then run the offline advantage unit tests and the 2-step activation pilot.",
"riskiest_assumption": "The custom GS1 advantage path is correct and engages. Specifically, the new loop reproduces stock GRPO advantages when the treatment is disabled, and the kernel baseline gives a nonconstant, reward-predictive b_i. Otherwise a GS1-vs-GRPO gap reflects bugs or a degenerate batch-mean baseline, not the method.",
"tuning": "Both arms use the same optimizer (AdamW) and a fixed LR of 4e-5 taken from cookbook math_rl defaults for small Qwen models. There is no per-arm grid, because the hypothesis concerns the advantage estimator at a fixed recipe. An LR-sensitivity follow-up would give each arm a 3-value grid selected on a GSM8K train holdout, with the grid-edge rule applied."
},
"primary_endpoint": "gsm8k_test_exact_match_accuracy_final_checkpoint",
"restoration_preflight": {
"applicable": true,
"fixed_batch_required": true,
"groups": [
{
"arms": [
{
"name": "grpo_gs8",
"optimizer": "adam",
"optimizer_config": {
"beta1": 0.9,
"beta2": 0.95,
"eps": 1e-08,
"lora_rank": 32,
"lr": 4e-05,
"seed": 0
}
},
{
"name": "gs1_kernel",
"optimizer": "adam",
"optimizer_config": {
"beta1": 0.9,
"beta2": 0.95,
"eps": 1e-08,
"lora_rank": 32,
"lr": 4e-05,
"seed": 0
}
}
]
}
],
"reason": "Both trained arms start from the same base LoRA initialization within seed 0."
},
"spec_preflight": {
"findings": [],
"status": "passed"
},
"steps": 40,
"success_criterion": "GS1 minus GRPO GSM8K test exact-match accuracy, as a lower 95% Hoeffding bound over 1319 paired items, must exceed -0.03 (noninferiority margin of 3 points). If the interval straddles -0.03, the pilot is inconclusive and is not counted as a win.",
"title": "GS1 kernel-baseline RL vs GRPO at an equal rollout budget on GSM8K",
"training_type": "rl"
}Evidence 2
- effective-config.json · effective config · 600 bytes
- code-revision.txt · code revision · 396 bytes
Checkpoint references
[
{
"arm": "grpo_gs8",
"step": 40,
"uri": "tinker://824c06713d43bdda165b07405ef09e88:train:0/sampler_weights/grpo_gs8-r6bc25-final"
},
{
"arm": "gs1_kernel",
"step": 40,
"uri": "tinker://faba9448087e4a05211172142bd967f3:train:0/sampler_weights/gs1_kernel-r6bc25-final"
}
]Per-arm evidence metrics
{
"base": {
"accuracy": 0.7073540561031084
},
"grpo_gs8": {
"accuracy": 0.7824109173616376
},
"gs1_kernel": {
"accuracy": 0.755117513267627
}
}All metrics
| metric | grpo_gs8 | gs1_kernel |
|---|---|---|
| gsm8k_test_accuracy | 0.7824 | 0.7551 |
| train_mean_reward_all_steps | 0.7193 | 0.6508 |
| train_mean_reward_last10 | 0.7827 | 0.687 |
| frac_nonzero_adv_mean | 0.5969 | 1 |
| steps | 40 | 40 |
| train_wall_s | 725.4 | 783.3 |
- base_gsm8k_test_accuracy
- 0.7074
- effect_gs1_minus_grpo
- -0.02729
- hoeffding_lower_one_sided_95
- -0.09469
- n_paired_items
- 1,319
- items_gs1_only_correct
- 89
- items_grpo_only_correct
- 125
Interim updates from agentcore (5, first Nov 4, 13:12 UTC)
- checkpoint · grpo_gs8 · step 40 · tinker://824c06713d43bdda165b07405ef09e88:train:0/sampler_weights/grpo_gs8-r6bc25-final
- checkpoint · gs1_kernel · step 40 · tinker://faba9448087e4a05211172142bd967f3:train:0/sampler_weights/gs1_kernel-r6bc25-final
- effective_config · effective-config.json
- code_revision · code-revision.txt
- Nov 4, 13:52 UTC · succeeded · done: grpo_gs8, gs1_kernel · Both 40-step rank-32 LoRA RL arms on Qwen/Qwen3.5-2B ran on shared Spindle with 64 rollouts/step from a shared init: GRPO (8x8) reached 0.7824 and GS1 kernel-baseline (64x1, bandwidth 1.0) reached 0.…
- Nov 4, 13:45 UTC · running · Both 40-step arms are training on shared Spindle (about 20 s per step) after preflight and activation gate passed. Base Qwen3.5-2B GSM8K test greedy accuracy is 0.70735.
- Nov 4, 13:36 UTC · running · Preflight passed and the activation gate passed after the pre-registered bandwidth calibration (0.5 failed with neff p10 7.97; 1.0 gave 25.97); both 40-step arms are training on shared Spindle. Base …
- Nov 4, 13:26 UTC · running · Correctness preflight passed (baseline and reference loss/gradient parity) and the base Qwen3.5-2B GSM8K test greedy accuracy is 0.70735; 2-step activation pilot running.
- Nov 4, 13:12 UTC · running · Preflight in progress: offline float64 advantage tests passed; server parity checks and probe running on shared Spindle with Qwen/Qwen3.5-2B.
Artifacts
- correctness_preflight
- {'required': True, 'paths': [{'id': 'gs1_kernel_advantage_loop', 'fixed_input': {'sha256': 'cce4c71de50e0c585a6f4da3740e4b87513ec651d6dc88979bb91c0b79c7be01', 'description': 'fixed_batch_grpo.json: 64 base-model rollouts (8 GSM8K-train prompts, shuffled idx 2600-2607, x8). Reference batch fixed_batch_gs1.json sha256 548380be1bcb7617e2266b9966c521cbf2d3bb4d5e21f3c5de854a9ae106966c (64 prompts x1, idx 2700-2763). Server forward with importance_sampling on a fresh LoRA, no optimizer state.'}, 'baseline_revision': 'tinker-cookbook 6daabe0838736557f0e802020b710073eb340287 (rl.data_processing.compute_advantages + assemble_training_data)', 'reference_revision': 'ref_kernel.py sha256 949e10f84b09b06063b39af2a45a517eb5783c76d6c60b9c9b0ed17e201939de (independent float64 loop reference, local git 4e669a7)', 'implementation_revision': 'rx_gs1.py local git 4e669a732f576f6381406bb106b3f75825d4d36a (sha256 6ada7f44abe7828accf7e1f84b50fbe848b831c0a44c5742b4c26d3719738fbe)', 'precision': 'advantages float64 (stock: torch float32), datums float32, server forward bf16 model with fp32 logprobs', 'normalization': 'importance_sampling loss summed over completion tokens (prompt tokens advantage 0); gradient = dL/dlogprob_t = -exp(lp_t - lp_sampled_t)*A_t per token', 'errors': {'baseline_loss': {'max_abs_error': 0.00017547607421875, 'reference_max_abs': 1146.7787895202637, 'relative_l2_error': 1.5301649788287205e-07, 'cosine_similarity': 1.0}, 'baseline_gradient': {'max_abs_error': 8.552952135421066e-08, 'reference_max_abs': 1.083759156562594, 'relative_l2_error': 7.124869514136638e-08, 'cosine_similarity': 0.9999999999999978}, 'reference_loss': {'max_abs_error': 0.0, 'reference_max_abs': 2228.912169456482, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0}, 'reference_gradient': {'max_abs_error': 0.0, 'reference_max_abs': 1.1835557855038958, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0000000000000002}}, 'lr_scaling': []}]}
- correctness_validation
- {'status': 'unverified', 'required': True, 'checks': [{'path': 'gs1_kernel_advantage_loop', 'check': 'baseline_loss', 'status': 'passed', 'tolerance': {'atol': 1e-06, 'rtol': 1e-05}, 'measured': {'max_abs_error': 0.00017547607421875, 'reference_max_abs': 1146.7787895202637, 'relative_l2_error': 1.5301649788287205e-07, 'cosine_similarity': 1.0}}, {'path': 'gs1_kernel_advantage_loop', 'check': 'baseline_gradient', 'status': 'passed', 'tolerance': {'atol': 1e-05, 'rtol': 0.0001, 'min_cosine': 0.99999}, 'measured': {'max_abs_error': 8.552952135421066e-08, 'reference_max_abs': 1.083759156562594, 'relative_l2_error': 7.124869514136638e-08, 'cosine_similarity': 0.9999999999999978}}, {'path': 'gs1_kernel_advantage_loop', 'check': 'reference_loss', 'status': 'passed', 'tolerance': {'atol': 1e-06, 'rtol': 1e-05}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 2228.912169456482, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0}}, {'path': 'gs1_kernel_advantage_loop', 'check': 'reference_gradient', 'status': 'unverified', 'tolerance': {'atol': 1e-05, 'rtol': 0.0001, 'min_cosine': 0.99999}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 1.1835557855038958, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0000000000000002}}], 'reason': 'gs1_kernel_advantage_loop: matching reference_revision; gs1_kernel_advantage_loop: matching baseline_revision; gs1_kernel_advantage_loop: reference_gradient cosine/tolerance', 'evidence_source': 'executor report; remote execution is not attested', 'applicability': 'required', 'reported_verdict': 'refuted'}
- decision
- {'version': 1, 'observations_file': {'name': 'scored-observations.jsonl', 'sha256': 'a327155a339e246802141bdfe0d95f74c5ac208ab8f213266f2bbe51a52edeb0'}}
- decision_validation
- {'status': 'unverified', 'issues': ['Observation file name/hash is not retained for this run.'], 'criteria': [], 'outcome_reason': 'insufficient_evidence', 'applicability': {'check': 'decision_rule', 'status': 'required', 'enforce': True, 'reasons': ['experiment_features: paired_comparison is true'], 'features': {'paired_comparison': True, 'adaptive_selection': False}}, 'reported_verdict': 'refuted'}
- evaluation
- {'version': 1, 'evaluators': {'6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59': {'code_sha256': 'see evidence/score.json (sha256 of rx_gs1.py + tinker 0.37.0 + cookbook 6daabe08)', 'prompt_template': "tinker_cookbook MathEnv: renderer qwen3_5_disable_thinking; standard_fewshot_prefix + user(question + ' Write your answer in \\\\boxed{} format.')", 'decoding': {'temperature': 0, 'max_tokens': 512, 'stop': ['renderer stop sequences']}, 'parser': 'MathEnv.check_answer: extract_boxed + sympy grade_answer vs GSM8K #### answer (cookbook 6daabe08)', 'items': {'manifest_ref': 'items.jsonl', 'ids_pattern': 'gsm8k-test-0 .. gsm8k-test-1318'}}}, 'scores': [{'arm': 'base', 'metric': 'accuracy', 'value': 0.7073540561031084, 'evaluator_id': '6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59', 'seed': 0, 'predictions_ref': 'predictions_base.jsonl'}, {'arm': 'grpo_gs8', 'metric': 'accuracy', 'value': 0.7824109173616376, 'evaluator_id': '6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59', 'seed': 0, 'predictions_ref': 'predictions_grpo_gs8.jsonl'}, {'arm': 'gs1_kernel', 'metric': 'accuracy', 'value': 0.755117513267627, 'evaluator_id': '6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59', 'seed': 0, 'predictions_ref': 'predictions_gs1_kernel.jsonl'}], 'comparisons': [{'metric': 'accuracy', 'arms': ['grpo_gs8', 'gs1_kernel']}]}
- evaluator_validation
- {'status': 'invalid', 'issues': ['Evaluator 6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59: item IDs or a hashed item manifest are required.', 'Evaluator 6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59: code_sha256 is required.', 'Evaluator 6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59: identity does not match provenance hash.'], 'comparisons': [{'metric': 'accuracy', 'status': 'comparable', 'arms': ['base', 'grpo_gs8', 'gs1_kernel'], 'evaluator_ids': ['6a7f4f6b3caad58beae1d3de102ab501545ae1da2615e84090c5b5484cd1dc59'], 'missing_arms': []}]}
- feasibility
- {'status': 'unknown', 'problems': ['Re-projection required: base_model changed or was not recorded', 'Re-projection required: lora_rank changed or was not recorded', 'Re-projection required: dataset changed or was not recorded', 'Re-projection required: steps changed or was not recorded', 'Re-projection required: batch_size changed or was not recorded', 'Re-projection required: max_seq_len changed or was not recorded', 'Re-projection required: max_tokens changed or was not recorded', 'Re-projection required: arms changed or was not recorded', 'Re-projection required: n_examples changed or was not recorded', 'Re-projection required: n_eval changed or was not recorded'], 'wall_seconds': None, 'gpu_hours': None, 'known_gpu_hours': 0, 'phases': {'setup': {'wall_seconds': 24.3, 'planned_units': 1, 'planned_samples': 0.0, 'gpu_hours': None}, 'training': {'wall_seconds': 1694.2, 'planned_units': 86, 'planned_samples': 5504.0, 'gpu_hours': None}, 'evaluation': {'wall_seconds': 664.2, 'planned_units': 3957, 'planned_samples': 3957.0, 'gpu_hours': None}, 'recovery': {'wall_seconds': 600, 'gpu_hours': None}}, 'generation_counts': None, 'generation_applicability': {'check': 'generation_audit', 'status': 'not_applicable', 'enforce': False, 'reasons': ['spec.generation_audit opts out and no feature it covers is true'], 'features': {'generated_training_data': False}}, 'record': {'config': {'pilot': 'gs1_kernel 2 steps bw1.0, 64 rollouts/step, max_tokens 512; base eval 1319 items greedy'}, 'effective_config': {'base_model': 'Qwen/Qwen3.5-2B', 'arms': ['grpo_gs8', 'gs1_kernel'], 'steps': 40, 'batch_size': 64, 'max_seq_len': 1024, 'max_tokens': 512, 'n_eval': 1319, 'renderer': 'qwen3_5_disable_thinking', 'gs1_bandwidth': 1.0}, 'primary_endpoint': 'gsm8k_test_exact_match_accuracy_final_checkpoint', 'source': '/tmp/rx-gs1/pilot_gs1_kernel_bw1/train_log.jsonl, /tmp/rx-gs1/base/eval_summary.json', 'measurements': {'setup': {'seconds': 24.3, 'units': 1, 'planned_units': 1, 'samples': 0, 'gpu_count': None, 'allocation_source': None}, 'training': {'seconds': 39.4, 'units': 2, 'planned_units': 86, 'samples': 128, 'gpu_count': None, 'allocation_source': None}, 'evaluation': {'seconds': 221.4, 'units': 1319, 'planned_units': 3957, 'samples': 1319, 'gpu_count': None, 'allocation_source': None}}, 'generation': None, 'recovery': {'seconds': 600, 'gpu_count': None, 'allocation_source': None}}, 'recorded_at': 1793799957.066918}
- feasibility_reported_verdict
- refuted
- feasibility_required
- True
- generation_audit_validation
- {'status': 'not_applicable', 'reasons': ['spec.generation_audit opts out and no feature it covers is true'], 'applicability': {'check': 'generation_audit', 'status': 'not_applicable', 'enforce': False, 'reasons': ['spec.generation_audit opts out and no feature it covers is true'], 'features': {'generated_training_data': False}}}
- initialization_provenance
- {'version': 1, 'arms': {'grpo_gs8': {'initialization': {'base_checkpoint': 'Qwen/Qwen3.5-2B', 'checkpoint_uri': 'tinker://60274aeb8ec5c1b5424202bb802b577b/weights/init-r6bc25', 'checkpoint_immutable': True, 'checkpoint_scope': 'full_initialization', 'loaded_checkpoint_uri': 'tinker://60274aeb8ec5c1b5424202bb802b577b/weights/init-r6bc25', 'load_succeeded': True, 'adapter_sha256': None, 'source': 'server_response', 'evidence_ref': '/tmp/rx-gs1/grpo_gs8/load_response.json', 'before_first_update': True}, 'restore_count': 1, 'optimizer_checks': [{'after_restore': 0, 'before_next_update': True, 'requested': 'adam lr 4e-5 b1 0.9 b2 0.95 eps 1e-8', 'actual': None, 'source': 'declared'}, {'after_restore': 1, 'before_next_update': True, 'requested': 'adam lr 4e-5 b1 0.9 b2 0.95 eps 1e-8', 'actual': None, 'source': 'declared'}], 'initial_output': {'available': True, 'batch_sha256': 'd464c3b51a9333db80fe332d2316fa15c4dd683ecf9430915ba19c71541cb799', 'output_sha256': '83c9786b4798080cdc5c290919c83bf1ccef38560401306703fdcaf26d9ba4d1', 'evidence_ref': '/tmp/rx-gs1/grpo_gs8/init_provenance.json', 'before_first_update': True}}, 'gs1_kernel': {'initialization': {'base_checkpoint': 'Qwen/Qwen3.5-2B', 'checkpoint_uri': 'tinker://60274aeb8ec5c1b5424202bb802b577b/weights/init-r6bc25', 'checkpoint_immutable': True, 'checkpoint_scope': 'full_initialization', 'loaded_checkpoint_uri': 'tinker://60274aeb8ec5c1b5424202bb802b577b/weights/init-r6bc25', 'load_succeeded': True, 'adapter_sha256': None, 'source': 'server_response', 'evidence_ref': '/tmp/rx-gs1/gs1_kernel/load_response.json', 'before_first_update': True}, 'restore_count': 1, 'optimizer_checks': [{'after_restore': 0, 'before_next_update': True, 'requested': 'adam lr 4e-5 b1 0.9 b2 0.95 eps 1e-8', 'actual': None, 'source': 'declared'}, {'after_restore': 1, 'before_next_update': True, 'requested': 'adam lr 4e-5 b1 0.9 b2 0.95 eps 1e-8', 'actual': None, 'source': 'declared'}], 'initial_output': {'available': True, 'batch_sha256': 'd464c3b51a9333db80fe332d2316fa15c4dd683ecf9430915ba19c71541cb799', 'output_sha256': '83c9786b4798080cdc5c290919c83bf1ccef38560401306703fdcaf26d9ba4d1', 'evidence_ref': '/tmp/rx-gs1/gs1_kernel/init_provenance.json', 'before_first_update': True}}}, 'note': 'Shared Spindle rejects per-model seeds (Miles multi-LoRA), so both arms loaded one saved init state (weights only, fresh Adam). save_weights_external returned 404 or hung, so no adapter hash is available. Identical fixed-batch logprob hashes confirm both arms started from the same init. The server does not expose the active optimizer.'}
- launch
- {'experiment_id': 'exp_32150a771c', 'context_status': 'snapshotted', 'superseded': False, 'mode': 'ordinary', 'purpose': 'Execute the selected saved experiment version.'}
- progress_updated_at
- 1793800313.6201508
- reported_verdict
- refuted
- restoration_validation
- {'status': 'unverified', 'required': True, 'checks': [{'check': 'grpo_gs8', 'status': 'unverified', 'reason': 'grpo_gs8: missing or duplicate arm evidence.'}, {'check': 'gs1_kernel', 'status': 'unverified', 'reason': 'gs1_kernel: missing or duplicate arm evidence.'}], 'reason': 'grpo_gs8: missing or duplicate arm evidence.', 'applicability': 'required'}
- slack_started
- True
- started_at
- 1793797013.1025956
- verdict_report
- {'effect': -0.027293404094010616, 'margin': -0.03, 'lower': -0.1020827666751309, 'upper': 0.04749595848710968, 'seeds': 1, 'confidence': 'weak', 'reasoning': 'GS1 scored 2.7 points below GRPO. That point estimate sits inside the 3-point margin, but the paired one-sided Hoeffding lower bound (-0.095) is well below -0.03, so noninferiority is not shown. Under the spec this counts as inconclusive, which is recorded as refuted. Confidence is weak because there is one seed and the Hoeffding interval is wide. Also, the treatment used the pre-registered calibration bandwidth 1.0, because 0.5 failed the neff gate, and both arms used the non-thinking Qwen3.5 renderer.'}
Agent trace · 1 turn
Details
- run
- run_f6bc25c390
- backend
- agentcore
- conversation
- run_f6bc25c390
- experiment
- exp_32150a771c
- redone as
- run_970fb72c54 no result
- redone as
- run_5207121d26 weak evidence against
- created
- Nov 4, 12:56 UTC
- started
- Nov 4, 12:56 UTC
- finished
- Nov 4, 13:52 UTC
- duration
- 55m 10s
- turns
- 1
- GPU-h budget
- 2.0
- wall budget
- 120 min
- base model
- Qwen/Qwen3.5-2B
- training
- RL
- dataset
- gsm8k
- result
- final
- outcome reason
- insufficient evidence
- run_6aeadabb32 weak evidence against 12h ago
- run_c620dde9ff weak evidence for 12h ago
- run_926e8e1e12 weak evidence against 12h ago
- run_bf5c66cfd2 weak evidence for 12h ago
- run_970fb72c54 no result 14h ago
- run_5207121d26 weak evidence against 14h ago