Views
No views yet
ac2. Checkpoint saved
after training step 13 (0-indexed). Strict upstream eval parity:
1100s hard kill, verbatim prompts/entrypoints, group 64x8, T=1.0, kl 0.1.1{
2 "step": 13,
3 "progress/batch": 13,
4 "optim/lr": 4e-05,
5 "progress/done_frac": 0.28,
6 "puct/buffer_size": 213,
7 "puct/sampled_size": 8,
8 "puct/T": 6656,
9 "puct/scale_last": 0.18949366619241537,
10 "puct/buffer_value/mean": 0.91827097009737,
11 "puct/buffer_value/std": 0.055835486912510404,
12 "puct/buffer_value/min": 0.6666666666666636,
13 "puct/buffer_value/max": 0.9459495264324065,
14 "puct/buffer_timestep/mean": 5.779342723004695,
15 "puct/buffer_timestep/std": 3.9125589935291845,
16 "puct/buffer_timestep/min": -1.0,
17 "puct/buffer_timestep/max": 12.0,
18 "puct/buffer_construction_len/mean": 3422.0798122065726,
19 "puct/buffer_construction_len/std": 2706.245171432609,
20 "puct/buffer_construction_len/min": 1024.0,
21 "puct/buffer_construction_len/max": 32768.0,
22 "puct/sampled_value/mean": 0.9453356285904737,
23 "puct/sampled_value/std": 0.000381855052921037,
24 "puct/sampled_value/min": 0.9446357709876729,
25 "puct/sampled_value/max": 0.9457399588945222,
26 "puct/sampled_timestep/mean": 12.0,
27 "puct/sampled_timestep/std": 0.0,
28 "puct/sampled_timestep/min": 12.0,
29 "puct/sampled_timestep/max": 12.0,
30 "puct/sampled_construction_len/mean": 4096.0,
31 "puct/sampled_construction_len/std": 0.0,
32 "puct/sampled_construction_len/min": 4096.0,
33 "puct/sampled_construction_len/max": 4096.0,
34 "time/sampling": 5054.057470798492,
35 "env/all/ac_tokens_per_turn": 8292.41796875,
36 "env/all/ob_tokens_per_turn": 3859.625,
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": 4245718,
41 "env/all/total_ob_tokens": 1976128,
42 "env/all/time/sampling_mean": 307.4730724459514,
43 "env/all/time/sampling_max": 401.19211864471436,
44 "env/all/time/env_step_mean": 2332.1419564783573,
45 "env/all/time/env_step_max": 4670.113720178604,
46 "env/all/reward/mean": 0.2881911548124041,
47 "env/all/reward/max": 0.946247654197629,
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.2881911548124041,
53 "env/all/correctness": 0.31640625,
54 "env/all/correctness/min": 0.0,
55 "env/all/correctness/max": 1.0,
56 "env/all/raw_score": 0.9108263658268574,
57 "env/all/raw_score/min": 0.11297671959146646,
58 "env/all/raw_score/max": 0.946247654197629,
59 "env/all/initial_raw_score": 0.9453356285904737,
60 "env/all/initial_raw_score/min": 0.9446357709876729,
61 "env/all/initial_raw_score/max": 0.9457399588945222,
62 "env/all/msg": "RuntimeError: Program execution failed: NameError: name 'generate_gaussian' is not defined",
63 "env/all/parsed_code": "```python\nimport numpy as np\nfrom typing import List, Tuple\nimport random\nimport time\n\ndef _simpson_l2sq(conv: np.ndarray) -> Tuple[float, np.ndarray]:\n m = conv.size\n if m == 0:\n return 0.0, np.zeros_like(conv)\n dx = 1.0 / (m + 1)\n y = np.zeros(m + 2, dtype=conv.dtype)\n y[0] = 0.0\n y[1:-1] = conv\n y[-1] = 0.0\n lhs = y[:-1]\n rhs = y[1:]\n l2_sq = (dx / 3.0) * np.sum(lhs * lhs + lhs * rhs + rhs * rhs)\n grad_y = (dx / 3.0) * (4.0 * y + np.roll(y, 1) + np.roll(y, -1))\n grad_conv = grad_y[1:-1]\n return float(l2_sq), grad_conv\n\ndef _l1(conv: np.ndarray) -> Tuple[float, np.ndarray]:\n m = conv.size\n dx = 1.0 / (m + 1) if m > 0 else 1.0\n val = dx * float(np.sum(conv)) if m > 0 else 0.0\n grad = np.full_like(conv, dx)\n return val, grad\n\ndef _linf(conv: np.ndarray) -> Tuple[float, np.ndarray]:\n if conv.size == 0:\n return 0.0, np.zeros_like(conv)\n m = float(np.max(conv))\n if m <= 0.0:\n return m, np.zeros_like(conv)\n mask = conv == m\n count = int(mask.sum())\n if count == 0:\n return m, np.zeros_like(conv)\n grad = mask.astype(conv.dtype) / count\n return m, grad\n\ndef _objective_and_grad_conv(conv: np.ndarray) -> Tuple[float, np.ndarray]:\n l2_sq, g_l2 = _simpson_l2sq(conv)\n l1, g_l1 = _l1(conv)\n linf, g_linf = _linf(conv)\n if l1 <= 0.0 or linf <= 0.0:\n return 0.0, np.zeros_like(conv)\n denom = l1 * linf\n c_value = l2_sq / denom\n num_grad = g_l2 * denom - l2_sq * (g_l1 * linf + l1 * g_linf)\n g_conv = num_grad / (denom * denom)\n return float(c_value), g_conv\n\ndef _grad_h_from_conv_grad(h: np.ndarray, g_conv: np.ndarray) -> np.ndarray:\n h_rev = h[::-1]\n g_h = np.convolve(g_conv, h_rev, mode=\"valid\")\n return 2.0 * g_h\n\ndef _upsample_1d(h: np.ndarray) -> np.ndarray:\n n = h.shape[0]\n x_old = np.linspace(-0.5, 0.5, n)\n x_new = np.linspace(-0.5, 0.5, 2 * n)\n return np.interp(x_new, x_old, h)\n\ndef _single_candidate_finetune(h0: np.ndarray, lr=5e-3, steps=300000, max_iter=300000) -> Tuple[np.ndarray, float]:\n h = h0.astype(np.float32).copy()\n opt = _Adam(h.shape, lr=lr, dtype=h.dtype)\n last_c = 0.0\n for _ in range(min(steps, max_iter)):\n h_clip = np.clip(h, 0.0, None)\n conv = np.convolve(h_clip, h_clip, mode=\"full\")\n c_val, g_conv = _objective_and_grad_conv(conv)\n g_h = _grad_h_from_conv_grad(h_clip, g_conv)\n h = np.clip(opt.step(h, g_h.astype(h.dtype)), 0.0, None)\n last_c = c_val\n return h, float(last_c)\n\nclass _Adam:\n def __init__(self, shape, lr=3e-2, beta1=0.9, beta2=0.999, eps=1e-8, dtype=np.float32):\n self.m = np.zeros(shape, dtype=dtype)\n self.v = np.zeros(shape, dtype=dtype)\n self.t = 0\n self.lr = lr\n self.b1 = beta1\n self.b2 = beta2\n self.eps = eps\n\n def step(self, params, grad):\n self.t += 1\n self.m = self.b1 * self.m + (1 - self.b1) * grad\n self.v = self.b2 * self.v + (1 - self.b2) * (grad * grad)\n m_hat = self.m / (1 - self.b1 ** self.t)\n v_hat = self.v / (1 - self.b2 ** self.t)\n return params + self.lr * m_hat / (np.sqrt(v_hat) + self.eps)\n\ndef generate_sine(n, amplitude=1.0, freq=2.0):\n x = np.linspace(-0.5, 0.5, n)\n y = amplitude * np.sin(2 * np.pi * freq * x)\n return np.clip(y, 0.0, 1000.0)\n\ndef generate_parabola(n):\n x = np.linspace(-0.5, 0.5, n)\n y = 1.0 - x**2\n return np.clip(y, 0.0, 1000.0)\n\ndef construct_function():\n \"\"\"\n Optimizes the sequence of non-negative heights to maximize the evaluation score.\n Uses a diverse initial pool and adaptive optimization with multiple refinement steps.\n \"\"\"\n np.random.seed(int(time.time()))\n height_sequence_1 = globals().get(\"height_sequence_1\", None)\n \n initial_n = 1024\n initial_candidates = []\n \n # Diverse initial candidates\n single_peak = np.zeros(initial_n, dtype=np.float32)\n single_peak[initial_n // 2] = 1000.0\n initial_candidates.append(single_peak)\n \n # Generate additional patterns\n initial_candidates.append(np.random.uniform(0.1, 1.0, initial_n))\n initial_candidates.append(np.ones(initial_n, dtype=np.float32) * 0.1)\n initial_candidates.append(generate_gaussian(initial_n))\n initial_candidates.append(generate_exponential(n=initial_n))\n initial_candidates.append(generate_sine(initial_n, freq=2))\n initial_candidates.append(generate_parabola(initial_n))\n \n best_score = -1.0\n best_heights = None\n best_time = time.time()\n \n for candidate in initial_candidates:\n h = candidate.astype(np.float32).copy()\n h_sum = np.sum(h)\n if h_sum < 0.01:\n h = np.clip(h + (0.01 - h_sum) / initial_n, 0.0, 1000.0)\n \n # Adaptive parameters for exploration\n noise_scale_initial = 0.25\n learning_rate = 0.2\n noise_decay = 0.9995\n learning_rate_decay = 0.9995\n max_steps = 100000\n refine_steps = 300000\n upscale_steps = 200000\n \n start_time = time.time()\n \n for step in range(max_steps):\n if time.time() - start_time > 1000 - 5:\n break\n clipped_h = np.clip(h, 0.0, None)\n conv = np.convolve(clipped_h, clipped_h, mode='full')\n obj_val, grad_conv = _objective_and_grad_conv(conv)\n grad_h = _grad_h_from_conv_grad(clipped_h, grad_conv)\n \n noise_scale = noise_scale_initial * (noise_decay ** step)\n learning_rate_current = learning_rate * (learning_rate_decay ** step)\n \n noise = noise_scale * np.random.normal(size=h.shape)\n h = np.clip(h + learning_rate_current * grad_h + noise, 0.0, 1000.0)\n \n h_sum = np.sum(h)\n if h_sum < 0.01:\n h = np.clip(h + (0.01 - h_sum) / h.shape[0], 0.0, 1000.0)\n \n h_up = _upsample_1d(h)\n for _ in range(2):\n h_up, _ = _single_candidate_finetune(h_up, lr=5e-3, steps=refine_steps)\n h_up = np.clip(h_up, 0.0, 1000.0)\n h = _upsample_1d(h_up)\n \n h_final = np.clip(h, 0.0, 1000.0)\n current_score = evaluate_sequence(h_final.tolist())\n \n if current_score > best_score:\n best_score = current_score\n best_heights = h_final.tolist()\n best_time = time.time()\n \n # Early exit if time is running out\n if best_time + 500 < time.time():\n break\n \n return best_heights\n```",
64 "env/all/time/policy": 307.4730724459514,
65 "env/all/time/policy/min": 139.883309841156,
66 "env/all/time/policy/max": 401.19211864471436,
67 "env/all/time/env_step": 2332.1419564783573,
68 "env/all/time/env_step/min": 0.006623506546020508,
69 "env/all/time/env_step/max": 4670.113720178604,
70 "env/all/time/reward_compute": 2.561137080192566e-07,
71 "env/all/time/reward_compute/min": 2.1606683731079102e-07,
72 "env/all/time/reward_compute/max": 3.650784492492676e-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.031021732836961746,
77 "advantage/min": -1.0,
78 "advantage/max": 9.727376937866211,
79 "time/assemble_training_data": 7.140295505523682,
80 "time/kl_vs_base": 87.1894884109497,
81 "kl_policy_base": 0.0006930568488314748,
82 "time/train": 588.6072192192078,
83 "time/save_checkpoint": 8.47433590888977,
84 "time/total": 5748.828012228012
85}[2026-07-09T06:42:12+00:00] job=1812634 node=node-30 ngpu=3 ntrain=1 replicas=2 flash_attn=no
[2026-07-09T07:26:33+00:00] job=1812736 node=node-12 ngpu=3 ntrain=1 replicas=2 flash_attn=yes
[2026-07-09T09:27:32+00:00] job=1813133 node=node-14 ngpu=3 ntrain=1 replicas=2 flash_attn=yes
[2026-07-09T16:26:04+00:00] job=1813134 node=node-4 ngpu=6 ntrain=2 replicas=4 flash_attn=yes