JEV / code /scripts /vllm_humaneval.py
cloudyu's picture
vLLM inference: adapter_vllm/ (decision head as lm_head LoRA), model card section "Inference with vLLM", OpenAI client, measured speed
b16c3a6 verified
Raw
History Blame Contribute Delete
2.24 kB
#!/usr/bin/env python3
"""HumanEval pass@1 through vLLM (AR path of a dual-head bundle). Same prompts / truncation / checker as humaneval.py.
python3 scripts/vllm_humaneval.py --model exports/jev-judge-qwen35-9b-v0.8 --out reports/humaneval_vllm_9b.json
"""
from __future__ import annotations
import argparse
import json
import os
import sys
import time
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from humaneval import load_problems, run_check, truncate # noqa: E402
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("--model", required=True)
ap.add_argument("--out", required=True)
ap.add_argument("--max-new-tokens", type=int, default=384)
ap.add_argument("--gpu-mem", type=float, default=0.85)
args = ap.parse_args()
from vllm import LLM, SamplingParams
problems = load_problems()
t0 = time.time()
llm = LLM(model=args.model, dtype="bfloat16", gpu_memory_utilization=args.gpu_mem, max_model_len=4096,
enable_prefix_caching=False)
load_s = time.time() - t0
sp = SamplingParams(temperature=0.0, max_tokens=args.max_new_tokens)
t0 = time.time()
outs = llm.generate([p["prompt"] for p in problems], sp, use_tqdm=False)
gen_s = time.time() - t0
n_tok = sum(len(o.outputs[0].token_ids) for o in outs)
results, passed = [], 0
for p, o in zip(problems, outs):
comp = truncate(o.outputs[0].text)
ok, err = run_check(p["prompt"] + comp + "\n\n" + p["test"] + "\n" + f"check({p['entry_point']})\n")
passed += ok
results.append({"task_id": p["task_id"], "passed": ok, "completion": comp, "error": err})
summary = {"model": args.model, "engine": "vllm", "n": len(problems), "passed": passed, "pass@1": passed / len(problems),
"generation_s": gen_s, "generated_tokens": n_tok, "gen_tok_per_s": n_tok / gen_s, "load_s": load_s, "results": results}
with open(args.out, "w") as f:
json.dump(summary, f, indent=1)
print(f"vLLM HumanEval pass@1 = {passed/len(problems):.4f} ({passed}/{len(problems)}) | generation {gen_s:.1f}s "
f"({n_tok/gen_s:.0f} generated tok/s) | load {load_s:.0f}s -> {args.out}")
if __name__ == "__main__":
main()