gemma-e2b-rlcd / scripts /benchmark_head.py
larkooo's picture
Publish Gemma E2B RLCD with multimodal checkpoint and parallel scoring
53e24ca verified
Raw
History Blame Contribute Delete
4.91 kB
"""Full warm-request runtime probes. Untrained head outputs are not quality evidence."""
import argparse
import json
import statistics
from pathlib import Path
from gemma_rlcd import State
from gemma_rlcd.core import ScoringRequest, decision_prompt
from gemma_rlcd.head_backend import DecisionHeadBackend
def requests_for(backend, count):
tasks = [
(
"Which animal is mentioned or visible?",
{"cat": "A cat", "dog": "A dog", "other": "Neither"},
),
("Is a dog mentioned?", {"true": "Yes", "false": "No"}),
("How much red is visible?", {"0": "No red", "1": "Some red", "2": "Mostly red"}),
("Is a sofa mentioned?", {"true": "Yes", "false": "No"}),
]
requests = []
for i in range(count):
instruction, criteria = tasks[i % len(tasks)]
symbols = tuple(backend.symbols(len(criteria)))
requests.append(
ScoringRequest(
decision_prompt(instruction, criteria, symbols),
symbols,
instruction,
tuple(criteria.items()),
)
)
return requests
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--model", required=True)
parser.add_argument("--media", required=True, type=Path)
parser.add_argument("--report", required=True, type=Path)
parser.add_argument("--state-layers", type=int, default=35)
parser.add_argument("--image-soft-tokens", type=int, default=280)
parser.add_argument("--video-max-frames", type=int, default=32)
parser.add_argument("--dtype", choices=["float16", "float32", "bfloat16"], default="float32")
parser.add_argument("--fields", type=int, nargs="+", default=[1, 4, 16, 28])
parser.add_argument("--repeats", type=int, default=5)
parser.add_argument(
"--states", nargs="+", default=["text", "image", "speech", "video", "video_speech"]
)
args = parser.parse_args()
if args.repeats < 1:
parser.error("repeats must be positive")
media = args.media.resolve()
states = {
"text": State(text="A cat sleeps on a sofa. No dogs are present."),
"image": State(images=(str(media / "red.png"),)),
"speech": State(audio=(str(media / "dog.wav"),)),
"video": State(videos=(str(media / "red-blue.mp4"),)),
"video_speech": State(videos=(str(media / "red-blue-speech.mp4"),)),
}
backend = DecisionHeadBackend(
args.model,
state_layers=args.state_layers,
compute_dtype=args.dtype,
image_soft_tokens=args.image_soft_tokens,
video_max_frames=args.video_max_frames,
)
report = {
"status": "untrained_runtime_probe_not_quality_or_calibration_evidence",
"model": args.model,
"state_layers": args.state_layers,
"compute_dtype": args.dtype,
"head_config": backend.head.config.to_dict(),
"image_soft_tokens": args.image_soft_tokens,
"video_max_frames": args.video_max_frames,
"timing_scope": "warm_model_fresh_state_including_media_decode_preprocess_encoding_and_all_fields",
"field_scaling": "four representative question templates repeated to the requested count",
"results": [],
}
for name in args.states:
state = states[name]
requests = {count: requests_for(backend, count) for count in args.fields}
for count in args.fields:
backend.probe(state, requests[count])
samples = {count: [] for count in args.fields}
for repeat in range(args.repeats):
for count in args.fields if repeat % 2 == 0 else reversed(args.fields):
try:
samples[count].append(backend.probe(state, requests[count]))
except Exception as exc:
samples[count].append({"error": f"{type(exc).__name__}: {exc}"})
for count, records in samples.items():
successful = [record for record in records if "error" not in record]
record = {
"state": name,
"fields": count,
"attempted": len(records),
"completed": len(successful),
"samples": records,
}
if successful:
timing_keys = [key for key in successful[0] if key.endswith("_seconds")]
record["median_seconds"] = {
key: statistics.median(row[key] for row in successful) for key in timing_keys
}
record["max_seconds"] = max(row["total_seconds"] for row in successful)
report["results"].append(record)
print(
json.dumps({key: value for key, value in record.items() if key != "samples"}),
flush=True,
)
args.report.write_text(json.dumps(report, indent=2) + "\n")
if __name__ == "__main__":
main()