{# The comparison page. Server-rendered in one pass, no JavaScript: everything here is read-only content, and UI standards §13 requires that to work with scripting disabled. The rule the whole layout exists to serve: two columns in different groups are never presented as if their numbers could be subtracted. A separated row says so in words, the group number appears in every affected cell, and the fingerprint diff that separates the columns is printed underneath rather than left as two hex strings nobody can read. #} {% extends "base.html" %} {% block title %}Compare · FreeWeight{% endblock %} {% block content %}

Compare results

Choose runs

Two or more run IDs, comma separated. A unique prefix is enough.

Refuses any run that is not this suite, instead of comparing across suites.

{% if error %} {% endif %} {% if not comparison and not error %}

Nothing to compare yet.

Name two or more runs above. A quantization study, a KV-precision study and a plain before-and-after are all the same form: pick the runs, and the boundaries between them are worked out and labelled for you.

{% endif %} {% if comparison %}

Subjects

This is a {{ comparison.study.value | replace("_", " ") }} across {{ comparison.columns | length }} run(s).

{% for column in comparison.columns %} {% endfor %}
What each column was measured against.
Run Model Suite Quantization KV precision Context Machine GPU Started
{{ column.run_id[:8] }}… {{ column.label }} {{ column.model_canonical_id }} {% if column.identity_confidence == "name_only" %} name only {% endif %} {{ column.suite_key }} v{{ column.suite_version }} {{ column.quantization or "—" }} {{ column.kv_cache_precision or "—" }} {{ column.context_size if column.context_size is not none else "—" }} {{ column.machine_hostname or column.machine_fingerprint[:12] ~ "…" }} {{ column.gpu_index if column.gpu_index is not none else "—" }} {{ column.started_at_rfc3339 or "—" }}
{% if comparison.context_sweep %}

Context sweep — what one token of context costs

These runs are one model at {{ comparison.context_sweep.points | length }} different served contexts on one machine, so the memory each needs can be differenced into a cost function. Each point is that run's own reported residency, not the device's total. This is a study across runs, not a benchmark result: a benchmark measures one run under one profile.

{% for point in comparison.context_sweep.points %} {% endfor %}
Model VRAM at each served context, one run per row.
Served context Model VRAM
{{ "{:,}".format(point[0]) }} tokens {{ point[1] | bytes }}

{{ comparison.context_sweep.weights_bytes | bytes }} of weights and fixed allocations, plus {{ comparison.context_sweep.bytes_per_token | bytes }} per token of context.

Fit quality r² = {{ "%.4f" | format(comparison.context_sweep.r_squared) }}, points scattered ±{{ comparison.context_sweep.residual_stddev_bytes | bytes }} around the line. A sweep taken while something else was using the GPU shows up here rather than quietly biasing the slope.

{% endif %} {% if comparison.separations %}

What separates these runs

{% for verdict in comparison.separations %}

{{ verdict.left[:8] }}… vs {{ verdict.right[:8] }}… — {{ verdict.comparability.value }} ({{ verdict.study.value | replace("_", " ") }})

{{ verdict.reason }}

{% if verdict.diff %}
Provenance differs on {{ verdict.diff | length }} field(s) {% for entry in verdict.diff %} {% endfor %}
FieldLeftRight
{{ entry.path }} {{ entry.left }} {{ entry.right }}
{% else %}

No stored fingerprint document to diff — the reason above is the whole of what is known.

{% endif %}
{% endfor %}
{% endif %}

Metrics

{% for column in comparison.columns %} {% endfor %} {% for row in comparison.rows %} {% for cell in row.cells %} {% endfor %} {% endfor %}
One row per metric, one cell per run. Each cell shows the value, its unit, and the samples it used against the samples it excluded. A group number appears wherever the columns are not directly comparable; cells in different groups are never to be read against each other.
Metric Kind{{ column.label }}Comparable
{{ row.metric_key }} ({{ row.unit }}, {{ "higher is better" if row.higher_is_better else "lower is better" }}) {{ row.kind.value }} {% if cell.numeric_value is not none %} {{ "%.4g" | format(cell.numeric_value) }} {% if row.mergeable and row.best_run_id == cell.run_id %} best {% endif %} {% else %} {% endif %}
n={{ cell.sample_count if cell.sample_count is not none else "—" }}, excluded={{ cell.excluded_count if cell.excluded_count is not none else "—" }} {% if cell.coefficient_of_variation is not none %} , cv={{ "%.3g" | format(cell.coefficient_of_variation) }} {% endif %} {% if not row.mergeable %} , group {{ cell.group_index + 1 }} {% endif %}
{% if row.mergeable %} yes {% else %} no {{ row.groups | length }} groups {% endif %}
{% if not comparison.rows %}

No aggregate metrics on these runs.

These runs stored no run-level metric rows — most often because none of them completed.

{% endif %}
{% endif %} {% endblock %}