kv-landlords / scripts /longctx_code_serving.py
a1exxd0's picture
Upload kv-quant (INT4/NVFP4 KIVI) work + vLLM fork source
6e668dc verified
Raw
History Blame Contribute Delete
6.48 kB
"""Long-context CODING benchmark on the vLLM SERVING path: executed HumanEval
pass@1 for bf16 vs our custom INT4-KIVI KV cache.
Unlike the exact-integer needle (which a single quantized-logit digit-flip can
fail), this measures *executed* pass@1 -- the model must emit a function that
actually passes the hidden unit tests. That is the metric KV-cache quant has to
preserve, and it is far less brittle than digit-exact recall.
Two regimes, identical prompts for both dtypes (so it is apples-to-apples):
* short : plain HumanEval (KV cache ~hundreds of tokens at decode start).
* long : the SAME problems with a long, in-distribution Python-source prefix
prepended (real ``transformers`` modeling_*.py), so the model must
decode while attending back over a fully-quantized long context.
Run once per dtype (mirrors needle_serving.py):
KVD=auto -> bf16 KV cache (ceiling)
KVD=int4_kivi -> our custom INT4-KIVI backend
N, PREFIX_TOKENS, MAXNEW are env-overridable. Greedy (temperature 0).
"""
import glob
import json
import os
import re
import subprocess
import sys
import tempfile
import time
from datasets import load_dataset
from vllm import LLM, SamplingParams
ROOT = "/home/alex/poolside-hackathon-kv-quant"
MODEL = "poolside/Laguna-XS.2"
KVD = os.environ.get("KVD", "int4_kivi")
N = int(os.environ.get("N", "20"))
PREFIX_TOKENS = int(os.environ.get("PREFIX_TOKENS", "12000"))
MAXNEW = int(os.environ.get("MAXNEW", "256"))
# --------------------------------------------------------------------------- #
# Code extraction + execution (verbatim from scripts/humaneval_bench.py)
# --------------------------------------------------------------------------- #
def extract_code(response: str, prompt: str) -> str:
m = re.search(r"```(?:python)?\n(.*?)```", response, re.DOTALL)
if m:
block = m.group(1)
if prompt.split("def ", 1)[-1].split("(")[0].strip() in block:
return block
return prompt + block
lines = response.splitlines()
body, in_body = [], False
for line in lines:
if not in_body and (line.startswith(" ") or line.startswith("\t")):
in_body = True
if in_body:
if line.startswith("def ") and body:
break
body.append(line)
if body:
return prompt + "\n".join(body) + "\n"
return prompt + response
def run_tests(solution_code: str, test_code: str, entry_point: str):
full = solution_code + "\n\n" + test_code + f"\ncheck({entry_point})\n"
with tempfile.NamedTemporaryFile(suffix=".py", mode="w", delete=False) as f:
f.write(full)
fname = f.name
try:
r = subprocess.run(
[sys.executable, fname], capture_output=True, text=True, timeout=10
)
if r.returncode == 0:
return True, ""
return False, (r.stderr or r.stdout).strip()[-300:]
except subprocess.TimeoutExpired:
return False, "timeout"
except Exception as e: # noqa: BLE001
return False, str(e)
finally:
try:
os.unlink(fname)
except OSError:
pass
# --------------------------------------------------------------------------- #
# Long in-distribution code prefix (real transformers source -> in-dist)
# --------------------------------------------------------------------------- #
def build_prefix_text(tok, target_tokens: int):
files = []
for venv in (".venv-vllm", ".venv"):
files = sorted(glob.glob(f"{ROOT}/{venv}/**/transformers/**/modeling_*.py",
recursive=True))
if files:
break
if not files:
files = sorted(glob.glob(f"{ROOT}/**/*.py", recursive=True))
texts = []
for f in files:
try:
texts.append(open(f).read())
except OSError:
continue
ids = tok("\n\n".join(texts))["input_ids"]
if len(ids) >= target_tokens:
return tok.decode(ids[:target_tokens]), target_tokens
ids = tok("\n\n".join(texts))["input_ids"]
return tok.decode(ids), len(ids)
# --------------------------------------------------------------------------- #
SYS_MSG = (
"You are a Python coding assistant. Complete the function below. Return a "
"fenced ```python``` code block containing the complete function (including "
"signature and docstring)."
)
def build_msgs(prompt, prefix_text):
if prefix_text:
user = ("Here is some reference Python source code for context. You do "
"not need to use it; it is provided only as background.\n\n"
f"```python\n{prefix_text}\n```\n\n"
"Now, ignoring the reference above, complete this Python "
f"function:\n\n```python\n{prompt}```")
else:
user = f"Complete this Python function:\n\n```python\n{prompt}```"
return [{"role": "system", "content": SYS_MSG},
{"role": "user", "content": user}]
# --------------------------------------------------------------------------- #
llm = LLM(model=MODEL, dtype="bfloat16", kv_cache_dtype=KVD,
gpu_memory_utilization=0.55, max_model_len=PREFIX_TOKENS + 2048,
enforce_eager=True)
tok = llm.get_tokenizer()
prefix_text, prefix_tok = build_prefix_text(tok, PREFIX_TOKENS)
ds = load_dataset("openai/openai_humaneval", split="test").select(range(N))
sp = SamplingParams(temperature=0.0, max_tokens=MAXNEW)
summary = {}
for regime in ("short", "long"):
pfx = prefix_text if regime == "long" else None
convs = [build_msgs(p["prompt"], pfx) for p in ds]
t0 = time.time()
outs = llm.chat(convs, sp, add_generation_prompt=True)
gen_s = time.time() - t0
ctx = [len(o.prompt_token_ids) for o in outs]
npass = 0
for prob, o in zip(ds, outs):
sol = extract_code(o.outputs[0].text, prob["prompt"])
ok, _ = run_tests(sol, prob["test"], prob["entry_point"])
npass += int(ok)
summary[regime] = {"pass": npass, "n": len(ds),
"ctx_min": min(ctx), "ctx_max": max(ctx), "gen_s": gen_s}
print(f"=== [{KVD}] {regime.upper()} HumanEval pass@1 ===")
print(f" {npass}/{len(ds)} ({100*npass/len(ds):.0f}%) "
f"ctx {min(ctx)}..{max(ctx)} gen {gen_s:.0f}s")
json.dump({"kvd": KVD, "prefix_tok": prefix_tok, "summary": summary},
open(f"/tmp/longctx_code_serving_{KVD}.json", "w"))
print(f"LONGCTX_CODE_SERVING DONE [{KVD}]")