ManishShaw commited on
Commit
aeb63a2
·
1 Parent(s): 662728a
arena/eval/__pycache__/run_frontier.cpython-311.pyc CHANGED
Binary files a/arena/eval/__pycache__/run_frontier.cpython-311.pyc and b/arena/eval/__pycache__/run_frontier.cpython-311.pyc differ
 
arena/eval/run_frontier.py CHANGED
@@ -160,16 +160,14 @@ DEFAULT_LIVE_CONFIG: List[Dict[str, str]] = [
160
  {"label": "claude-haiku-4-5", "model": "claude-haiku-4-5-20251001",
161
  "api_base": "https://api.anthropic.com/v1",
162
  "api_key_env": "ANTHROPIC_API_KEY"},
163
- # qwen-1.5b-base = the SAME base model your trained LoRA starts from,
164
- # served REMOTELY via HF Inference Providers (OpenAI-compatible router
165
- # at router.huggingface.co). This proves the trained adapter beats the
166
- # zero-shot base on equal footing. Never loads locally — `api_base` is
167
- # set so the OpenAI client only ever issues HTTPS calls.
168
- {"label": "qwen-1.5b-base", "model": "Qwen/Qwen2.5-1.5B-Instruct",
169
- "api_base": "https://router.huggingface.co/v1",
170
- "api_key_env": "HF_TOKEN"},
171
  ]
172
 
 
 
 
 
 
 
173
 
174
  def _assert_remote(api_base: Optional[str], label: str) -> None:
175
  """Raise loudly if a config would cause a LOCAL model load.
 
160
  {"label": "claude-haiku-4-5", "model": "claude-haiku-4-5-20251001",
161
  "api_base": "https://api.anthropic.com/v1",
162
  "api_key_env": "ANTHROPIC_API_KEY"},
 
 
 
 
 
 
 
 
163
  ]
164
 
165
+ # Qwen2.5-1.5B-Instruct is too small for HF's free router or Together to
166
+ # bother hosting. Evaluate it INSIDE Colab (Track A) where the GPU is
167
+ # already loaded, then merge results via scripts/merge_colab_eval.py.
168
+ # That keeps the apples-to-apples base-vs-trained comparison while
169
+ # guaranteeing the laptop never loads weights.
170
+
171
 
172
  def _assert_remote(api_base: Optional[str], label: str) -> None:
173
  """Raise loudly if a config would cause a LOCAL model load.
reports/frontier_smoke.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "generated_at": 1777121050.448101,
3
  "providers": {
4
  "random": {
5
  "eval_during": {
@@ -9,17 +9,17 @@
9
  "n": 1
10
  },
11
  "frame_validity": {
12
- "mean": 1.0,
13
  "std": 0.0,
14
  "n": 1
15
  },
16
  "plan_quality": {
17
- "mean": 0.5,
18
  "std": 0.0,
19
  "n": 1
20
  },
21
  "final_reward": {
22
- "mean": 0.5411,
23
  "std": 0.0,
24
  "n": 1
25
  },
@@ -40,7 +40,7 @@
40
  },
41
  "n_episodes": 1
42
  },
43
- "runtime_s": 0.01
44
  },
45
  "keyword": {
46
  "eval_during": {
@@ -132,7 +132,7 @@
132
  "n": 1
133
  },
134
  "frame_validity": {
135
- "mean": 0.0,
136
  "std": 0.0,
137
  "n": 1
138
  },
@@ -142,7 +142,7 @@
142
  "n": 1
143
  },
144
  "final_reward": {
145
- "mean": 0.4766,
146
  "std": 0.0,
147
  "n": 1
148
  },
@@ -163,16 +163,16 @@
163
  },
164
  "n_episodes": 1
165
  },
166
- "runtime_s": 23.62,
167
  "api_calls": {
168
- "ok": 12,
169
- "api_error": 0,
170
  "json_error": 0,
171
  "total": 12,
172
- "hit_rate": 1.0,
173
- "tokens_in": 9008,
174
- "tokens_out": 774,
175
- "first_error": null
176
  }
177
  },
178
  "claude-haiku-4-5": {
@@ -188,12 +188,12 @@
188
  "n": 1
189
  },
190
  "plan_quality": {
191
- "mean": 0.5,
192
  "std": 0.0,
193
  "n": 1
194
  },
195
  "final_reward": {
196
- "mean": 0.5236,
197
  "std": 0.0,
198
  "n": 1
199
  },
@@ -214,16 +214,16 @@
214
  },
215
  "n_episodes": 1
216
  },
217
- "runtime_s": 23.66,
218
  "api_calls": {
219
- "ok": 12,
220
- "api_error": 0,
221
  "json_error": 0,
222
  "total": 12,
223
- "hit_rate": 1.0,
224
- "tokens_in": 10089,
225
- "tokens_out": 1357,
226
- "first_error": null
227
  }
228
  }
229
  }
 
1
  {
2
+ "generated_at": 1777121986.5616581,
3
  "providers": {
4
  "random": {
5
  "eval_during": {
 
9
  "n": 1
10
  },
11
  "frame_validity": {
12
+ "mean": 0.8571,
13
  "std": 0.0,
14
  "n": 1
15
  },
16
  "plan_quality": {
17
+ "mean": 0.25,
18
  "std": 0.0,
19
  "n": 1
20
  },
21
  "final_reward": {
22
+ "mean": 0.5428,
23
  "std": 0.0,
24
  "n": 1
25
  },
 
40
  },
41
  "n_episodes": 1
42
  },
43
+ "runtime_s": 0.03
44
  },
45
  "keyword": {
46
  "eval_during": {
 
132
  "n": 1
133
  },
134
  "frame_validity": {
135
+ "mean": 1.0,
136
  "std": 0.0,
137
  "n": 1
138
  },
 
142
  "n": 1
143
  },
144
  "final_reward": {
145
+ "mean": 0.454,
146
  "std": 0.0,
147
  "n": 1
148
  },
 
163
  },
164
  "n_episodes": 1
165
  },
166
+ "runtime_s": 3.81,
167
  "api_calls": {
168
+ "ok": 0,
169
+ "api_error": 12,
170
  "json_error": 0,
171
  "total": 12,
172
+ "hit_rate": 0.0,
173
+ "tokens_in": 0,
174
+ "tokens_out": 0,
175
+ "first_error": "AuthenticationError: Error code: 401 - {'error': {'message': \"You didn't provide an API key. You need to provide your API key in an Authorization header using Bearer auth (i.e. Authorization: Bearer YOUR_KEY), or as the password field (with blank username) if you're accessing the API from your browser and are prompted for a username and password. You can obtain an API key from https://platform.openai.com/account/api-keys.\", 'type': 'invalid_request_error', 'param': None, 'code': None}}"
176
  }
177
  },
178
  "claude-haiku-4-5": {
 
188
  "n": 1
189
  },
190
  "plan_quality": {
191
+ "mean": 0.0,
192
  "std": 0.0,
193
  "n": 1
194
  },
195
  "final_reward": {
196
+ "mean": 0.454,
197
  "std": 0.0,
198
  "n": 1
199
  },
 
214
  },
215
  "n_episodes": 1
216
  },
217
+ "runtime_s": 5.03,
218
  "api_calls": {
219
+ "ok": 0,
220
+ "api_error": 12,
221
  "json_error": 0,
222
  "total": 12,
223
+ "hit_rate": 0.0,
224
+ "tokens_in": 0,
225
+ "tokens_out": 0,
226
+ "first_error": "AuthenticationError: Error code: 401 - {'error': {'code': 'authentication_error', 'message': 'Invalid Anthropic API Key', 'type': 'invalid_request_error', 'param': None}}"
227
  }
228
  }
229
  }
scripts/merge_colab_eval.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Merge Colab-side eval results into reports/frontier.json.
2
+
3
+ Track A runs Qwen2.5-1.5B-Instruct (base AND trained-with-LoRA) inside
4
+ Google Colab where the GPU is already paid for. This script takes the
5
+ JSON file Colab produces and inserts it into the local frontier.json
6
+ under the right provider label, so scoring and plotting see all
7
+ columns side by side.
8
+
9
+ Expected Colab-side JSON shape — produced by `arena.eval.harness.run_eval`:
10
+
11
+ {
12
+ "eval_pre": {"task_correctness": {"mean":..., ...}, ...},
13
+ "eval_during": {...},
14
+ "eval_hard": {...},
15
+ "drift_adjusted_success_rate": {"value": 0.123},
16
+ "runtime_s": 42.0
17
+ }
18
+
19
+ Usage:
20
+ # In Colab, after Cell 7 (final eval), each block looks like:
21
+ # results_base = run_eval(base_policy, ...)
22
+ # results_trained = run_eval(trained_policy, ...)
23
+ # json.dump(results_base, open("qwen_1_5b_base.json","w"), default=str)
24
+ # json.dump(results_trained, open("qwen_1_5b_trained.json","w"), default=str)
25
+ # # download both files via Colab's Files panel.
26
+
27
+ python scripts/merge_colab_eval.py \\
28
+ --frontier reports/frontier.json \\
29
+ --label qwen-1.5b-base --json qwen_1_5b_base.json
30
+ python scripts/merge_colab_eval.py \\
31
+ --frontier reports/frontier.json \\
32
+ --label trained --json qwen_1_5b_trained.json
33
+ """
34
+
35
+ from __future__ import annotations
36
+
37
+ import argparse
38
+ import json
39
+ import os
40
+ import sys
41
+
42
+
43
+ def main(argv=None) -> int:
44
+ ap = argparse.ArgumentParser()
45
+ ap.add_argument("--frontier", default="reports/frontier.json",
46
+ help="Local frontier.json to merge into.")
47
+ ap.add_argument("--label", required=True,
48
+ help="Provider label, e.g. 'qwen-1.5b-base' or 'trained'.")
49
+ ap.add_argument("--json", required=True,
50
+ help="Path to the JSON file downloaded from Colab.")
51
+ args = ap.parse_args(argv)
52
+
53
+ if not os.path.exists(args.json):
54
+ print(f"[merge] missing colab JSON: {args.json}", file=sys.stderr)
55
+ return 2
56
+
57
+ new_block = json.load(open(args.json))
58
+
59
+ if not isinstance(new_block, dict) or "eval_during" not in new_block:
60
+ print(f"[merge] {args.json} doesn't look like a run_eval() output "
61
+ f"(missing 'eval_during' key)", file=sys.stderr)
62
+ return 3
63
+
64
+ if os.path.exists(args.frontier):
65
+ fr = json.load(open(args.frontier))
66
+ else:
67
+ fr = {"providers": {}}
68
+ fr.setdefault("providers", {})
69
+
70
+ fr["providers"][args.label] = new_block
71
+
72
+ os.makedirs(os.path.dirname(args.frontier) or ".", exist_ok=True)
73
+ with open(args.frontier, "w") as f:
74
+ json.dump(fr, f, indent=2, default=str)
75
+
76
+ tc = new_block.get("eval_during", {}).get("task_correctness", {}).get("mean")
77
+ print(f"[merge] {args.label} merged into {args.frontier} "
78
+ f"during.task_correctness={tc}")
79
+ print(f"[merge] providers now: {list(fr['providers'].keys())}")
80
+ return 0
81
+
82
+
83
+ if __name__ == "__main__":
84
+ raise SystemExit(main())