Files
595948946e fix(model_comparator): fix ImportError from scipy.stats.norm import (#3742)
* fix(model_comparator): import norm from scipy.stats, not scipy.stats.norm

* pacify pre-commit

---------

Co-authored-by: Chessing234 <[email protected]>
Co-authored-by: Baber Abbasi <[email protected]>
2026-05-03 19:54:42 +05:00

142 lines
4.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import argparse
import logging
import os
import numpy as np
import pandas as pd
import torch
import lm_eval.evaluator
import lm_eval.models.utils_hf
os.environ["TOKENIZERS_PARALLELISM"] = "false"
eval_logger = logging.getLogger(__name__)
def memory_stats():
eval_logger.info(
"Memory allocated: %s, reserved: %s",
torch.cuda.memory_allocated() / 1024**2,
torch.cuda.memory_reserved() // 1024**2,
)
def calculate_z_value(res1: dict, res2: dict) -> tuple[float, float]:
from scipy.stats import norm
acc1, acc2 = res1["acc,none"], res2["acc,none"]
st_err1, st_err2 = res1["acc_stderr,none"], res2["acc_stderr,none"]
Z = (acc1 - acc2) / np.sqrt((st_err1**2) + (st_err2**2))
# Determining the p-value
p_value = 2 * norm.sf(abs(Z)) # two-tailed test
return Z, p_value
def print_results(
data_to_print: list | None = None,
results_dict: dict | None = None,
alpha: float | None = None,
):
model1_data = data_to_print[0]
model2_data = data_to_print[1]
table_data = []
for task in model1_data:
row = {
"Task": task,
"HF Accuracy": model1_data[task]["acc,none"],
"vLLM Accuracy": model2_data[task]["acc,none"],
"HF StdErr": model1_data[task]["acc_stderr,none"],
"vLLM StdErr": model2_data[task]["acc_stderr,none"],
}
table_data.append(row)
comparison_df = pd.DataFrame(table_data)
comparison_df["Z-Score"] = comparison_df["Task"].apply(
lambda task: results_dict[task]["z"]
)
comparison_df["P-Value"] = comparison_df["Task"].apply(
lambda task: results_dict[task]["p_value"]
)
comparison_df[f"p > {alpha}"] = comparison_df["P-Value"].apply(
lambda p: "✓" if p > alpha else "×"
)
return comparison_df
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--pretrained", default="EleutherAI/pythia-70m", help="name of model to compare"
)
parser.add_argument(
"--hf_args", help="huggingface model args <arg>=<value>", default=""
)
parser.add_argument("--vllm_args", help="vllm model args <arg>=<value>", default="")
parser.add_argument("--tasks", type=str, default="arc_easy,hellaswag")
parser.add_argument(
"--limit",
type=float,
default=100,
)
parser.add_argument(
"--alpha",
type=float,
default=0.05,
help="Significance level for two-tailed z-test",
)
parser.add_argument(
"--device",
type=str,
default="cuda",
)
parser.add_argument(
"--batch",
type=str,
default=8,
)
parser.add_argument(
"--verbosity",
type=str,
default="INFO",
help="Logging verbosity",
)
return parser.parse_args()
if __name__ == "__main__":
args = parse_args()
tasks = args.tasks.split(",")
print(tasks)
hf_args, vllm_args = "," + args.hf_args, "," + args.vllm_args
results_vllm = lm_eval.evaluator.simple_evaluate(
model="vllm",
model_args=f"pretrained={args.pretrained}" + vllm_args,
tasks=tasks,
limit=args.limit,
device=args.device,
batch_size=args.batch,
)
memory_stats()
lm_eval.models.utils_hf.clear_torch_cache()
eval_logger.info("Memory stats cleared")
memory_stats()
results_hf = lm_eval.evaluator.simple_evaluate(
model="hf",
model_args=f"pretrained={args.pretrained}" + hf_args,
tasks=tasks,
limit=args.limit,
device=args.device,
batch_size=args.batch,
)
all_res = {}
for task1, task2 in zip(
results_hf["results"].items(), results_vllm["results"].items(), strict=True
):
assert task1[0] == task2[0]
z, p_value = calculate_z_value(task1[1], task2[1])
all_res[task1[0]] = {"z": z, "p_value": p_value}
df = print_results(
[results_hf["results"], results_vllm["results"]], all_res, args.alpha
)
print(df)