b1k_model / evaluation /summarize.py
davidwdw's picture
Upload B1K model checkpoints, training recipes, and evaluation artifacts (part 8)
c556874 verified
Raw History Blame Contribute Delete
3.76 kB
import csv
import json
from pathlib import Path
ROOT=Path(__file__).resolve().parent
variants=['human','codegen_success','mix_h50_c50']
rows=[]; summaries=[]
for variant in variants:
vr=[]
for i in range(301,321):
p=ROOT/'results'/variant/'json'/f'turning_on_radio_{i}_0.json'
if not p.exists():continue
r=json.loads(p.read_text())
vr.append(dict(variant=variant,instance_id=i,success=bool(r['success']),q_score=r['q_score']['final'],steps=r['steps']))
rows.extend(vr)
summaries.append(dict(variant=variant,completed=len(vr),successes=sum(r['success'] for r in vr),success_rate=sum(r['success'] for r in vr)/len(vr) if vr else None,mean_q_score=sum(r['q_score'] for r in vr)/len(vr) if vr else None,mean_steps=sum(r['steps'] for r in vr)/len(vr) if vr else None))
for name,values in [('per_instance',rows),('summary',summaries)]:
(ROOT/f'{name}.json').write_text(json.dumps(values,indent=2)+'\n')
if values:
with (ROOT/f'{name}.csv').open('w') as f:
w=csv.DictWriter(f,fieldnames=list(values[0]));w.writeheader();w.writerows(values)
lines=['# Task 00: turning_on_radio — 三模型测试集对比','', '仅在 eai 本机运行。2026 public_test 全部 20 个实例(301–320),每模型每实例 1 次,共 60 次。', '', '相同 seed=0(每次环境和策略 reset 重置),官方默认超时 1.5×2149.64 = 3224 步,224×224 RGB,30 Hz,R1Pro。每模型加载自己的 checkpoint normalization。', '', '| 模型 | 完成数 | 成功数 | 成功率 | 平均 q-score | 平均步数 |','|---|---:|---:|---:|---:|---:|']
for r in summaries:
lines.append(f"| {r['variant']} | {r['completed']}/20 | {r['successes']} | {r['success_rate']:.1%} | {r['mean_q_score']:.4f} | {r['mean_steps']:.1f} |" if r['completed'] else f"| {r['variant']} | 0/20 | — | — | — | — |")
lines+=['','| 实例 | Human | Codegen success | Mix 50:50 |','|---|---|---|---|']
lookup={(r['variant'],r['instance_id']):r for r in rows}
for i in range(301,321):
values=[]
for v in variants:
r=lookup.get((v,i));values.append(('成功' if r['success'] else '失败')+f";q={r['q_score']:.3f};{r['steps']}步" if r else '未完成')
lines.append('| '+str(i)+' | '+' | '.join(values)+' |')
lines+=['','## 配对比较(仅计两模型均已完成的实例)','','| 比较 | 共同完成 | 前者成功、后者失败 | 后者成功、前者失败 | 同时成功 | 同时失败 |','|---|---:|---:|---:|---:|---:|']
for a,b in [('human','codegen_success'),('human','mix_h50_c50'),('codegen_success','mix_h50_c50')]:
both=[(lookup[(a,i)]['success'],lookup[(b,i)]['success']) for i in range(301,321) if (a,i) in lookup and (b,i) in lookup]
lines.append(f"| {a} / {b} | {len(both)} | {sum(x and not y for x,y in both)} | {sum(y and not x for x,y in both)} | {sum(x and y for x,y in both)} | {sum(not x and not y for x,y in both)} |")
lines+=['','平均步数包含超时的失败回合。官方 max_steps=3224 的终止检查会产生 3225 个记录步数。','','结果适用于本次单 seed 的 20 个公开测试实例,不把训练损失当作成功率。推理使用归档的 100-task no-DA3 模型及本地适配,全部 checkpoint 参数严格检查,不允许丢弃多余参数。完整原始训练环境及 Gemma 源码未在本机找到,RGB 路径使用上游 Gemma,因此本结果属于兼容推理实现下的对比,不宣称原始环境的逐位复现。固定的相关 inpainting 线性系统在 CPU 求解并验证残差,以绕过本机 cuSolver 错误。详见 [protocol.json](protocol.json) 和 [runtime_adapter.patch](runtime_adapter.patch)。','']
(ROOT/'comparison.md').write_text('\n'.join(lines))
print(json.dumps(summaries,indent=2))