Spaces:
Configuration error
Configuration error
| """ | |
| run_comprehensive_eval.py — Extensive Evaluation of MiniCPM5-1B vs PX-Mod | |
| ======================================================================== | |
| Runs Logic, Arithmetic, HLE, and Creative tasks. | |
| Compares Baseline vs PX-Peak vs PX-Subjective. | |
| """ | |
| import asyncio | |
| import json | |
| import os | |
| import statistics | |
| import time | |
| from typing import Dict, List, Any | |
| from model_manager import ModelManager | |
| from benchmark_engine import BenchmarkEngine, score_answer | |
| from test_prompts import ( | |
| ALL_CAPABILITY_TASKS, CREATIVE_PROMPTS, SYNTHESIS_PROMPTS, CALIBRATION_PROMPTS | |
| ) | |
| async def run_evaluation(): | |
| manager = ModelManager() | |
| engine = BenchmarkEngine(manager) | |
| models = ["minicpm5-1b-base", "minicpm5-1b-px", "minicpm5-1b-px-subj"] | |
| configs = [ | |
| ("minicpm5-1b-base", False), | |
| ("minicpm5-1b-px", False), | |
| ("minicpm5-1b-px", True) | |
| ] | |
| all_results = {} | |
| print("=" * 80) | |
| print(" COMPREHENSIVE COGNITIVE EVALUATION: MiniCPM5-1B vs PX-Mod") | |
| print("=" * 80) | |
| for model_id, px_subj in configs: | |
| label = f"{model_id}{'-subj' if px_subj else ''}" | |
| print(f"\n>>> Evaluating {label}...") | |
| # Get model | |
| model_entry = await manager.get_model(model_id, px_subjective=px_subj) | |
| model = model_entry["model"] | |
| tokenizer = model_entry["tokenizer"] | |
| # 1. Calibration (if PX) | |
| if "px" in model_id: | |
| print(" Calibrating PX...") | |
| for cp in CALIBRATION_PROMPTS: | |
| inputs = tokenizer(cp, return_tensors="pt").to(model.device) | |
| model.generate(**inputs, max_new_tokens=5, do_sample=False) | |
| # 2. Objective Tasks (Logic, Arithmetic, HLE) | |
| print(f" Running {len(ALL_CAPABILITY_TASKS)} objective tasks...") | |
| obj_results = [] | |
| for cat, prompt, expected in ALL_CAPABILITY_TASKS: | |
| inputs = tokenizer(prompt, return_tensors="pt").to(model.device) | |
| outputs = model.generate(**inputs, max_new_tokens=100, do_sample=False) | |
| input_len = inputs["input_ids"].shape[1] | |
| text = tokenizer.decode(outputs[0][input_len:], skip_special_tokens=True).strip() | |
| score = score_answer(text, expected) | |
| obj_results.append({ | |
| "category": cat, | |
| "prompt": prompt, | |
| "expected": expected, | |
| "output": text, | |
| "score": score | |
| }) | |
| # 3. Creative/Synthesis Tasks | |
| print(f" Running {len(CREATIVE_PROMPTS)} creative/synthesis tasks...") | |
| creative_results = [] | |
| for prompt in CREATIVE_PROMPTS[:10] + SYNTHESIS_PROMPTS[:10]: | |
| inputs = tokenizer(prompt, return_tensors="pt").to(model.device) | |
| outputs = model.generate(**inputs, max_new_tokens=200, do_sample=False) | |
| input_len = inputs["input_ids"].shape[1] | |
| text = tokenizer.decode(outputs[0][input_len:], skip_special_tokens=True).strip() | |
| # Qualitative metrics | |
| metrics = manager.get_px_metrics(model_id) | |
| creative_results.append({ | |
| "prompt": prompt, | |
| "output": text, | |
| "length": len(text), | |
| "phi": metrics.get("phi", 1.0), | |
| "steps": metrics.get("steps", 0), | |
| "zone": metrics.get("zone", "N/A") | |
| }) | |
| all_results[label] = { | |
| "objective": obj_results, | |
| "creative": creative_results, | |
| "accuracy": statistics.mean([r["score"] for r in obj_results]) | |
| } | |
| print(f" {label} Accuracy: {all_results[label]['accuracy']:.2%}") | |
| # Unload to save VRAM | |
| manager.unload(model_id) | |
| # 4. Generate Report | |
| report_path = "CPM_PX_EVALUATION_REPORT.md" | |
| with open(report_path, "w") as f: | |
| f.write("# MiniCPM5-1B PX-Mod Evaluation Report\n\n") | |
| f.write("## Executive Summary\n\n") | |
| f.write("Comparison of MiniCPM5-1B Base vs PX-Patched (Peak and Subjective modes).\n\n") | |
| f.write("### Accuracy Summary\n\n") | |
| f.write("| Model | Overall Accuracy | Logic | Arithmetic | HLE |\n") | |
| f.write("|-------|------------------|-------|------------|-----|\n") | |
| for label, res in all_results.items(): | |
| cats = ["logic", "arithmetic", "hle"] | |
| cat_accs = {} | |
| for c in cats: | |
| scores = [r["score"] for r in res["objective"] if r["category"] == c] | |
| cat_accs[c] = statistics.mean(scores) if scores else 0 | |
| f.write(f"| {label} | {res['accuracy']:.2%} | {cat_accs['logic']:.2%} | {cat_accs['arithmetic']:.2%} | {cat_accs['hle']:.2%} |\n") | |
| f.write("\n## Qualitative Analysis (Creative & Synthesis)\n\n") | |
| for label, res in all_results.items(): | |
| f.write(f"### {label}\n\n") | |
| avg_len = statistics.mean([r["length"] for r in res["creative"]]) | |
| avg_phi = statistics.mean([r["phi"] for r in res["creative"]]) | |
| f.write(f"- Average response length: {avg_len:.1f} chars\n") | |
| f.write(f"- Average Phi (Stability): {avg_phi:.4f}\n\n") | |
| print(f"\nReport written to {report_path}") | |
| # Save raw data | |
| with open("eval_results_raw.json", "w") as f: | |
| json.dump(all_results, f, indent=2) | |
| if __name__ == "__main__": | |
| asyncio.run(run_evaluation()) | |