Files
vllm-omni/benchmarks/edge_harness/experiments/bench_gpu.py
T

88 lines
3.3 KiB
Python
Raw Normal View History

"""pp512 / tg128 for Spark-X2.5 on one GPU, for vLLM or SGLang.
Same protocol as the CPU grid and llama-bench: a 512-token prefill measured on
its own, then 128 generated tokens with the one-token prefill subtracted.
Prefix caching is disabled on both engines so a replayed prompt is actually
recomputed.
"""
import argparse, json, os, time
def bench_vllm(a):
import vllm_omni # noqa: F401 registers Spark2_5ForCausalLM
from vllm import LLM, SamplingParams
t0 = time.perf_counter()
llm = LLM(model=a.model, dtype=a.dtype, max_model_len=a.max_model_len,
max_num_seqs=1, enable_prefix_caching=False,
gpu_memory_utilization=0.85, trust_remote_code=False,
disable_log_stats=True)
init = time.perf_counter() - t0
sp1 = SamplingParams(temperature=0.0, max_tokens=1, ignore_eos=True)
spg = SamplingParams(temperature=0.0, max_tokens=a.tg, ignore_eos=True)
pp_prompt = {"prompt_token_ids": list(range(10, 10 + a.pp))}
tg_prompt = {"prompt_token_ids": [10]}
def run(p, sp):
s = time.perf_counter()
llm.generate([p], sp, use_tqdm=False)
return time.perf_counter() - s
run(pp_prompt, sp1)
pp = min(run(pp_prompt, sp1) for _ in range(a.reps))
tg = min(run(tg_prompt, spg) for _ in range(a.reps))
tg1 = min(run(tg_prompt, sp1) for _ in range(a.reps))
return init, pp, tg, tg1
def bench_sglang(a):
import sglang as sgl
t0 = time.perf_counter()
llm = sgl.Engine(model_path=a.model, dtype=a.dtype,
context_length=a.max_model_len,
disable_radix_cache=True, mem_fraction_static=0.85,
disable_cuda_graph=False, log_level="error")
init = time.perf_counter() - t0
pp_ids = list(range(10, 10 + a.pp))
def run(ids, n):
s = time.perf_counter()
llm.generate(input_ids=[ids],
sampling_params={"temperature": 0.0, "max_new_tokens": n,
"ignore_eos": True})
return time.perf_counter() - s
run(pp_ids, 1)
pp = min(run(pp_ids, 1) for _ in range(a.reps))
tg = min(run([10], a.tg) for _ in range(a.reps))
tg1 = min(run([10], 1) for _ in range(a.reps))
llm.shutdown()
return init, pp, tg, tg1
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--engine", choices=["vllm", "sglang"], required=True)
ap.add_argument("--model", default="XHToken/Spark-X2.5-1.7B")
ap.add_argument("--dtype", default="bfloat16")
ap.add_argument("--pp", type=int, default=512)
ap.add_argument("--tg", type=int, default=128)
ap.add_argument("--reps", type=int, default=3)
ap.add_argument("--max-model-len", type=int, default=2048)
ap.add_argument("--out", default="gpu_bench.jsonl")
a = ap.parse_args()
init, pp, tg, tg1 = (bench_vllm if a.engine == "vllm" else bench_sglang)(a)
res = {
"engine": a.engine, "dtype": a.dtype, "gpu": os.environ.get("GPU_NAME", ""),
"init_s": round(init, 2),
"pp_tokens": a.pp, "pp_s": round(pp, 4), "pp_tps": round(a.pp / pp, 2),
"tg_tokens": a.tg, "tg_s": round(tg - tg1, 4),
"tg_tps": round((a.tg - 1) / max(tg - tg1, 1e-9), 2),
}
print(json.dumps(res, indent=2))
with open(a.out, "a") as f:
f.write(json.dumps(res) + "\n")
if __name__ == "__main__":
main()