Views
No views yet
ac1. Checkpoint saved
after training step 41 (0-indexed). Strict upstream eval parity:
1100s hard kill, verbatim prompts/entrypoints, group 64x8, T=1.0, kl 0.1.1{
2 "step": 41,
3 "progress/batch": 41,
4 "optim/lr": 4e-05,
5 "progress/done_frac": 0.84,
6 "puct/buffer_size": 664,
7 "puct/sampled_size": 8,
8 "puct/T": 20992,
9 "puct/scale_last": 0.5401118663278133,
10 "puct/buffer_value/mean": -1.5206375310840896,
11 "puct/buffer_value/std": 0.07189238269648719,
12 "puct/buffer_value/min": -2.0464450913574384,
13 "puct/buffer_value/max": -1.506333225029625,
14 "puct/buffer_timestep/mean": 19.746987951807228,
15 "puct/buffer_timestep/std": 11.981756587728098,
16 "puct/buffer_timestep/min": -1.0,
17 "puct/buffer_timestep/max": 40.0,
18 "puct/buffer_construction_len/mean": 1065.558734939759,
19 "puct/buffer_construction_len/std": 521.4635245092225,
20 "puct/buffer_construction_len/min": 1000.0,
21 "puct/buffer_construction_len/max": 7397.0,
22 "puct/sampled_value/mean": -1.506333225029628,
23 "puct/sampled_value/std": 2.6307835046141617e-15,
24 "puct/sampled_value/min": -1.5063332250296328,
25 "puct/sampled_value/max": -1.506333225029625,
26 "puct/sampled_timestep/mean": 40.0,
27 "puct/sampled_timestep/std": 0.0,
28 "puct/sampled_timestep/min": 40.0,
29 "puct/sampled_timestep/max": 40.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": 4192.709812402725,
35 "env/all/ac_tokens_per_turn": 9284.232421875,
36 "env/all/ob_tokens_per_turn": 2991.0,
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": 4753527,
41 "env/all/total_ob_tokens": 1531392,
42 "env/all/time/sampling_mean": 336.32679999247193,
43 "env/all/time/sampling_max": 443.57402443885803,
44 "env/all/time/env_step_mean": 1613.5324540892616,
45 "env/all/time/env_step_max": 3748.145266056061,
46 "env/all/reward/mean": 0.6103680967706998,
47 "env/all/reward/max": 0.6638637299802622,
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.6103680967706998,
53 "env/all/correctness": 0.93359375,
54 "env/all/correctness/min": 0.0,
55 "env/all/correctness/max": 1.0,
56 "env/all/raw_score": 1.5368357997123245,
57 "env/all/raw_score/min": 1.5063332250296222,
58 "env/all/raw_score/max": 2.2128459849693187,
59 "env/all/initial_raw_score": -1.5063332250296275,
60 "env/all/initial_raw_score/min": -1.5063332250296328,
61 "env/all/initial_raw_score/max": -1.506333225029625,
62 "env/all/msg": "Success; raw_score=1.506333225029625",
63 "env/all/parsed_code": "```python\nimport time\nimport numpy as np\nfrom scipy.optimize import linprog\nimport random\nimport copy\n\ndef propose_candidate(seed=42, **kwargs):\n \"\"\"\n Proposes a sequence of non-negative numbers to minimize the evaluation score \n using adaptive constraint selection and dynamic perturbation to escape local minima.\n This version avoids out-of-bounds errors by carefully selecting valid indices for constraints,\n and improves perturbation and constraint selection strategies.\n \"\"\"\n np.random.seed(seed)\n deadline = time.time() + 1000 - 10 # Run for up to 1000 seconds\n\n # Use the existing best sequence if available\n if 'height_sequence_1' in globals() and isinstance(height_sequence_1, (list, np.ndarray)):\n best_sequence = np.array(list(height_sequence_1))\n else:\n # Initialize with a structured sequence: peaks at boundaries and center\n n = 1000\n initial_sequence = np.zeros(n)\n initial_sequence[0] = initial_sequence[-1] = 0.05\n initial_sequence[n//2] = 0.5\n best_sequence = initial_sequence.copy()\n \n curr_sequence = best_sequence.copy()\n best_score = evaluate_sequence(curr_sequence.tolist())\n no_improvement_counter = 0\n iteration_count = 0\n n = len(curr_sequence)\n\n # Parameters for line search and perturbation\n k_values = [200, 400, 600, 800, 1000] # Wider constraint coverage\n perturbation_steps = 50 # Reduced frequency\n perturbation_scale = 0.015 # Smaller perturbations\n alpha_search_iterations = 150 # More thorough line search\n exploration_ratio = 0.8 # Broader exploration\n\n while time.time() < deadline:\n current_time = time.time()\n try:\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.001:\n raise ValueError(\"Sum too small\")\n # Select dynamic constraints based on current convolution\n k = k_values[iteration_count % len(k_values)]\n sorted_conv = sorted(enumerate(conv[:n]), key=lambda x: -x[1]) # Limit to first n indices\n top_indices = [i for i, _ in sorted_conv[:k]]\n bottom_k = int(k * 0.25)\n bottom_indices = [i for i, _ in sorted_conv[-bottom_k:]]\n spaced_indices = list(range(2, n, 50)) # More dense spacing\n all_indices = np.unique(np.concatenate([top_indices, bottom_indices, spaced_indices])).tolist()\n\n # Construct LP constraints with relaxed bounds\n A = []\n for j in all_indices:\n row = np.zeros(n)\n for m in range(n):\n i = j - m\n if 0 <= i < n:\n row[m] = curr_sequence[i]\n A.append(row)\n A = np.array(A)\n b = np.full(len(all_indices), max_b * 0.95) # Slightly less strict constraints\n\n # Define LP problem: maximize sum of g_0 under constraints\n c = [-1.0] * n # Minimize -sum(g) -> Maximize sum(g)\n bounds = [(0.0, 1000.0) for _ in range(n)]\n\n # Solve the LP using 'highs' for performance\n res = linprog(c=c, A_ub=A, b_ub=b, bounds=bounds, method='highs', options={\"feastol\": 1e-8})\n if res.success:\n g_0 = res.x\n sum_g = np.sum(g_0)\n if sum_g == 0:\n continue # Avoid division by zero\n\n # Normalize to theoretical normalization\n g_0_normalized = g_0 / sum_g * np.sqrt(2 * n)\n\n # Extended line search for optimal alpha\n low, high = 0.0, 1.0\n for _ in range(alpha_search_iterations):\n m1 = low + (high - low)/3\n m2 = high - (high - low)/3\n new_seq1 = (1 - m1) * curr_sequence + m1 * g_0_normalized\n new_seq2 = (1 - m2) * curr_sequence + m2 * g_0_normalized\n conv1 = np.convolve(new_seq1, new_seq1)\n conv2 = np.convolve(new_seq2, new_seq2)\n new_max_b1 = np.max(conv1)\n new_max_b2 = np.max(conv2)\n if new_max_b1 < new_max_b2:\n high = m2\n else:\n low = m1\n alpha_opt = (low + high) / 2\n new_sequence = (1 - alpha_opt) * curr_sequence + alpha_opt * g_0_normalized\n\n # Ensure non-negative and bounded values\n new_sequence = np.clip(new_sequence, 0.0, 1000.0)\n new_sequence = new_sequence / np.sum(new_sequence) * np.sqrt(2 * n)\n curr_sequence = new_sequence.copy()\n\n # Evaluate and update best sequence\n curr_score = evaluate_sequence(curr_sequence.tolist())\n if curr_score < best_score:\n best_score = curr_score\n best_sequence = curr_sequence.copy()\n no_improvement_counter = 0\n print(f\"New best score: {best_score}\")\n else:\n no_improvement_counter += 1\n else:\n print(\"LP solution not found, breaking\")\n break\n\n # Targeted and random perturbation for exploration\n if iteration_count % perturbation_steps == 0:\n # Identify indices with high and low contribution to max_b\n conv = np.convolve(curr_sequence, curr_sequence)\n top_k = int(n / 10)\n top_indices = np.argsort(conv)[:top_k]\n bottom_k = int(n / 20)\n bottom_indices = np.argsort(conv)[-bottom_k:]\n # Use boolean mask to avoid indexing errors\n peak_mask = np.zeros(n, dtype=bool)\n peak_mask[top_indices] = True\n peak_mask[bottom_indices] = True\n if np.any(peak_mask):\n curr_sequence[peak_mask] -= np.random.uniform(0.0005, 0.002, np.sum(peak_mask))\n curr_sequence[peak_mask] = np.maximum(curr_sequence[peak_mask], 0.0)\n # Add random noise for broader exploration\n curr_sequence += np.random.uniform(-0.002, 0.002, n)\n curr_sequence = np.clip(curr_sequence, 0.0, 1000.0)\n curr_sequence = curr_sequence / np.sum(curr_sequence) * np.sqrt(2 * n)\n\n # Early stopping if no improvement for many iterations\n iteration_count += 1\n if iteration_count % 100 == 0:\n print(f\"Iteration {iteration_count}, current best score: {best_score}\")\n if no_improvement_counter > 250: # Increased threshold\n print(\"No improvement for 250 iterations, stopping early\")\n break\n\n except Exception as e:\n print(f\"Error during optimization: {e}. Skipping update.\")\n continue\n\n # Final safety check to ensure non-negative and valid values\n final_sequence = np.maximum(0.0, best_sequence).tolist()\n return [float(x) for x in final_sequence]\n```",
64 "env/all/time/policy": 336.32679999247193,
65 "env/all/time/policy/min": 103.07667422294617,
66 "env/all/time/policy/max": 443.57402443885803,
67 "env/all/time/env_step": 1613.5324540892616,
68 "env/all/time/env_step/min": 2.122379779815674,
69 "env/all/time/env_step/max": 3748.145266056061,
70 "env/all/time/reward_compute": 3.1013041734695435e-07,
71 "env/all/time/reward_compute/min": 2.2351741790771484e-07,
72 "env/all/time/reward_compute/max": 4.172325134277344e-07,
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.0024796975776553154,
77 "advantage/min": -1.0,
78 "advantage/max": 0.36956512928009033,
79 "time/assemble_training_data": 9.380635976791382,
80 "time/kl_vs_base": 98.600839138031,
81 "kl_policy_base": 0.000698066025506705,
82 "time/train": 594.6496734619141,
83 "time/save_checkpoint": 17.224318027496338,
84 "time/total": 4915.65757060051
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
[2026-07-11T13:13:37+00:00] job=1824165 node=node-6 ngpu=3 ntrain=1 replicas=2 flash_attn=yes
[2026-07-12T04:58:24+00:00] job=1827204 node=node-4 ngpu=6 ntrain=2 replicas=4 flash_attn=yes