27 lines
1.5 KiB
Python
27 lines
1.5 KiB
Python
"""Summarize a JSONL benchmark without interpreting stdout logs as results."""
|
|
import argparse
|
|
import json
|
|
import statistics
|
|
from pathlib import Path
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('files', nargs='+', type=Path)
|
|
args = parser.parse_args()
|
|
for path in args.files:
|
|
rows = []
|
|
for line in path.read_text().splitlines():
|
|
try:
|
|
rows.append(json.loads(line))
|
|
except ValueError:
|
|
continue
|
|
short = [r for r in rows if r.get('test', '').startswith('short_') and 'correct' in r]
|
|
summary = {'file': path.name,
|
|
'completed': any(r.get('event') in ('BENCHMARK_PASS', 'BENCHMARK_FAILED', 'BENCHMARK_COMPLETED') for r in rows),
|
|
'short_decode_tps_median': statistics.median(r['decode_tps_approx'] for r in short) if short else None,
|
|
'short_ttft_s_median': statistics.median(r['ttft_s'] for r in short) if short else None,
|
|
'all_checked_answers_correct': bool([r for r in rows if 'correct' in r]) and all(r['correct'] and r.get('finish_reason') == 'stop' for r in rows if 'correct' in r),
|
|
'long': [{k:r[k] for k in ['test','ttft_s','elapsed_s','correct']} for r in rows if r.get('test','').startswith('long_') and 'correct' in r],
|
|
'concurrency': [r for r in rows if r.get('test') == 'concurrency_summary'],
|
|
'prefix': [r for r in rows if r.get('test','').startswith('prefix_')]}
|
|
print(json.dumps(summary, ensure_ascii=False, indent=2))
|