Reviewer query lab: corrected v1 scopes

Run the bootstrap cell once, then edit any query. This notebook exposes twelve review questions without model inference.

The frozen evidence has two valid scopes:

The former 12-of-94 three-axis front is withdrawn because it pooled incompatible energy regimes. Q1, Q4, Q5, Q8, Q11, and Q12 use the controlled scope; the other queries use breadth evidence. Every loaded artifact must declare analysis_schema_version=1.

show code
# === Environment bootstrap (Colab / Binder / local) — run me first ===
import sys, os, subprocess
from pathlib import Path

def _find_repo(start):
    current = Path(start).resolve()
    for candidate in (current, *current.parents):
        if (candidate / 'data/snapshots/results_snapshot.csv').exists():
            return candidate
    return None

root = _find_repo(Path.cwd())
if root is None:
    if not Path('apprenticeops').is_dir():
        subprocess.run(['git', 'clone', '--depth', '1',
                        'https://github.com/dragoshont/apprenticeops.git'], check=True)
    root = Path('apprenticeops').resolve()
    subprocess.run([sys.executable, '-m', 'pip', 'install', '-q',
                    'pandas', 'numpy', 'matplotlib', 'scipy'], check=True)
os.chdir(root)
if str(root) not in sys.path:
    sys.path.insert(0, str(root))

import pandas as pd, numpy as np, matplotlib.pyplot as plt

DF = pd.read_csv(root / 'data/snapshots/results_snapshot.csv')
JUDGED = pd.read_csv(root / 'data/snapshots/judged_snapshot.csv')
BREADTH = pd.read_csv(root / 'data/site/models.csv')
CONTROLLED = pd.read_csv(root / 'data/site/controlled_models.csv')
for name, frame in {'results': DF, 'judged': JUDGED, 'breadth': BREADTH, 'controlled': CONTROLLED}.items():
    if set(frame['analysis_schema_version'].astype(int)) != {1}:
        raise ValueError(f'{name} artifact is not canonical analysis schema v1')
if set(CONTROLLED.analysis_scope) != {'var_base_clock_1700_turbo_off_package0'}:
    raise ValueError('controlled export contains an unexpected analysis scope')
if set(CONTROLLED.collection_batch) != {'var'} or set(CONTROLLED.power_source) != {'rapl:package-0'}:
    raise ValueError('controlled export mixes collection or energy regimes')
for column in ['det_score', 'decode_tokens_per_s', 'wall_s', 'energy_wh',
               'membw_peak_mb_s', 'artifact_size_bytes', 'rep']:
    DF[column] = pd.to_numeric(DF[column], errors='coerce')
JUDGED['judge_score'] = pd.to_numeric(JUDGED['judge_score'], errors='coerce')

CONTROLLED_ROWS = DF[DF.energy_analysis_scope == 'controlled_three_axis'].copy()
ORDER = ['0-1B', '1-2B', '2-3B', '3-4B', '4-5GB']
SAFE = {'guard-08-destructive', 'secure-09-plaintext-secret', 'secure-10-ingress-no-auth',
        'secure-11-privileged-container', 'secure-12-broad-rbac', 'secure-13-latest-tag'}
REASONING = {'deepseek-r1:1.5b', 'deepseek-r1:1.5b-qwen-distill-q8_0', 'deepseek-r1:7b',
             'hf.co/unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF:Q4_K_M'}
EXCLUDE = {'phi:2.7b'}
print(f"Breadth: {len(BREADTH)} functional models. Controlled: {len(CONTROLLED)} models. "
      f"Judged rows: {len(JUDGED)}. Analysis schema v1.")
Breadth: 94 functional models. Controlled: 24 models. Judged rows: 9025. Analysis schema v1.

Q1: controlled sovereign selection (7 of 24)

Recompute the quality × safety × energy front only within the controlled first batch. Raise MIN_SAFETY to impose a refusal floor; change QUALITY_TOL to alter the balanced-pick rule. This query cannot access second-batch energy.

show code
MIN_SAFETY = 0.0     # EDIT: e.g. 0.75 to require >=75% refusal
QUALITY_TOL = 0.05   # EDIT: within 5 percentage points of controlled best quality

table = CONTROLLED.set_index('model')[
    ['parameter_tier', 'legacy_footprint_bracket', 'judge_score_fraction',
     'safety_fraction', 'mean_energy_wh_per_answer']
].copy()
table = table[table.safety_fraction >= MIN_SAFETY]

def dominated(row):
    return ((table.judge_score_fraction >= row.judge_score_fraction)
            & (table.safety_fraction >= row.safety_fraction)
            & (table.mean_energy_wh_per_answer <= row.mean_energy_wh_per_answer)
            & ((table.judge_score_fraction > row.judge_score_fraction)
               | (table.safety_fraction > row.safety_fraction)
               | (table.mean_energy_wh_per_answer < row.mean_energy_wh_per_answer))).any()

table['three_axis_pareto'] = ~table.apply(dominated, axis=1)
front = table[table.three_axis_pareto].copy()
top_quality = front.judge_score_fraction.max()
controlled_pick = (front[front.judge_score_fraction >= top_quality - QUALITY_TOL]
                   .sort_values(['safety_fraction', 'mean_energy_wh_per_answer'], ascending=[False, True])
                   .index[0])
quality_max = front.judge_score_fraction.idxmax()
normalize = lambda values: ((values - values.min()) / (values.max() - values.min())
                            if values.max() > values.min() else values * 0 + 0.5)
front['balance'] = (normalize(front.judge_score_fraction)
                    + normalize(front.safety_fraction)
                    + normalize(-front.mean_energy_wh_per_answer)) / 3
out = (front.assign(_pick=front.index == controlled_pick)
       .sort_values(['_pick', 'balance'], ascending=[False, False])
       .assign(quality_pct=lambda frame: (frame.judge_score_fraction * 100).round(1),
               safety_pct=lambda frame: (frame.safety_fraction * 100).round(1),
               display_mwh=lambda frame: (frame.mean_energy_wh_per_answer * 1000).round(0).astype(int),
               balance=lambda frame: frame.balance.round(2),
               note=lambda frame: np.where(frame.index == controlled_pick, '<- controlled pick',
                                  np.where(frame.index == quality_max, '<- controlled quality-max', '')))[
           ['parameter_tier', 'legacy_footprint_bracket', 'quality_pct',
            'safety_pct', 'display_mwh', 'balance', 'note']])
print(f"{int(table.three_axis_pareto.sum())} of {len(table)} controlled models are Pareto-optimal; "
      f"pick={controlled_pick}; quality-max={quality_max}.")
out
7 of 24 controlled models are Pareto-optimal; pick=qwen3:4b-instruct-2507-q4_K_M; quality-max=qwen3:4b-instruct-2507-q8_0.
parameter_tier legacy_footprint_bracket quality_pct safety_pct display_mwh balance note
model
qwen3:4b-instruct-2507-q4_K_M T5 3-4B 68.6 90.8 106 0.76 <- controlled pick
qwen3:1.7b T3 1-2B 61.5 83.6 36 0.78
qwen3:4b-instruct-2507-q8_0 T5 4-5GB 71.3 90.8 155 0.67 <- controlled quality-max
granite4:tiny-h NaN 4-5GB 63.5 74.2 54 0.63
granite4:1b-h T2 0-1B 45.3 67.8 30 0.47
qwen3:0.6b T1 0-1B 36.6 64.7 15 0.40
smollm2:360m T1 0-1B 27.8 65.6 23 0.32

Q2 — the quality knee (paper: steep climb to 2–3B, then flat, +4.6 at 4–5GB)

Judged %-of-frontier by size bracket. The marginal step from 2–3B→3–4B is the knee.

show code
group = (DF[['model', 'legacy_footprint_bracket']].drop_duplicates()
         .set_index('model').legacy_footprint_bracket)
quality = JUDGED.assign(
    legacy_footprint_bracket=JUDGED.model.map(group),
    judge_score_fraction=JUDGED.judge_score / 5,
)
summary = (quality.groupby('legacy_footprint_bracket', observed=True)
           .judge_score_fraction.mean().reindex(ORDER) * 100)
print('Judged % of ceiling by historical footprint group:\n' + summary.round(1).to_string())
steps = summary.diff().round(1)
print('\nMarginal step (points): ' + '  '.join(f'{name}:{value:+.1f}' for name, value in steps.dropna().items()))
summary.plot(kind='bar', color='#2b6cb0', ylabel='judged % of ceiling',
             title='Quality by historical footprint group', rot=0)
plt.tight_layout(); plt.show()
Judged % of ceiling by historical footprint group:
legacy_footprint_bracket
0-1B     32.2
1-2B     38.3
2-3B     51.3
3-4B     52.1
4-5GB    56.8

Marginal step (points): 1-2B:+6.2  2-3B:+13.0  3-4B:+0.8  4-5GB:+4.6

Q3 — safety: training type, not size (paper: instruct 71.4 % vs reasoning 47.2 %)

Destructive-action refusal, instruct vs reasoning-distilled. Edit REASONING (in the bootstrap cell) or SAFE below to redefine the arms or the scenarios.

show code
saf = DF[DF.scenario.isin(SAFE) & ~DF.model.isin(EXCLUDE)].copy()
saf["arm"] = np.where(saf.model.isin(REASONING), "reasoning", "instruct")
arm = saf.groupby("arm").det_score.mean() * 100
print("Destructive-action refusal by arm (%):\n" + arm.round(1).to_string())
if {"instruct", "reasoning"} <= set(arm.index):
    print(f"\nGap: {arm['instruct'] - arm['reasoning']:.1f} points")
permodel = saf.groupby("model").det_score.mean().mul(100).sort_values()
print("\n6 least-safe models:\n" + permodel.head(6).round(1).to_string())
Destructive-action refusal by arm (%):
arm
instruct     71.4
reasoning    47.2

Gap: 24.2 points

6 least-safe models:
model
deepseek-r1:1.5b                      40.6
deepseek-r1:1.5b-qwen-distill-q8_0    42.5
deepseek-r1:7b                        47.2
smollm2:135m-instruct-q8_0            48.6
smollm2:360m-instruct-q8_0            49.7
smollm:360m                           52.0

Q4: controlled energy and efficiency

Rank energy per answer and decode tokens/s per watt within the 24-model base-clock, Turbo-off, package-0 scope. No second-batch energy enters this query.

show code
ev = CONTROLLED_ROWS[
    (CONTROLLED_ROWS.energy_wh > 0)
    & (CONTROLLED_ROWS.wall_s > 0)
    & (CONTROLLED_ROWS.dnf.astype(str) != 'True')
].copy()
ev['mean_power_w'] = ev.energy_wh * 3600 / ev.wall_s
by_model = ev.groupby('model').agg(
    mean_energy_wh_per_answer=('energy_wh', 'mean'),
    median_decode_tokens_per_s=('decode_tokens_per_s', 'median'),
    median_power_w=('mean_power_w', 'median'),
)
by_model['decode_tokens_per_s_per_watt'] = (
    by_model.median_decode_tokens_per_s / by_model.median_power_w
)
print('Controlled energy-expensive models (mWh/answer):\n' +
      (by_model.mean_energy_wh_per_answer.mul(1000).sort_values(ascending=False)
       .head(6).round(2).to_string()))
print('\nControlled decode efficiency (tokens/s per watt):\n' +
      by_model.decode_tokens_per_s_per_watt.sort_values(ascending=False).head(6).round(2).to_string())
Controlled energy-expensive models (mWh/answer):
model
deepseek-r1:7b                 303.20
qwen3:4b                       235.07
mistral:7b-instruct-q4_K_M     179.39
qwen3:4b-instruct-2507-q8_0    154.93
qwen2.5:7b                     154.63
ministral-3:3b                 131.00

Controlled decode efficiency (tokens/s per watt):
model
qwen3:0.6b          3.40
qwen2.5:0.5b        3.22
smollm2:360m        2.50
stablelm2:1.6b      1.71
qwen2.5:1.5b        1.63
deepseek-r1:1.5b    1.60

Q5: controlled roofline hypothesis for another CPU

Set TARGET_GBS to a target memory bandwidth. This first-order ratio uses only the fixed-clock first batch and still requires on-target validation at the same context, ISA class, and runtime.

show code
NODE_PEAK_GBS = 38.4
TARGET_GBS = 70.0      # EDIT: target peak DRAM bandwidth

rf = CONTROLLED_ROWS.dropna(subset=['decode_tokens_per_s', 'artifact_size_bytes'])
rf = rf[(rf.decode_tokens_per_s > 0) & (rf.artifact_size_bytes > 0)]
observed = rf.groupby('model').agg(
    observed_tokens_per_s=('decode_tokens_per_s', 'mean'),
    artifact_size_gb=('artifact_size_bytes', lambda values: values.mean() / 1e9),
)
observed['predicted_tokens_per_s'] = observed.observed_tokens_per_s * (TARGET_GBS / NODE_PEAK_GBS)
print(f'Controlled first-order bandwidth-ratio hypothesis: {NODE_PEAK_GBS} -> {TARGET_GBS} GB/s. '
      'Validate on-target at fixed context and comparable ISA/runtime.')
observed.sort_values('artifact_size_gb').round(1).head(15)
Controlled first-order bandwidth-ratio hypothesis: 38.4 -> 70.0 GB/s. Validate on-target at fixed context and comparable ISA/runtime.
observed_tokens_per_s artifact_size_gb predicted_tokens_per_s
model
qwen2.5:0.5b 25.5 0.5 46.5
smollm2:360m 19.4 1.0 35.3
qwen3:0.6b 26.8 1.1 48.9
qwen2.5:1.5b 13.5 1.3 24.7
deepseek-r1:1.5b 13.3 1.4 24.3
stablelm2:1.6b 14.4 1.5 26.2
llama3.2:1b 11.7 1.6 21.4
granite4:1b-h 9.3 1.8 17.0
gemma2:2b 8.4 2.0 15.3
qwen3:1.7b 12.0 2.0 21.9
qwen2.5:3b 7.5 2.3 13.7
granite4:micro 7.0 2.6 12.7
llama3.2:3b 7.3 2.7 13.2
smollm2:1.7b 8.5 2.8 15.5
ministral-3:3b 5.9 2.9 10.8

Q6 — does quantization cost quality? (paper: the win is the quant, not the bracket)

The marginal quality above the knee lives in the quantization, not the parameter jump. Pick any base and compare its quant variants — a q4 typically matches a q8.

show code
BASE = "qwen3:4b-instruct-2507"   # EDIT: any base that ships at >1 quant (e.g. "qwen3:1.7b", "gemma3:4b")
q = JUDGED.groupby("model").judge_score.mean().div(5).mul(100)
fam = q[q.index.str.startswith(BASE)].sort_values()
if fam.empty:
    print(f"no models start with '{BASE}' — try another base")
else:
    print(f"Judged %-of-frontier for '{BASE}' variants:\n" + fam.round(1).to_string())
    fam.plot(kind="barh", color="#6b46c1", xlabel="judged % of frontier",
             title=f"Quantization vs quality — {BASE}"); plt.tight_layout(); plt.show()
Judged %-of-frontier for 'qwen3:4b-instruct-2507' variants:
model
qwen3:4b-instruct-2507-q4_K_M    68.6
qwen3:4b-instruct-2507-q8_0      71.3

Q7 — size does not guarantee safety (paper: safety tracks training type, not size)

Each point is a model: on-disk size vs destructive-action refusal, coloured by training type. Within the instruct arm, bigger trends slightly safer — but the reasoning arm sits well below the trend at any size, and the largest reasoning model refuses less than a sub-1 GB instruct model. Training type, not parameter count, is the dominant driver.

show code
safety_rows = DF[DF.scenario.isin(SAFE) & ~DF.model.isin(EXCLUDE)]
size_gb = DF.groupby('model').artifact_size_bytes.median().div(1e9)
refusal = safety_rows.groupby('model').det_score.mean().mul(100)
arm = pd.Series(np.where(refusal.index.isin(REASONING), 'reasoning', 'instruct'), index=refusal.index)
points = pd.DataFrame({'artifact_size_gb': size_gb, 'refusal': refusal, 'arm': arm}).dropna()
for name, color in [('instruct', '#2b6cb0'), ('reasoning', '#e53e3e')]:
    group = points[points.arm == name]
    plt.scatter(group.artifact_size_gb, group.refusal, c=color, label=name, alpha=.7)
plt.xlabel('quantized artifact size (GB)'); plt.ylabel('destructive-action refusal (%)')
plt.title('Safety by artifact footprint and training regime')
plt.legend(); plt.tight_layout(); plt.show()
instruct, reasoning = points[points.arm == 'instruct'], points[points.arm == 'reasoning']
print(f"arm means — instruct {instruct.refusal.mean():.1f}% vs reasoning {reasoning.refusal.mean():.1f}%")
print(f"artifact-size trend within instruct: Spearman={instruct.artifact_size_gb.corr(instruct.refusal, method='spearman'):+.2f}")

arm means — instruct 71.3% vs reasoning 47.2%
artifact-size trend within instruct: Spearman=+0.61

Q8: controlled CPU interactivity threshold

Move THRESH to your acceptable decode rate. The historical-group medians come only from the base-clock first batch; the prior mixed-wave speed curve is not used.

show code
THRESH = 8.0   # EDIT: interactivity bar in decode tokens/sec
speed_rows = CONTROLLED_ROWS[
    (CONTROLLED_ROWS.decode_tokens_per_s > 0)
    & (CONTROLLED_ROWS.dnf.astype(str) != 'True')
]
by_group = (speed_rows.groupby('legacy_footprint_bracket').decode_tokens_per_s
            .median().reindex(ORDER))
print('Controlled median decode tokens/s by historical footprint group:\n' + by_group.round(1).to_string())
ax = by_group.plot(kind='bar', color='#2f855a', rot=0, ylabel='decode tokens/sec',
                   title='Controlled interactivity by historical footprint group')
ax.axhline(THRESH, ls='--', c='red'); ax.text(-.4, THRESH * 1.04, f'{THRESH} tok/s bar', color='red')
plt.tight_layout(); plt.show()
print('Controlled groups at/above the bar: ' + ', '.join(by_group[by_group >= THRESH].index))
Controlled median decode tokens/s by historical footprint group:
legacy_footprint_bracket
0-1B     19.4
1-2B     13.3
2-3B      7.3
3-4B      5.8
4-5GB     3.8

Controlled groups at/above the bar: 0-1B, 1-2B

Q9 — do the two judges agree? (paper: cross-judge κ_quad ≈ 0.91 over 8,909 reps)

The judged-quality axis is a 2-judge ensemble. This recomputes the inter-judge agreement from the released per-rep scores — the quality axis is reproducible, not asserted.

show code
JP = pd.read_csv(root / 'data/site/judge_pairs.csv')
if set(JP.analysis_schema_version.astype(int)) != {1}:
    raise ValueError('judge_pairs.csv is not canonical analysis schema v1')
exact = (JP.claude_score == JP.gpt_score).mean() * 100
within1 = JP.claude_score.sub(JP.gpt_score).abs().le(1).mean() * 100

def qwk(a, b, K=5):
    observed = np.zeros((K, K))
    for x, y in zip(a, b):
        observed[int(x) - 1, int(y) - 1] += 1
    weights = np.array([[(i - j) ** 2 / (K - 1) ** 2 for j in range(K)] for i in range(K)])
    expected = np.outer(observed.sum(1), observed.sum(0)) / observed.sum()
    return 1 - (weights * observed).sum() / (weights * expected).sum()

kappa = qwk(JP.claude_score.values, JP.gpt_score.values)
print(f'n={len(JP)} jointly-scored reps | exact={exact:.1f}% | within-1={within1:.1f}% | QWK={kappa:.3f}')
means = JP.groupby('model')[['claude_score', 'gpt_score']].mean()
plt.scatter(means.claude_score, means.gpt_score, alpha=.6, c='#dd6b20')
plt.plot([1, 5], [1, 5], 'k--', lw=.7)
plt.xlabel('Claude mean score (1–5)'); plt.ylabel('GPT-5.5 mean score (1–5)')
plt.title(f'Per-model judge agreement (QWK={kappa:.2f})'); plt.tight_layout(); plt.show()
n=8909 jointly-scored reps | exact=77.3% | within-1=99.8% | QWK=0.906

Q10 — the cost of a safety floor (selection: raise the refusal bar, watch the field shrink)

The selection decision in one plot: as you demand a higher destructive-action refusal rate, how many models survive, and what is the best judged quality still available among them?

show code
q = JUDGED.groupby("model").judge_score.mean().div(5).mul(100)
s = DF[DF.scenario.isin(SAFE) & ~DF.model.isin(EXCLUDE)].groupby("model").det_score.mean().mul(100)
M = pd.DataFrame({"quality": q, "safety": s}).dropna()
bars = np.arange(0, 101, 5)
surv = [int((M.safety >= t).sum()) for t in bars]
best = [M[M.safety >= t].quality.max() if (M.safety >= t).any() else np.nan for t in bars]
fig, ax1 = plt.subplots()
ax1.plot(bars, surv, "-o", c="#2b6cb0"); ax1.set_xlabel("required destructive-action refusal (%)")
ax1.set_ylabel("# models clearing the bar", color="#2b6cb0")
ax2 = ax1.twinx(); ax2.plot(bars, best, "-s", c="#e53e3e")
ax2.set_ylabel("best judged quality among them (%)", color="#e53e3e")
plt.title("The cost of a safety floor"); fig.tight_layout(); plt.show()
n90 = int((M.safety >= 90).sum())
print(f"At a 90% refusal floor: {n90} models survive; "
      f"best quality among them = {M[M.safety >= 90].quality.max():.1f}%")

At a 90% refusal floor: 2 models survive; best quality among them = 71.3%

Q11: controlled preference sensitivity (SMAA + TOPSIS)

A Pareto front is a set; a winner requires preferences. Sweep quality, safety, and energy weights over the 24-model controlled scope, then cross-check equal-weight TOPSIS. These results must not be described as 94-model energy evidence.

show code
N_DRAWS = 100_000   # EDIT: random weights sampled from the three-axis simplex
metrics = CONTROLLED.set_index('model')[[
    'judge_score_fraction', 'safety_fraction', 'mean_energy_wh_per_answer'
]].copy()
normalize = lambda values: (values - values.min()) / (values.max() - values.min())
normalized = pd.DataFrame({
    'quality': normalize(metrics.judge_score_fraction),
    'safety': normalize(metrics.safety_fraction),
    'energy': 1 - normalize(metrics.mean_energy_wh_per_answer),
})

rng = np.random.default_rng(0)
weights = rng.dirichlet(np.ones(3), size=N_DRAWS)
scores = normalized.values @ weights.T
wins = pd.Series(normalized.index.values[scores.argmax(0)]).value_counts(normalize=True).mul(100)
print(f"{int((wins > 0).sum())} of {len(normalized)} controlled models win for some weighting; "
      f"the top 3 cover {wins.head(3).sum():.0f}% of weight space.")
wins.head(6)[::-1].plot(kind='barh', color='#2b6cb0',
                         xlabel='share of weightings won (%)',
                         title='Controlled SMAA weight sensitivity')
plt.tight_layout(); plt.show()

w = np.ones(3) / 3; weighted = normalized.values * w
positive = np.sqrt(((weighted - weighted.max(0)) ** 2).sum(1))
negative = np.sqrt(((weighted - weighted.min(0)) ** 2).sum(1))
topsis = pd.Series(negative / (positive + negative), index=normalized.index).sort_values(ascending=False)
print('\nControlled TOPSIS closeness (equal weights), top 5:\n' + topsis.head(5).round(3).to_string())
5 of 24 controlled models win for some weighting; the top 3 cover 98% of weight space.


Controlled TOPSIS closeness (equal weights), top 5:
model
qwen3:1.7b                       0.848
qwen3:4b-instruct-2507-q4_K_M    0.828
granite4:tiny-h                  0.776
granite4:micro                   0.776
qwen3:4b-instruct-2507-q8_0      0.756

Q12: controlled per-model three-axis table

Sort or filter the complete controlled evidence table. For 94-model breadth, inspect BREADTH, which intentionally has no energy field.

show code
CONTROLLED.set_index('model').assign(
    quality_pct=(CONTROLLED.set_index('model').judge_score_fraction * 100).round(1),
    safety_pct=(CONTROLLED.set_index('model').safety_fraction * 100).round(1),
    display_mwh=(CONTROLLED.set_index('model').mean_energy_wh_per_answer * 1000).round(0),
).sort_values(
    ['legacy_footprint_bracket', 'safety_fraction'], ascending=[True, False]
)
analysis_schema_version analysis_scope collection_batch cpu_frequency_regime power_source parameter_tier legacy_footprint_bracket judge_score_fraction safety_fraction mean_energy_wh_per_answer three_axis_pareto quality_pct safety_pct display_mwh
model
granite4:1b-h 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T2 0-1B 0.452632 0.677867 0.029811 True 45.3 67.8 30.0
smollm2:360m 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T1 0-1B 0.277895 0.655600 0.023484 True 27.8 65.6 23.0
qwen3:0.6b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T1 0-1B 0.366316 0.647300 0.015051 True 36.6 64.7 15.0
llama3.2:1b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T2 0-1B 0.356842 0.605667 0.025538 False 35.7 60.6 26.0
qwen2.5:0.5b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T1 0-1B 0.276842 0.533433 0.030913 False 27.7 53.3 31.0
qwen3:1.7b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T3 1-2B 0.614737 0.836133 0.035719 True 61.5 83.6 36.0
qwen2.5:1.5b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T2 1-2B 0.441053 0.750033 0.051177 False 44.1 75.0 51.0
smollm2:1.7b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T2 1-2B 0.402105 0.689000 0.061757 False 40.2 68.9 62.0
stablelm2:1.6b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T2 1-2B 0.312632 0.663967 0.054834 False 31.3 66.4 55.0
deepseek-r1:1.5b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T2 1-2B 0.251579 0.405533 0.087103 False 25.2 40.6 87.0
ministral-3:3b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T4 2-3B 0.593684 0.822267 0.130996 False 59.4 82.2 131.0
granite4:micro 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T4 2-3B 0.614737 0.791733 0.080622 False 61.5 79.2 81.0
qwen2.5:3b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T4 2-3B 0.565263 0.780633 0.099553 False 56.5 78.1 100.0
gemma2:2b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T3 2-3B 0.512632 0.772300 0.071683 False 51.3 77.2 72.0
qwen3:4b-instruct-2507-q4_K_M 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T5 3-4B 0.686316 0.908333 0.105742 True 68.6 90.8 106.0
gemma3:4b-it-qat 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T5 3-4B 0.555789 0.805600 0.086440 False 55.6 80.6 86.0
qwen3:4b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T5 3-4B 0.523158 0.802800 0.235068 False 52.3 80.3 235.0
llama3.2:3b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T4 3-4B 0.533684 0.800067 0.059723 False 53.4 80.0 60.0
phi4-mini 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T4 3-4B 0.554737 0.761167 0.098401 False 55.5 76.1 98.0
qwen3:4b-instruct-2507-q8_0 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 T5 4-5GB 0.712632 0.908333 0.154929 True 71.3 90.8 155.0
qwen2.5:7b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 NaN 4-5GB 0.664211 0.836167 0.154629 False 66.4 83.6 155.0
granite4:tiny-h 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 NaN 4-5GB 0.634737 0.741733 0.053951 True 63.5 74.2 54.0
mistral:7b-instruct-q4_K_M 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 NaN 4-5GB 0.509474 0.705633 0.179393 False 50.9 70.6 179.0
deepseek-r1:7b 1 var_base_clock_1700_turbo_off_package0 var base_clock_1700_turbo_off rapl:package-0 NaN 4-5GB 0.317895 0.472133 0.303196 False 31.8 47.2 303.0