Buckets:
| """Build writeup assets from the eval run: a merged results table (markdown) + a comparison montage. | |
| Reads outputs/eval/metrics.json + outputs/eval/timing_*.json. Montage shows a few prompts across | |
| model dirs (teacher | plain | SVDQuant | ...). | |
| Usage: python3 scripts/37_assets.py [idx1,idx2,...] (montage prompt indices; default a category spread) | |
| """ | |
| import sys, json, os, glob | |
| from PIL import Image, ImageDraw | |
| metrics = json.load(open('outputs/eval/metrics.json')) | |
| timing = {} | |
| for f in glob.glob('outputs/eval/timing_*.json'): | |
| t = json.load(open(f)); timing[t.get('tag', os.path.basename(f))] = t | |
| # ---- merged markdown table ---- | |
| lines = ["# Eval results — SVDQuant vs plain NVFP4 (klein-4B)\n", | |
| "| model | PickScore↑ | CLIP↑ | LPIPS↓(vs teacher) | PSNR↑ | FID↓(real) | FID↓(teacher) | s/img | step ms | VRAM GB |", | |
| "|---|---|---|---|---|---|---|---|---|---|"] | |
| for name, v in metrics.items(): | |
| tk = next((timing[k] for k in timing if k in name or name in k), {}) | |
| spi = tk.get('s_per_img_median') or tk.get('s_per_img_median_batched') or '–' | |
| lines.append(f"| {name} | {v.get('PickScore')} | {v.get('CLIP')} | {v.get('LPIPS')} | {v.get('PSNR')} | " | |
| f"{v.get('FID_vs_real')} | {v.get('FID_vs_teacher')} | {spi} | {tk.get('step_ms_median','–')} | {tk.get('peak_vram_gb','–')} |") | |
| md = "\n".join(lines) + "\n" | |
| open('outputs/eval/results_table.md', 'w').write(md) | |
| print(md) | |
| # ---- comparison montage ---- | |
| prompts = {d['idx']: d for d in json.load(open('outputs/eval/prompts.json'))} | |
| if len(sys.argv) > 1: | |
| idxs = [int(x) for x in sys.argv[1].split(',')] | |
| else: | |
| # one per category from the first 64 (pilot range), preferring text/people/logo | |
| seen, idxs = set(), [] | |
| for i in range(64): | |
| c = prompts.get(i, {}).get('category') | |
| if c and c not in seen: | |
| seen.add(c); idxs.append(i) | |
| if len(idxs) >= 6: | |
| break | |
| # model columns that exist (label, dir) | |
| cand = [('teacher', 'outputs/eval/imgs/teacher'), | |
| ('plain NVFP4 (r0)', 'outputs/eval/imgs/pilot_fq0'), | |
| ('SVDQuant r64', 'outputs/eval/imgs/pilot_fq64'), | |
| ('SVDQuant r128 (fake-q)', 'outputs/eval/imgs/pilot_fq128'), | |
| ('SVDQuant r128 (real kernel)', 'outputs/eval/imgs/pilot_ours128_real'), | |
| ('BFL plain NVFP4', 'outputs/eval/imgs/bfl')] | |
| cols = [(lbl, d) for lbl, d in cand if os.path.isdir(d) and glob.glob(os.path.join(d, '*.png'))] | |
| S, pad, top = 320, 6, 22 | |
| W = len(cols) * (S + pad) + pad | |
| H = len(idxs) * (S + pad) + top + pad | |
| canvas = Image.new('RGB', (W, top + H), 'white') | |
| dr = ImageDraw.Draw(canvas) | |
| for ci, (lbl, _) in enumerate(cols): | |
| dr.text((pad + ci * (S + pad) + 4, 4), lbl, fill='black') | |
| for ri, idx in enumerate(idxs): | |
| for ci, (lbl, d) in enumerate(cols): | |
| p = os.path.join(d, f"{idx:05d}.png") | |
| if not os.path.exists(p): | |
| continue | |
| im = Image.open(p).convert('RGB').resize((S, S)) | |
| x = pad + ci * (S + pad); y = top + ri * (S + pad) | |
| canvas.paste(im, (x, y)) | |
| dr.text((x + 3, y + 3), prompts[idx]['category'], fill='yellow') | |
| canvas.save('outputs/eval/montage_compare.png') | |
| print(f"saved montage -> outputs/eval/montage_compare.png ({len(idxs)} prompts x {len(cols)} models)") | |
Xet Storage Details
- Size:
- 3.26 kB
- Xet hash:
- 0a3e027aaa730d7f6b3a730fe4b01a69237e4e6a0eb951d09ba4052637c14134
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.