AR / ar /eval /humaneval.py
AjayRangoji's picture
Upload AR-4B pretraining codebase, configs, and cluster scripts
2ae6691 verified
Raw History Blame Contribute Delete
2.22 kB
"""HumanEval (Python coding): complete each function, run its unit tests, pass@1 greedy."""
import argparse
import os
import subprocess
import sys
import tempfile
from datasets import load_dataset
from ar.data.tokenizer import Tokenizer
from ar.eval.batch_gen import generate_batch
from ar.eval.generate import load_model
# a new top-level statement means the function body is finished
STOP = ["\ndef ", "\nclass ", "\nif __name__", "\nprint(", "\n#"]
def passes(program, timeout=10):
# run the model-written code in a separate process with a time limit,
# so a crash or infinite loop can't take down the evaluation
with tempfile.NamedTemporaryFile("w", suffix=".py", delete=False) as f:
f.write(program)
path = f.name
try:
return subprocess.run([sys.executable, path], capture_output=True,
timeout=timeout).returncode == 0
except subprocess.TimeoutExpired:
return False
finally:
os.remove(path)
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("--model", required=True)
p.add_argument("--batch", type=int, default=16)
args = p.parse_args()
device = "cuda"
tok = Tokenizer()
model = load_model(args.model, device)
ds = load_dataset("openai/openai_humaneval", split="test")
solved = 0
for i in range(0, len(ds), args.batch):
chunk = ds.select(range(i, min(i + args.batch, len(ds))))
outs = generate_batch(model, tok, [ex["prompt"] for ex in chunk], seq_len=1536,
max_new=384, stop=STOP, device=device)
for ex, completion in zip(chunk, outs):
program = (ex["prompt"] + completion + "\n\n" + ex["test"]
+ f"\n\ncheck({ex['entry_point']})\n")
solved += passes(program)
done = min(i + args.batch, len(ds))
print(f"[{done}/{len(ds)}] pass@1 so far: {100 * solved / done:.1f}%", flush=True)
if i == 0:
print("--- example completion ---\n" + chunk[0]["prompt"] + outs[0]
+ "\n--------------------------", flush=True)
print(f"HumanEval pass@1 (greedy): {100 * solved / len(ds):.1f}% ({solved}/{len(ds)})")