Views
No views yet
ac1. Checkpoint saved
after training step 6 (0-indexed). Strict upstream eval parity:
1100s hard kill, verbatim prompts/entrypoints, group 64x8, T=1.0, kl 0.1.1{
2 "step": 6,
3 "progress/batch": 6,
4 "optim/lr": 4e-05,
5 "progress/done_frac": 0.14,
6 "puct/buffer_size": 104,
7 "puct/sampled_size": 8,
8 "puct/T": 3072,
9 "puct/scale_last": 0.3983494764216686,
10 "puct/buffer_value/mean": -1.56796014043435,
11 "puct/buffer_value/std": 0.14415141894999392,
12 "puct/buffer_value/min": -2.000000000000008,
13 "puct/buffer_value/max": -1.5072735643724018,
14 "puct/buffer_timestep/mean": 2.230769230769231,
15 "puct/buffer_timestep/std": 1.8873606379054302,
16 "puct/buffer_timestep/min": -1.0,
17 "puct/buffer_timestep/max": 5.0,
18 "puct/buffer_construction_len/mean": 1418.5673076923076,
19 "puct/buffer_construction_len/std": 1260.306958675171,
20 "puct/buffer_construction_len/min": 1000.0,
21 "puct/buffer_construction_len/max": 7397.0,
22 "puct/sampled_value/mean": -1.507929291896267,
23 "puct/sampled_value/std": 0.0006364438237031045,
24 "puct/sampled_value/min": -1.5088346922849323,
25 "puct/sampled_value/max": -1.5072735643724018,
26 "puct/sampled_timestep/mean": 5.0,
27 "puct/sampled_timestep/std": 0.0,
28 "puct/sampled_timestep/min": 5.0,
29 "puct/sampled_timestep/max": 5.0,
30 "puct/sampled_construction_len/mean": 1000.0,
31 "puct/sampled_construction_len/std": 0.0,
32 "puct/sampled_construction_len/min": 1000.0,
33 "puct/sampled_construction_len/max": 1000.0,
34 "time/sampling": 5270.645036458969,
35 "env/all/ac_tokens_per_turn": 8543.51953125,
36 "env/all/ob_tokens_per_turn": 2975.5,
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": 4374282,
41 "env/all/total_ob_tokens": 1523456,
42 "env/all/time/sampling_mean": 305.2312178169377,
43 "env/all/time/sampling_max": 413.9444532394409,
44 "env/all/time/env_step_mean": 2286.9632207006216,
45 "env/all/time/env_step_max": 4900.118104934692,
46 "env/all/reward/mean": 0.5002090068352103,
47 "env/all/reward/max": 0.6634795836370978,
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.5002090068352103,
53 "env/all/correctness": 0.7890625,
54 "env/all/correctness/min": 0.0,
55 "env/all/correctness/max": 1.0,
56 "env/all/raw_score": 4.289811945092578,
57 "env/all/raw_score/min": 1.5072053730475787,
58 "env/all/raw_score/max": 973.2698205870774,
59 "env/all/initial_raw_score": -1.507929291896267,
60 "env/all/initial_raw_score/min": -1.5088346922849323,
61 "env/all/initial_raw_score/max": -1.5072735643724018,
62 "env/all/msg": "Success; raw_score=1.5072592703213812",
63 "env/all/parsed_code": "```python\nimport time\nimport numpy as np\nfrom scipy import optimize\nimport random\n\nlinprog = optimize.linprog\n\ndef propose_candidate(seed=42, budget_s=1000, **kwargs):\n \"\"\"\n Proposes a sequence of non-negative numbers that minimizes the evaluation score \n using a hybrid of multi-start initialization, adaptive line search, and diverse \n perturbation strategies with increased LP time limits to find better directions.\n \"\"\"\n np.random.seed(seed)\n deadline = time.time() + budget_s - 10\n\n # Use the last best construction if available\n best_sequence = None\n if 'height_sequence_1' in globals() and isinstance(height_sequence_1, (list, np.ndarray)):\n best_sequence = list(height_sequence_1)\n else:\n # Try different starting sequences to escape local minima\n n = 1000\n initial_sequences = []\n \n # Sparse initialization\n sparse_seq = [0.0] * n\n num_large = min(20, n // 2)\n for i in range(num_large):\n idx = np.random.randint(0, n)\n sparse_seq[idx] = 1.0\n initial_sequences.append(sparse_seq)\n \n # Uniform initialization\n uniform_seq = [1.0 / np.sqrt(2 * n) for _ in range(n)]\n initial_sequences.append(uniform_seq)\n \n # Random initialization\n random_seq = [np.random.uniform(0.0, 0.1) for _ in range(n)]\n initial_sequences.append(random_seq)\n \n # Structured initialization with periodic peaks\n structured_seq = [0.0] * n\n for i in range(min(50, n // 2)):\n idx = i * (n // 50)\n structured_seq[idx] = 1.0\n initial_sequences.append(structured_seq)\n \n # Evaluate all initial sequences\n best_seq = None\n best_score = float('inf')\n for seq in initial_sequences:\n try:\n score = evaluate_sequence(seq)\n if score < best_score:\n best_score = score\n best_seq = seq\n except:\n pass\n \n best_sequence = best_seq\n \n curr_sequence = [float(max(0.0, x)) for x in best_sequence]\n best_score = evaluate_sequence(curr_sequence)\n\n while time.time() < deadline:\n try:\n h_function = get_good_direction_to_move_into(curr_sequence)\n if h_function is not None:\n curr_sequence = h_function\n else:\n print(\"LP failed, applying targeted perturbations to lower max_b.\")\n idx = perturb_targeted(curr_sequence)\n curr_sequence = perturb_sequence(curr_sequence, idx, 5.0) # Larger perturbation\n except Exception:\n print(\"Evaluation error, skipping update\")\n continue\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\ndef get_good_direction_to_move_into(sequence):\n \"\"\"Returns a better sequence using LP optimization with adaptive line search using increased time limits.\"\"\"\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 the 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 sequence via LP with increased time limit\n g_fun = solve_convolution_lp(normalized_sequence, rhs)\n if g_fun is not None and np.sum(g_fun) > 0.0:\n sum_g = np.sum(g_fun)\n normalized_g_fun = [x * np.sqrt(2 * n) / sum_g for x in g_fun]\n # Perform line search to find the optimal t\n best_t = 0.5\n best_new_score = np.inf\n for t_candidate in np.linspace(0.05, 0.95, 50): # Reduced points for speed\n new_sequence = [(1 - t_candidate) * x + t_candidate * y for x, y in zip(sequence, normalized_g_fun)]\n try:\n new_score = evaluate_sequence(new_sequence)\n if new_score < best_new_score:\n best_new_score = new_score\n best_t = t_candidate\n except:\n pass\n new_sequence = [(1 - best_t) * x + best_t * y for x, y in zip(sequence, normalized_g_fun)]\n return new_sequence\n\n # If LP fails, compute the convolution to find the max_b position\n conv = np.convolve(normalized_sequence, normalized_sequence)\n max_conv_idx = np.argmax(conv)\n max_conv_val = conv[max_conv_idx]\n # Identify elements contributing to this maximum\n perturb_elements = set()\n for i in range(n):\n j = max_conv_idx - i\n if 0 <= j < n:\n perturb_elements.add(i)\n perturb_elements.add(j)\n if perturb_elements:\n idx = perturb_targeted(normalized_sequence, max_conv_idx)\n new_seq = normalized_sequence.copy()\n new_seq[idx] = max(0.0, new_seq[idx] - np.random.randn() * 3.0)\n return new_seq\n else:\n # If no elements are contributing, fall back to random\n idx = np.random.randint(0, len(normalized_sequence))\n new_seq = normalized_sequence.copy()\n new_seq[idx] = max(0.0, new_seq[idx] - np.random.randn() * 2.0)\n return new_seq\n\ndef perturb_targeted(sequence, max_conv_idx):\n \"\"\"Perturb the element most affecting max_conv_idx.\"\"\"\n n = len(sequence)\n contributions = []\n for i in range(n):\n j = max_conv_idx - i\n if 0 <= j < n:\n contributions.append((i, abs(sequence[i] * sequence[j])))\n if contributions:\n sorted_contributions = sorted(contributions, key=lambda x: x[1], reverse=True)\n return sorted_contributions[0][0]\n else:\n return np.random.randint(0, n)\n\ndef perturb_sequence(sequence, idx, perturb_amount):\n \"\"\"Perturb the sequence at the given index by a larger amount.\"\"\"\n new_seq = sequence.copy()\n new_seq[idx] = max(0.0, new_seq[idx] - np.random.randn() * perturb_amount) # Subtract to lower max_b\n new_seq[idx] = min(1000.0, new_seq[idx])\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 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 # Use a more resilient LP solver with extended time limit\n result = linprog(\n c,\n A_ub=a_ub,\n b_ub=b_ub,\n bounds=(0.0, 1000.0),\n method='highs',\n options={\n \"time_limit\": 60.0, # Increased from 30 to 60 seconds for more thorough LP solving\n \"disp\": False,\n },\n )\n\n if result.success:\n return result.x\n return None\n```",
64 "env/all/time/policy": 305.2312178169377,
65 "env/all/time/policy/min": 106.21112275123596,
66 "env/all/time/policy/max": 413.9444532394409,
67 "env/all/time/env_step": 2286.9632207006216,
68 "env/all/time/env_step/min": 0.004893064498901367,
69 "env/all/time/env_step/max": 4900.118104934692,
70 "env/all/time/reward_compute": 6.174668669700623e-07,
71 "env/all/time/reward_compute/min": 2.384185791015625e-07,
72 "env/all/time/reward_compute/max": 2.0265579223632812e-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.0235113725066185,
77 "advantage/min": -1.0,
78 "advantage/max": 10.92990779876709,
79 "time/assemble_training_data": 5.661258697509766,
80 "time/kl_vs_base": 84.39825916290283,
81 "kl_policy_base": 0.0006263284012675285,
82 "time/train": 549.2556200027466,
83 "time/save_checkpoint": 34.07676672935486,
84 "time/total": 5945.699632167816
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