Skip to content

docs: table the concrete differences from upstream - #236

Merged
glennneuber merged 3 commits into
mainfrom
docs/fork-differences-table
Aug 29, 2026
Merged

docs: table the concrete differences from upstream#236
glennneuber merged 3 commits into
mainfrom
docs/fork-differences-table

Conversation

@glennneuber

Copy link
Copy Markdown

The banner said which areas the fork touches. It did not say what actually differs — so this adds the numbers.

Every upstream figure was read from llama.cpp at b10630 (the pin this fork builds), not recalled:

  • nemotron-3: upstream has no set_limit_image_tokens for NEMOTRON_V2_VL at all — it is a fixed 512×512 canvas, 256 tokens per image regardless of aspect. The fork does 256–3328 with in-graph position-embedding interpolation.
  • gemma4: upstream set_limit_image_tokens(40, 280), and an under-budget image keeps its natural rounded grid, letterbox-padded. The fork fills the budget, snaps to the supported ladder, and never pads — off-ladder grids measurably break box_2d vertical grounding.
  • qwen2.5-vl / MMQ: the two carried defect fixes, each linked to its upstream issue or PR.
  • Vision regression testing: upstream has none in-tree.

The table sits outside the banner's blockquote — a table nested in a blockquote renders inconsistently across viewers, and a broken table on the landing page is worse than no table.

It closes on the point the table should be making: every row is a delta we would rather not have, offered upstream where it is upstream's to take and deleted here once it lands.

glennneuber and others added 3 commits August 29, 2026 15:34
The banner said what areas the fork touches; it did not say what actually
differs. Adds a table with the specific limits, each checked against
upstream at b10630 rather than recalled:

  nemotron-3   fixed 512x512 canvas, 256 tokens/image  ->  256-3328,
               native aspect (upstream has no set_limit_image_tokens for
               NEMOTRON_V2_VL at all)
  gemma4       caps at 280 tokens, under-budget images keep their natural
               rounded grid and are letterbox-padded  ->  scaled to fill
               the budget, snapped to the supported ladder, never padded
  qwen2.5-vl   fp16 accumulation in the vision tower overflows on some
               ordinary images  ->  fp32 forced for qwen25vl runners
  MoE + MMQ    ids-path padding sized from ne11, no padding under
               broadcast  ->  sized from the flattened row count
  regression   none in-tree  ->  preflight harness, generated triggers,
               node meter

Placed outside the banner's blockquote: a table nested in a blockquote
renders inconsistently, and a broken table on the landing page is worse
than none.

Closes with the point the table should make -- every row is a delta we
would rather not have, offered upstream where it is upstream's to take and
deleted here once it lands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The banner called MLX 'experimental' without saying what that means to
someone deciding whether to use it. Adds the caveats:

- it works, with the one CUDA figure we actually have recorded
  (gemma4:31b-nvfp4, 41.5 tok/s, 22 GiB, idle host)
- on CUDA it is roughly half the GGML path's throughput -- marked as an
  operational observation, NOT a benchmark, because no matched same-host
  GGML-vs-MLX CUDA pair is recorded anywhere in this repo
- on Metal the ordering reverses: a matched campaign measured MLX ~2.4x
  faster than llama-server (12b: 121 vs 50 tok/s), so the CUDA gap is
  CUDA-specific and neither number generalises to the other platform
- MLX-vs-GGUF output quality is not a controlled comparison at all, since
  engine and quantization move together (nvfp4 vs q4_K_M) -- the campaign
  doc already records this caveat and it belongs where users see it

Ends with the operational advice: use GGML/llama-server where throughput or
comparability matters.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upstream has no bounding-box coordinate contract: a caller must trust the
frame the model declares, and that is precisely what fails -- pinned to
real pixels, qwen3.6 converts 1 of 14 geometries.

The fork pins norm-1000 and derives the space from the response rather
than a declared ref_size, so the model never names its own frame and its
internal resize cannot contaminate the coordinates. 111 of 112 cells
convert cleanly across 14 geometries x 4 models x 2 think modes
(ADR 0027/0030, SPEC C13-C18).

Phrased as a protocol plus its conformance measurements, not a runtime
feature, because that is what it is -- no Go enforces the pin, and a
caller who ignores the contract gets the unpinned behaviour. The row would
otherwise read as something the server does for you.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@glennneuber

Copy link
Copy Markdown
Author

Added the bounding-box row.

Upstream has no coordinate contract at all — a caller must trust the frame the model declares, and that is exactly the failure mode: pinned to real pixels, qwen3.6 converts 1 of 14 geometries. Pinning norm-1000 and deriving the space from the response instead gives 111 of 112 cells converting cleanly across 14 geometries × 4 models × 2 think modes (ADR 0027/0030, SPEC C13–C18).

Deliberately phrased as a protocol and its conformance measurements, not a runtime change — no Go enforces the pin, so a caller who ignores the contract gets the unpinned behaviour. Without that qualifier the row reads as something the server does for you, which would be the most misleading line in the table.

Two things it does not claim, both true and worth knowing: the conformance probes live in vision_suite.py (campaign suite), so they do not run per-build like preflight does; and SPEC C14 is still marked enforcement pendingbbox_self_check() returns a bare pass/fail and cannot yet express "non-discriminating".

@glennneuber
glennneuber merged commit 0e0f7e1 into main Aug 29, 2026
1 check passed
@glennneuber
glennneuber deleted the docs/fork-differences-table branch August 29, 2026 12:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant