Views
No views yet
ac1. Checkpoint saved
after training step 17 (0-indexed). Strict upstream eval parity:
1100s hard kill, verbatim prompts/entrypoints, group 64x8, T=1.0, kl 0.1.1{
2 "step": 17,
3 "progress/batch": 17,
4 "optim/lr": 4e-05,
5 "progress/done_frac": 0.36,
6 "puct/buffer_size": 280,
7 "puct/sampled_size": 8,
8 "puct/T": 8704,
9 "puct/scale_last": 0.39926077669397264,
10 "puct/buffer_value/mean": -1.5297247002783365,
11 "puct/buffer_value/std": 0.09266032881336951,
12 "puct/buffer_value/min": -2.000000000000008,
13 "puct/buffer_value/max": -1.5063622641000978,
14 "puct/buffer_timestep/mean": 7.742857142857143,
15 "puct/buffer_timestep/std": 5.055932058443017,
16 "puct/buffer_timestep/min": -1.0,
17 "puct/buffer_timestep/max": 16.0,
18 "puct/buffer_construction_len/mean": 1155.4678571428572,
19 "puct/buffer_construction_len/std": 794.2737916548008,
20 "puct/buffer_construction_len/min": 1000.0,
21 "puct/buffer_construction_len/max": 7397.0,
22 "puct/sampled_value/mean": -1.5063694426234466,
23 "puct/sampled_value/std": 4.6329241587668095e-06,
24 "puct/sampled_value/min": -1.506375083172288,
25 "puct/sampled_value/max": -1.5063622641000978,
26 "puct/sampled_timestep/mean": 16.0,
27 "puct/sampled_timestep/std": 0.0,
28 "puct/sampled_timestep/min": 16.0,
29 "puct/sampled_timestep/max": 16.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": 5992.733999013901,
35 "env/all/ac_tokens_per_turn": 8386.328125,
36 "env/all/ob_tokens_per_turn": 3347.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": 4293800,
41 "env/all/total_ob_tokens": 1713792,
42 "env/all/time/sampling_mean": 299.34031977225095,
43 "env/all/time/sampling_max": 405.99402952194214,
44 "env/all/time/env_step_mean": 2839.901527858805,
45 "env/all/time/env_step_max": 5585.936132669449,
46 "env/all/reward/mean": 0.6239867955534586,
47 "env/all/reward/max": 0.6638570466565665,
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.6239867955534586,
53 "env/all/correctness": 0.958984375,
54 "env/all/correctness/min": 0.0,
55 "env/all/correctness/max": 1.0,
56 "env/all/raw_score": 1.5805111715380622,
57 "env/all/raw_score/min": 1.5063483899098538,
58 "env/all/raw_score/max": 16.310520087597865,
59 "env/all/initial_raw_score": -1.5063694426234462,
60 "env/all/initial_raw_score/min": -1.506375083172288,
61 "env/all/initial_raw_score/max": -1.5063622641000978,
62 "env/all/msg": "Success; raw_score=1.5063622641000978",
63 "env/all/parsed_code": "```python\nimport time\nimport numpy as np\nfrom scipy.optimize import linprog\nimport random\n\ndef propose_candidate(seed=42, budget_s=1000, **kwargs):\n \"\"\"\n Proposes a sequence of non-negative numbers to minimize the evaluation score \n using an adaptive exploration strategy with dynamic perturbations, varied initialization,\n and enhanced global exploration to escape local minima.\n \"\"\"\n np.random.seed(seed)\n deadline = time.time() + budget_s - 10\n\n # Initialize with a more distributed starting point\n n = 1000\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 # Start with a distributed sequence: spread mass to many evenly spaced positions\n total_mass = np.sqrt(2 * n)\n peak_positions = [int(i * n / 20) for i in range(20)]\n seq = np.zeros(n)\n for idx in peak_positions:\n seq[idx] = total_mass / 20\n best_sequence = seq.tolist()\n \n curr_sequence = [float(x) for x in best_sequence]\n best_score = evaluate_sequence(curr_sequence)\n\n # Parameters for optimization with increased exploration\n perturb_rate = 0.5 # Larger initial perturbation rate\n blend_factor = 0.95 # Higher blend factor for LP solutions\n min_perturb = 0.01\n no_improvement_threshold = 10 # Lower threshold for more frequent perturbations\n no_improvement_counter = 0\n perturb_decay_factor = 0.98\n global_perturb_interval = 15 # More frequent global perturbations\n global_perturb_rate = 0.3\n explore_rate = 0.45\n\n def solve_convolution_lp(f_sequence, rhs, n):\n \"\"\"Solves LP to maximize sum(b) under convolution constraint\"\"\"\n if n == 0:\n return None\n \n # Build the objective function (maximize sum(b) = minimize -sum(b))\n c = -np.ones(n)\n A_ub = []\n b_ub = []\n\n # Construct the constraints: (f * b)[k] <= rhs for all k\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 try:\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,\n \"disp\": False,\n },\n )\n if result.success:\n return result.x\n except:\n pass\n return None\n\n def perturb_sequence(sequence, idxs, perturb_amount):\n \"\"\"Perturb multiple indices in sequence with controlled amounts.\"\"\"\n new_seq = sequence.copy()\n for idx in idxs:\n # Apply perturbation with dynamic scaling\n delta = perturb_amount * new_seq[idx]\n new_seq[idx] = max(0.0, new_seq[idx] - delta)\n new_seq[idx] = min(1000.0, new_seq[idx])\n return new_seq\n\n iteration_count = 0\n while time.time() < deadline:\n try:\n # Compute current convolution and max_b\n conv = np.convolve(curr_sequence, curr_sequence)\n max_b = np.max(conv)\n sum_a = np.sum(curr_sequence)\n if sum_a < 0.01:\n raise ValueError(\"Sum too small\")\n\n # Normalize for LP\n normalized_seq = curr_sequence.copy()\n rhs = max_b\n\n # Solve LP to maximize sum(b) under convolution constraint\n g_fun = solve_convolution_lp(normalized_seq, rhs, n)\n if g_fun is not None and np.sum(g_fun) > 0.0:\n sum_g = np.sum(g_fun)\n # Scale the LP solution to match the original sequence's normalization\n normalized_g = [x / sum_g * sum_a for x in g_fun]\n curr_sequence = normalized_g\n # Replace the sequence with the LP solution directly\n else:\n # Fallback to targeted perturbation with increased exploration\n if no_improvement_counter >= no_improvement_threshold:\n perturb_rate = min(0.8, perturb_rate * perturb_decay_factor)\n no_improvement_counter = 0\n else:\n perturb_rate = max(0.05, perturb_rate)\n\n # Randomly choose indices for perturbation\n conv = np.convolve(curr_sequence, curr_sequence)\n max_idx = np.argmax(conv)\n contributions = []\n for i in range(n):\n j = max_idx - i\n if 0 <= j < n:\n contributions.append((i, abs(curr_sequence[i] * curr_sequence[j])))\n if contributions:\n sorted_contributions = sorted(contributions, key=lambda x: x[1], reverse=True)\n idxs = [sorted_contributions[i][0] for i in range(min(5, len(sorted_contributions)))]\n \n # Also add some random indices\n random_indices = np.random.choice(n, size=3, replace=False)\n idxs = list(set(idxs + random_indices)) # to avoid duplicates\n\n curr_sequence = perturb_sequence(curr_sequence, idxs, perturb_rate)\n else:\n idx = np.random.randint(0, n)\n curr_sequence = perturb_sequence(curr_sequence, [idx], perturb_rate)\n\n # Occasionally apply global perturbation with increased frequency\n if iteration_count % global_perturb_interval == 0:\n # Apply a large random perturbation to the entire sequence\n perturb_amount = 0.2 * np.mean(curr_sequence)\n new_seq = [max(0.0, x - perturb_amount * np.random.rand()) for x in curr_sequence]\n new_seq = [min(1000.0, x) for x in new_seq]\n curr_sequence = new_seq\n\n except Exception as e:\n print(f\"Error during optimization: {e}. 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 no_improvement_counter = 0\n else:\n no_improvement_counter += 1\n iteration_count += 1\n except Exception:\n print(\"Evaluation error, skipping update\")\n\n return [float(max(0.0, x)) for x in best_sequence]\n```",
64 "env/all/time/policy": 299.34031977225095,
65 "env/all/time/policy/min": 69.19947218894958,
66 "env/all/time/policy/max": 405.99402952194214,
67 "env/all/time/env_step": 2839.901527858805,
68 "env/all/time/env_step/min": 0.009005069732666016,
69 "env/all/time/env_step/max": 5585.936132669449,
70 "env/all/time/reward_compute": 6.50063157081604e-07,
71 "env/all/time/reward_compute/min": 2.384185791015625e-07,
72 "env/all/time/reward_compute/max": 1.952052116394043e-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.01129012182354927,
77 "advantage/min": -1.0,
78 "advantage/max": 17.04767417907715,
79 "time/assemble_training_data": 10.395031690597534,
80 "time/kl_vs_base": 96.2479190826416,
81 "kl_policy_base": 0.0007994159823283553,
82 "time/train": 561.4679391384125,
83 "time/save_checkpoint": 33.59800124168396,
84 "time/total": 6696.838715553284
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