File size: 12,264 Bytes
dfb775d 730c5bb dfb775d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 | """Pydantic schemas for the canonical MEI measurement record (spec §7).
The structured record is the integration boundary between inference-engine
wrappers (`throughput.py`), the measurement orchestrator (`orchestrator.py`),
and MEI scoring (`score.py`). Once written, every harness conforms to it.
Design constraints from the spec:
- Every reported figure carries its measurement context: hardware SKU,
engine commit SHA, tokenizer revision, quantization tuple, seed,
warmup count, sample size.
- Latency is reported at p50 / p95 / p99 with bootstrap 95% CIs —
*never* as a mean alone (spec §4, "production latency distributions
are routinely 15x heavier at p99 than at the mean under contention").
- Throughput is reported per the four-tier context battery (32, 512,
8192, 32768 tokens) so context-scaling degradation is visible.
- Concurrency sweep at (1, 4, 16, 64, max) captures the Pareto curve;
a single batch-1 number is non-conformant per spec §4.
- Energy is optional but carries an `energy_estimated` flag when the
bandwidth-bound proxy was used in lieu of direct measurement.
"""
from __future__ import annotations
from typing import Literal
from pydantic import BaseModel, ConfigDict, Field, model_validator
# Exactly four context tiers per spec §4. The headline Ttg used in the
# composite is the geometric mean across these tiers.
EXPECTED_CONTEXT_TIERS: tuple[int, ...] = (32, 512, 8192, 32768)
# Concurrency points per spec §4. `max` is the hardware's sustained max
# under a 10s p99 TTFT SLO — recorded as an integer for the actual point
# achieved by the run.
EXPECTED_CONCURRENCY: tuple[int, ...] = (1, 4, 16, 64)
class HardwareIdent(BaseModel):
"""Hardware reproducibility envelope (spec §4)."""
model_config = ConfigDict(extra="forbid", frozen=True)
cpu_sku: str = Field(min_length=1, description="e.g. 'AMD EPYC 9654' or 'Apple M3 Ultra'.")
simd_class: str = Field(
default="",
description="AVX2 | AVX-512 | AVX-512-VNNI | AMX | NEON | SVE2 | SME | Metal | gfx942 …",
)
dram_channel_count: int = Field(default=0, ge=0)
dram_clock_mhz: int = Field(default=0, ge=0)
gpu_sku: str = Field(default="", description="e.g. 'AMD MI300X', 'NVIDIA H100', or empty for CPU-only.")
gpu_clock_mhz: int = Field(default=0, ge=0)
os_kernel: str = Field(default="", description="e.g. 'Linux 6.8.0-110-generic'.")
class InferenceEngineIdent(BaseModel):
"""Identify exactly which engine produced the measurement (spec §4)."""
model_config = ConfigDict(extra="forbid", frozen=True)
name: Literal["llama.cpp", "ollama", "vllm", "sglang", "transformers", "bankml"] = Field(
description="Which serving engine collected the timings.",
)
commit_sha: str = Field(min_length=1, description="Engine binary commit SHA or version string.")
config: dict[str, str] = Field(
default_factory=dict,
description="Engine-specific config knobs (cache_type_k, --n_threads, --gpu_layers, etc.).",
)
class QuantizationTuple(BaseModel):
"""Per spec §4: every reported figure carries an explicit quantization tuple.
A Q4_K_M-with-imatrix run is distinguishable from Q4_K_M-without-imatrix.
"""
model_config = ConfigDict(extra="forbid", frozen=True)
scheme: str = Field(
min_length=1,
description=(
"Quantization name: Q2_K, Q4_K_M, Q5_K_M, Q8_0, IQ2_XXS, IQ4_NL, "
"GPTQ, AWQ, EXL2, NF4, FP8, NVFP4, BF16, FP16, FP32."
),
)
bpw: float = Field(gt=0.0, description="Bits per weight (effective).")
calibration_corpus: str = Field(
default="",
description="Imatrix / GPTQ / AWQ calibration set identifier; empty if none.",
)
class TokenSeries(BaseModel):
"""The four primary token counts per request (spec §3, §4)."""
model_config = ConfigDict(extra="forbid", frozen=True)
n_prefill: int = Field(ge=0, description="Prompt tokens consumed, including chat-template scaffolding.")
n_decode: int = Field(ge=0, description="Output tokens generated (incl. stop tokens before EOS).")
b_decode: int = Field(ge=0, description="UTF-8 byte length of decoded output.")
n_useful_decode: int = Field(
ge=0,
description="Content tokens after structured-output parsing — excludes ChatML scaffolding.",
)
@model_validator(mode="after")
def _useful_does_not_exceed_decode(self) -> TokenSeries:
if self.n_useful_decode > self.n_decode:
msg = (
f"n_useful_decode ({self.n_useful_decode}) cannot exceed "
f"n_decode ({self.n_decode}) — useful tokens are a subset."
)
raise ValueError(msg)
return self
class LatencyPercentiles(BaseModel):
"""p50/p95/p99 with bootstrap 95% CI (spec §4).
Never report a mean alone — distributions are heavy-tailed. The
`ci_low_p95` / `ci_high_p95` pair is the bootstrap envelope around
the p95 specifically; the spec privileges p95 as the headline
latency point.
"""
model_config = ConfigDict(extra="forbid", frozen=True)
p50_ms: float = Field(ge=0.0)
p95_ms: float = Field(ge=0.0)
p99_ms: float = Field(ge=0.0)
ci_low_p95: float = Field(ge=0.0, description="Bootstrap 95% CI lower bound on p95.")
ci_high_p95: float = Field(ge=0.0, description="Bootstrap 95% CI upper bound on p95.")
sample_n: int = Field(ge=1, description="Samples behind these percentiles (≥ 100 per spec §4).")
@model_validator(mode="after")
def _percentile_ordering(self) -> LatencyPercentiles:
if not (self.p50_ms <= self.p95_ms <= self.p99_ms):
msg = (
f"latency percentiles must be monotone: "
f"p50={self.p50_ms} p95={self.p95_ms} p99={self.p99_ms}"
)
raise ValueError(msg)
if self.ci_low_p95 > self.p95_ms or self.ci_high_p95 < self.p95_ms:
msg = (
f"bootstrap CI [{self.ci_low_p95}, {self.ci_high_p95}] "
f"does not bracket p95 {self.p95_ms}"
)
raise ValueError(msg)
return self
class ContextTierMeasurement(BaseModel):
"""One row of the four-tier context battery (spec §4).
`Tpp` is the prefill throughput, `Ttg` is the decode throughput, both
in tokens/sec. The geometric mean of Ttg across tiers is the headline
decode rate used by `Dt`.
"""
model_config = ConfigDict(extra="forbid", frozen=True)
context_tokens: int = Field(
description="One of EXPECTED_CONTEXT_TIERS — 32, 512, 8192, 32768.",
)
tpp_tok_s: float = Field(ge=0.0, description="Prefill (prompt-processing) throughput.")
ttg_tok_s: float = Field(ge=0.0, description="Decode (generation) throughput.")
bytes_per_sec: float = Field(
ge=0.0,
description="Auxiliary tokenizer-invariant rate (UTF-8 bytes of decoded output / sec).",
)
ttft: LatencyPercentiles = Field(description="Time-to-first-token percentiles.")
tpot: LatencyPercentiles = Field(description="Time-per-output-token percentiles.")
itl: LatencyPercentiles = Field(
description="Inter-token latency (vLLM convention: excludes TTFT).",
)
@model_validator(mode="after")
def _context_is_canonical_tier(self) -> ContextTierMeasurement:
if self.context_tokens not in EXPECTED_CONTEXT_TIERS:
msg = (
f"context_tokens={self.context_tokens} not one of the "
f"canonical tiers {EXPECTED_CONTEXT_TIERS}; non-conformant"
)
raise ValueError(msg)
return self
class ConcurrencyPoint(BaseModel):
"""One point on the concurrency-vs-throughput-vs-latency Pareto curve."""
model_config = ConfigDict(extra="forbid", frozen=True)
concurrency: int = Field(ge=1, description="Number of in-flight requests.")
aggregate_throughput_tok_s: float = Field(
ge=0.0,
description="Total tokens/sec across all concurrent requests.",
)
p99_ttft_ms: float = Field(
ge=0.0,
description="p99 TTFT at this concurrency — gates against the 10s SLO.",
)
goodput_fraction: float = Field(
default=0.0,
ge=0.0,
le=1.0,
description=(
"Fraction of requests meeting the (ttft:500ms, tpot:50ms) SLO. "
"Cheng et al. smooth-goodput preferred where instrumentable."
),
)
class MEIRecord(BaseModel):
"""The canonical structured record (spec §7).
One per (model, hardware, engine, quantization, run) tuple. Every
headline metric the MEI computes is downstream of this record.
"""
model_config = ConfigDict(extra="forbid", frozen=True)
# ---- identity ----
model_id: str = Field(min_length=1, description="HF Hub repo ID or local checkpoint name.")
model_sha256: str = Field(
min_length=8,
description="BLAKE3 or SHA-256 of the resolved model weights file(s).",
)
tokenizer_revision: str = Field(
min_length=1,
description="Tokenizer revision hash per spec Rule 3.1.",
)
quantization: QuantizationTuple
# ---- environment ----
hardware: HardwareIdent
engine: InferenceEngineIdent
seed: int = Field(ge=0)
warmup_requests: int = Field(default=5, ge=0, description="Discarded warmups per spec §4.")
sample_size: int = Field(
default=100,
ge=1,
description="Steady-state requests behind every latency percentile.",
)
# ---- measurements ----
tier_measurements: list[ContextTierMeasurement] = Field(
description="Exactly 4 entries — one per canonical context tier.",
)
concurrency: list[ConcurrencyPoint] = Field(
description="Concurrency sweep — typically 5 points.",
)
peak_memory_gb: float = Field(
ge=0.0,
description="Resident set at the 32K context working point — weights + KV + runtime.",
)
kv_cache_gb_at_32k: float = Field(
ge=0.0,
description="KV cache footprint at 32K context — reported separately per spec §4.",
)
energy_j_per_useful_token: float | None = Field(
default=None,
description="Energy per useful decoded token (J). None if not measured.",
)
energy_estimated: bool = Field(
default=False,
description="True when E was derived from the bandwidth-bound proxy.",
)
# ---- quality ----
quality_raw: dict[str, float] = Field(
default_factory=dict,
description=(
"Per-evaluation raw scores keyed by canonical name "
"(mmlu_pro, gpqa_diamond, ifeval_strict_prompt, livebench_reasoning, "
"bigcodebench_hard_pass1, mt_bench_2turn, mab)."
),
)
quality_pool_version: str = Field(
default="v0.1",
description="Reference pool version (random baseline + Qwen3.5-flagship ceilings).",
)
mab_provisional: bool = Field(
default=True,
description=(
"True until the mindX Agentic Battery v1.0 is sealed. While "
"provisional, the 0.35 Agentic-band weight redistributes "
"across the other three Q bands."
),
)
@model_validator(mode="after")
def _exactly_four_tiers(self) -> MEIRecord:
contexts = sorted(t.context_tokens for t in self.tier_measurements)
if contexts != sorted(EXPECTED_CONTEXT_TIERS):
msg = (
f"tier_measurements must cover exactly {EXPECTED_CONTEXT_TIERS}; "
f"got {tuple(contexts)}"
)
raise ValueError(msg)
return self
@model_validator(mode="after")
def _energy_estimated_flag_consistent(self) -> MEIRecord:
if self.energy_j_per_useful_token is None and self.energy_estimated:
msg = "energy_estimated=True requires a non-null energy value"
raise ValueError(msg)
return self
__all__ = [
"EXPECTED_CONCURRENCY",
"EXPECTED_CONTEXT_TIERS",
"ConcurrencyPoint",
"ContextTierMeasurement",
"HardwareIdent",
"InferenceEngineIdent",
"LatencyPercentiles",
"MEIRecord",
"QuantizationTuple",
"TokenSeries",
]
|