Views
No views yet
ac1. Checkpoint saved
after training step 2 (0-indexed). Strict upstream eval parity:
1100s hard kill, verbatim prompts/entrypoints, group 64x8, T=1.0, kl 0.1.1{
2 "step": 2,
3 "progress/batch": 2,
4 "optim/lr": 4e-05,
5 "progress/done_frac": 0.06,
6 "puct/buffer_size": 40,
7 "puct/sampled_size": 8,
8 "puct/T": 1024,
9 "puct/scale_last": 0.39621565537633097,
10 "puct/buffer_value/mean": -1.6602156549191924,
11 "puct/buffer_value/std": 0.20047747839865995,
12 "puct/buffer_value/min": -2.000000000000008,
13 "puct/buffer_value/max": -1.5094073854177394,
14 "puct/buffer_timestep/mean": 0.2,
15 "puct/buffer_timestep/std": 0.7483314773547883,
16 "puct/buffer_timestep/min": -1.0,
17 "puct/buffer_timestep/max": 1.0,
18 "puct/buffer_construction_len/mean": 2016.125,
19 "puct/buffer_construction_len/std": 1878.7790874328466,
20 "puct/buffer_construction_len/min": 1000.0,
21 "puct/buffer_construction_len/max": 7397.0,
22 "puct/sampled_value/mean": -1.5128093751299212,
23 "puct/sampled_value/std": 0.002021999176036334,
24 "puct/sampled_value/min": -1.5154654362502897,
25 "puct/sampled_value/max": -1.5094073854177394,
26 "puct/sampled_timestep/mean": 1.0,
27 "puct/sampled_timestep/std": 0.0,
28 "puct/sampled_timestep/min": 1.0,
29 "puct/sampled_timestep/max": 1.0,
30 "puct/sampled_construction_len/mean": 1098.25,
31 "puct/sampled_construction_len/std": 133.90831751612743,
32 "puct/sampled_construction_len/min": 1000.0,
33 "puct/sampled_construction_len/max": 1360.0,
34 "time/sampling": 5267.190141916275,
35 "env/all/ac_tokens_per_turn": 8109.30859375,
36 "env/all/ob_tokens_per_turn": 2707.25,
37 "env/all/turns_per_episode": 1.0,
38 "env/all/total_episodes": 512,
39 "env/all/total_turns": 512,
40 "env/all/total_ac_tokens": 4151966,
41 "env/all/total_ob_tokens": 1386112,
42 "env/all/time/sampling_mean": 272.87732260348275,
43 "env/all/time/sampling_max": 353.80470871925354,
44 "env/all/time/env_step_mean": 2319.958712028805,
45 "env/all/time/env_step_max": 4916.7115483284,
46 "env/all/reward/mean": 0.45302979404498467,
47 "env/all/reward/max": 0.662511660560165,
48 "env/all/reward/min": 0.0,
49 "env/all/format": 1.0,
50 "env/all/format/min": 1.0,
51 "env/all/format/max": 1.0,
52 "env/all/reward": 0.45302979404498467,
53 "env/all/correctness": 0.775390625,
54 "env/all/correctness/min": 0.0,
55 "env/all/correctness/max": 1.0,
56 "env/all/raw_score": 18.83462837226204,
57 "env/all/raw_score/min": 1.5094073854177394,
58 "env/all/raw_score/max": 2374.6995510631473,
59 "env/all/initial_raw_score": -1.5128093751299212,
60 "env/all/initial_raw_score/min": -1.5154654362502897,
61 "env/all/initial_raw_score/max": -1.5094073854177394,
62 "env/all/msg": "Success; raw_score=1.525760680107965",
63 "env/all/parsed_code": "```python\n# EVOLVE-BLOCK-START\n\"\"\"Enhanced stochastic gradient evolution with adaptive exploration for improved C1 optimization.\"\"\"\n\nimport time\nimport numpy as np\nfrom scipy import optimize\n\nlinprog = optimize.linprog\n\ndef get_good_direction_to_move_into(sequence):\n \"\"\"Returns a better sequence using LP optimization or gradient-informed perturbations.\"\"\"\n n = len(sequence)\n if n == 0:\n return None\n \n sum_sequence = np.sum(sequence)\n if sum_sequence <= 0.0:\n return None\n\n # Normalize sequence for LP\n normalized_sequence = [x * np.sqrt(2 * n) / sum_sequence for x in sequence]\n rhs = np.max(np.convolve(normalized_sequence, normalized_sequence))\n \n # Attempt to find a better direction via LP\n g_fun = solve_convolution_lp(normalized_sequence, rhs)\n if g_fun is not None and np.sum(g_fun) > 0.0:\n normalized_g_fun = [x * np.sqrt(2 * n) / np.sum(g_fun) for x in g_fun]\n \n # Golden section search to find optimal t\n left = 0.0\n right = 1.0\n for _ in range(100):\n t1 = left + (right - left) / 4.0\n t2 = right - (right - left) / 4.0\n val1 = evaluate_sequence([max(0.0, (1 - t1)*x + t1*y) for x, y in zip(sequence, normalized_g_fun)])\n val2 = evaluate_sequence([max(0.0, (1 - t2)*x + t2*y) for x, y in zip(sequence, normalized_g_fun)])\n \n if val1 < val2:\n right = t2\n else:\n left = t1\n \n best_t = (left + right) / 2.0\n new_seq = [(1 - best_t)*x + best_t*y for x, y in zip(sequence, normalized_g_fun)]\n return [max(0.0, x) for x in new_seq]\n\n # If LP fails, try gradient-informed perturbations\n def perturb_func(direction):\n return [sequence[i] + direction[i] * 0.1 for i in range(n)]\n \n best_perturbation = np.zeros(n)\n best_score = float('inf')\n \n # Use a more accurate finite difference estimate\n for idx in range(n):\n direction = np.zeros(n)\n direction[idx] = 1.0\n perturbed_seq = perturb_func(direction)\n score = evaluate_sequence(perturbed_seq)\n if score < best_score:\n best_perturbation = direction\n best_score = score\n \n direction[idx] = -1.0\n perturbed_seq = perturb_func(direction)\n score = evaluate_sequence(perturbed_seq)\n if score < best_score:\n best_perturbation = direction\n best_score = score\n\n if np.sum(best_perturbation) > 0.0:\n # Move in the best perturbation direction\n step_size = 0.5\n new_seq = [sequence[i] + best_perturbation[i] * step_size for i in range(n)]\n new_seq = [max(0.0, x) for x in new_seq]\n return new_seq\n\n # If no improvement found, apply structured perturbation\n idx = np.random.randint(0, len(sequence))\n new_seq = sequence.copy()\n new_seq[idx] = max(0.0, new_seq[idx] + np.random.randn() * 0.5)\n return new_seq\n\ndef solve_convolution_lp(f_sequence, rhs):\n \"\"\"Solves LP to maximize sum(b) s.t. conv(f, b) <= rhs, b >= 0.\"\"\"\n n = len(f_sequence)\n if n == 0:\n return None\n\n # Construct constraint matrix and bounds\n c = -np.ones(n)\n a_ub = []\n b_ub = []\n\n for k in range(2 * n - 1):\n row = np.zeros(n)\n for i in range(n):\n j = k - i\n if 0 <= j < n:\n row[j] = f_sequence[i]\n a_ub.append(row)\n b_ub.append(rhs)\n\n # Non-negativity constraints\n a_ub_nonneg = -np.eye(n)\n b_ub_nonneg = np.zeros(n)\n a_ub = np.vstack([a_ub, a_ub_nonneg])\n b_ub = np.hstack([b_ub, b_ub_nonneg])\n\n # Solve LP with increased tolerances and time limit\n result = linprog(\n c,\n A_ub=a_ub,\n b_ub=b_ub,\n bounds=(0.0, None),\n method='highs',\n options={\"time_limit\": 60.0, \"feastol\": 1e-8, \"infodisp\": False}\n )\n if result.success:\n return result.x\n return None\n\ndef propose_candidate(seed=42, budget_s=1000, **kwargs):\n np.random.seed(seed)\n deadline = time.time() + budget_s - 30 # Reserve 30 seconds for final refinement\n\n # Use a Gaussian-like structured initial guess\n length = 1000\n mu = length // 2\n sigma = length // 4\n best_sequence = [np.exp(-((i - mu) ** 2) / (2 * sigma ** 2)) * 200.0 for i in range(length)]\n best_sequence = [max(0.0, x) for x in best_sequence]\n curr_sequence = best_sequence.copy()\n best_score = evaluate_sequence(curr_sequence)\n\n # Refinement phase with population-based exploration\n pop_size = 10\n pop = [curr_sequence.copy() for _ in range(pop_size)]\n scores = [evaluate_sequence(seq) for seq in pop]\n for _ in range(100): # Refinement iterations\n if time.time() > deadline:\n break\n\n # Select top performers and perturb\n for i in range(pop_size):\n if np.random.rand() < 0.3: # Mutation with some probability\n direction = np.random.randn(len(curr_sequence)) * 0.1\n pop[i] = [max(0.0, x + direction[j] * 0.1) for j, x in enumerate(pop[i])]\n pop[i] = [min(1000.0, x) for x in pop[i]]\n else:\n # Crossover with top performer\n idx = np.random.choice(range(pop_size))\n pop[i] = [(x + y) / 2.0 for x, y in zip(pop[i], pop[idx])]\n\n # Evaluate new population\n new_scores = [evaluate_sequence(seq) for seq in pop]\n for i in range(pop_size):\n if new_scores[i] < scores[i]:\n scores[i] = new_scores[i]\n pop[i] = [max(0.0, x) for x in pop[i]]\n else:\n # Add some randomness to avoid local optima\n pop[i] = [max(0.0, x + np.random.randn() * 0.01) for x in pop[i]]\n\n # Update best\n curr_idx = np.argmin(scores)\n if scores[curr_idx] < best_score:\n best_score = scores[curr_idx]\n curr_sequence = pop[curr_idx].copy()\n\n # Final refinement with directional perturbations\n while time.time() < deadline:\n h_sequence = get_good_direction_to_move_into(curr_sequence)\n if not h_sequence:\n print(\"Unable to find new direction, applying structured perturbation.\")\n # Apply structured perturbation: add Gaussian noise\n perturb = np.random.normal(0, 0.1, length)\n for i in range(len(curr_sequence)):\n curr_sequence[i] = max(0.0, curr_sequence[i] + perturb[i])\n else:\n curr_sequence = h_sequence\n\n try:\n curr_score = evaluate_sequence(curr_sequence)\n if curr_score < best_score:\n best_score = curr_score\n best_sequence = curr_sequence.copy()\n print(f\"New best score: {best_score}\")\n except Exception:\n print(\"Evaluation error, skipping update\")\n\n return [float(max(0.0, x)) for x in best_sequence]\n# EVOLVE-BLOCK-END\n```",
64 "env/all/time/policy": 272.87732260348275,
65 "env/all/time/policy/min": 94.50694799423218,
66 "env/all/time/policy/max": 353.80470871925354,
67 "env/all/time/env_step": 2319.958712028805,
68 "env/all/time/env_step/min": 0.008078336715698242,
69 "env/all/time/env_step/max": 4916.7115483284,
70 "env/all/time/reward_compute": 3.9674341678619385e-07,
71 "env/all/time/reward_compute/min": 1.862645149230957e-07,
72 "env/all/time/reward_compute/max": 1.0021030902862549e-06,
73 "env/all/by_group/frac_mixed": 1.0,
74 "env/all/by_group/frac_all_good": 0.0,
75 "env/all/by_group/frac_all_bad": 0.0,
76 "advantage/mean": 0.021786779165267944,
77 "advantage/min": -1.0,
78 "advantage/max": 6.363253116607666,
79 "time/assemble_training_data": 9.321037292480469,
80 "time/kl_vs_base": 82.40223693847656,
81 "kl_policy_base": 0.0005916905938647687,
82 "time/train": 509.56192994117737,
83 "time/save_checkpoint": 34.23090076446533,
84 "time/total": 5907.8734221458435
85}[2026-07-09T06:24:18+00:00] job=1812628 node=node-12 ngpu=3 ntrain=1 replicas=2 flash_attn=no
[2026-07-09T08:30:32+00:00] job=1813127 node=node-22 ngpu=3 ntrain=1 replicas=2 flash_attn=yes
[2026-07-09T13:07:08+00:00] job=1813128 node=node-6 ngpu=6 ntrain=2 replicas=4 flash_attn=yes