Download scripts/latency.py from bunyamineymen/rag-gate-stats-code: direct link, hf CLI and curl.
- Browser
- Download file 2.69 kB
-
https://huggingface.co/bunyamineymen/rag-gate-stats-code/resolve/main/scripts/latency.py
- Command line
-
hf download hf://bunyamineymen/rag-gate-stats-code/scripts/latency.py
-
curl -L -o latency.py https://huggingface.co/bunyamineymen/rag-gate-stats-code/resolve/main/scripts/latency.py
2.69 kB
| """Per-query retrieval latency with a fixed thread count (HF CPU Basic profile: 2 vCPU). | |
| Run on an otherwise idle machine after scripts/run_all.py: uv run python scripts/latency.py | |
| """ | |
| import os | |
| import sys | |
| from pathlib import Path | |
| import yaml | |
| ROOT = Path(__file__).resolve().parents[1] | |
| CFG = yaml.safe_load((ROOT / "configs" / "default.yaml").read_text()) | |
| THREADS = str(CFG["latency"]["threads"]) | |
| for var in ("OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS"): | |
| os.environ[var] = THREADS # must be set before numpy/torch/faiss load | |
| import time # noqa: E402 | |
| import faiss # noqa: E402 | |
| import numpy as np # noqa: E402 | |
| import pandas as pd # noqa: E402 | |
| import torch # noqa: E402 | |
| from gatestats import data, retrieve # noqa: E402 | |
| def main(): | |
| lat = CFG["latency"] | |
| torch.set_num_threads(lat["threads"]) | |
| faiss.omp_set_num_threads(lat["threads"]) | |
| name, cache = lat["dataset"], ROOT / "cache" / lat["dataset"] | |
| ds = data.load(name) | |
| fns = {} | |
| for system in lat["systems"]: | |
| if system == "bm25": | |
| index = retrieve.bm25_index(ds.doc_texts) | |
| fns[system] = lambda q, index=index: retrieve.bm25_run(index, [q], 10) | |
| continue | |
| key = CFG["hnsw"]["model"] if system.startswith("hnsw") else system | |
| mcfg = CFG["models"][key] | |
| model = retrieve.load_model(mcfg, CFG["max_seq_length"]) | |
| if system.startswith("hnsw"): | |
| index = faiss.read_index(str(cache / "hnsw_s0.faiss")) | |
| index.hnsw.efSearch = int(system.split("_ef")[1].split("_")[0]) | |
| else: | |
| index = retrieve.exact_index(np.load(cache / f"emb_{key}_docs.npy")) | |
| fns[system] = lambda q, m=model, p=mcfg["query_prefix"], ix=index: ix.search( | |
| retrieve.embed(m, [q], p, progress=False), 10) | |
| rows, rng = [], np.random.default_rng([CFG["seed"], 5]) | |
| for run in range(lat["runs"]): | |
| for system, fn in fns.items(): | |
| order = rng.permutation(len(ds.query_ids)) | |
| for i in order[: lat["warmup"]]: | |
| fn(ds.query_texts[i]) | |
| for i in order: | |
| t0 = time.perf_counter() | |
| fn(ds.query_texts[i]) | |
| rows.append((system, run, ds.query_ids[i], (time.perf_counter() - t0) * 1000)) | |
| print(f"run {run + 1}/{lat['runs']} done", file=sys.stderr, flush=True) | |
| out = pd.DataFrame(rows, columns=["system", "run", "qid", "ms"]) | |
| out.to_parquet(ROOT / "results" / "latency.parquet", index=False) | |
| print(out.groupby("system")["ms"].describe(percentiles=[0.5, 0.95, 0.99]).round(2)) | |
| if __name__ == "__main__": | |
| main() | |