open-compass / open-compass/VLMEvalKit

OpenVLM: one-decimal Overall makes the board un-checkable, and hides that 8 boards' #1 leads are under 1.2 sigma

Open
#1,615 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
4.4k
Forks
768
Avg merge
1d 10h
Merged PRs (30d)
17

Description

Publishing Overall to one decimal makes the OpenVLM leaderboard un-checkable, and hides that several boards' #1 leads are inside noise

Thanks for keeping OpenVLM.json public and complete — 285 models across 28 benchmarks is a genuinely useful artifact, and everything below comes from it alone.

This is a sibling of open-compass/opencompass#2574, which I filed today about CompassAcademic. The contrast between the two is the actual point of this issue, so I'll start there.

One decimal is the difference between checkable and not

On CompassAcademic, scores are published to two decimals. That was enough to recover every denominator without being told them: searching for all n consistent with round(100k/n, 2) across all published scores returned exactly 541 / 198 / 500 / 30 / 400 / 164 / 148 — the true dataset sizes. From there, standard errors and rank separation follow.

On OpenVLM, Overall is published to one decimal. I ran the same search over n in 1..4000 for every benchmark with ≥50 models:

benchmark models consistent denominators found
MMBench_TEST_EN_V11 284 3001
MMMU_VAL 284 3004
MathVista 284 3005
AI2D 284 3004
MMStar 284 3004
~3000 each

Roughly three thousand candidate denominators survive for every board — the constraint stops binding above n≈1000. No denominator can be recovered, so no reader outside the project can compute an error bar on any OpenVLM number. (MME and LLaVABench were excluded up front: they aren't percentages.)

Going to two decimals would cost nothing and would make the whole board independently checkable, exactly as CompassAcademic already is.

What can still be shown, without any denominator

The argument below needs no n at all — only an upper bound on it. Standard error decreases with sample size, so evaluating each board at the largest test set that appears anywhere on this leaderboard (SEEDBench_IMG, ~14,233) gives the smallest possible SE and therefore the most generous possible significance for the leader. If a lead is small there, it is smaller still at any realistic size.

benchmark #1 lead over #2 SE at n=14,233 lead in σ (upper bound)
ChartQA_TEST 88.2 0.1 0.270 0.37
MMBench_TEST_EN_V11 88.5 0.1 0.267 0.37
MMBench_TEST_EN 88.9 0.1 0.263 0.38
POPE 90.5 0.1 0.246 0.41
QBench 80.5 0.2 0.332 0.60
MMBench_TEST_CN_V11 88.3 0.2 0.269 0.74
RealWorldQA 78.7 0.3 0.343 0.87
MMBench_TEST_CN 88.8 0.3 0.264 1.13

Eight boards have a #1 that is under 1.2σ ahead even under the most favourable denominator on the leaderboard, and four are under 0.4σ. At sizes typical of these benchmarks the same gaps are far smaller: at n=1500 a 0.1 pp lead is 0.12σ, at n=3000 it is 0.17σ.

Two boards also have a displayed tie at the top:

  • MMBench_TEST_EN_V11: JT-VL-Chat-V3.0 and Gemini-2.5-Pro both 88.5
  • POPE: InternVL2.5-26B-MPO and InternVL3-78B both 90.5

I want to be careful here, and this is exactly why the precision matters: at one decimal I cannot show these ties are exact. On CompassAcademic I could — one item was worth 0.505 pp there, so identical display forced an identical raw count. Here one item is worth roughly 0.03–0.11 pp, so a displayed tie may be hiding a real difference. The published table simply cannot order these models, which is a statement about the table rather than about the models.

Reproduce
import json, math, urllib.request, collections
d = json.loads(urllib.request.urlopen(
    "http://opencompass.openxlab.space/assets/OpenVLM.json").read())["results"]

cols = collections.defaultdict(list)
for model, rec in d.items():
    for bench, v in rec.items():
        if bench != "META" and isinstance(v, dict) and isinstance(v.get("Overall"), (int, float)):
            cols[bench].append((model, float(v["Overall"])))

N_MAX = 14233                      # largest test set anywhere on this leaderboard
for bench in ("MMBench_TEST_EN_V11", "ChartQA_TEST", "POPE", "MMBench_TEST_EN"):
    vs = sorted(cols[bench], key=lambda x: -x[1])
    top = vs[0][1]
    nxt = next(v for _, v in vs if v < top)
    se = math.sqrt((top/100) * (1 - top/100) / N_MAX) * 100
    print(f"{bench}: #1 {top} lead {top-nxt:.1f} pp -> at most {(top-nxt)/se:.2f} sigma")
Limits, stated
  • Noise is assumed independent across models, and the published score is treated as truth. That is the standard framing; it is a model, not a fact.
  • The σ figures are upper bounds, deliberately. I do not know the real denominators — that is the first half of this issue.
  • Circular Eval on the MMBench series means a per-question outcome isn't a plain Bernoulli draw, so even with a known question count the binomial SE is an approximation there. Another reason the project's own numbers would be better than any outside reconstruction.
Suggestion
  1. Publish Overall to two decimals (and ideally the denominator per benchmark). This is the small change, and it is what would let anyone verify the board the way CompassAcademic can be verified today.
  2. Significance tiers or a CI column, once the first is in place.

Happy to open a PR for either, and equally happy to be told I've misread the scoring protocol — I'll close this myself and say so if that's the case.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the published OpenVLM.json artifact and run the reproduction script in the issue to inspect the current Overall precision and benchmark records. Trace how this artifact is generated, then update the published Overall values to two decimals; done means the regenerated board preserves the results and allows the reported comparisons to be checked.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data
Issue type
Feature
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.