Skip to content

Independent RTX 3080 (10GB) measurements + engine-matched quality comparison — Ternary Bonsai 2 27B PTQ1_0 vs conventional 2-bit of the same base #283

Description

@afi-lambda

Independent RTX 3080 measurements + engine-matched quality comparison — Ternary Bonsai 2 27B (PTQ1_0) vs conventional 2-bit of the same base

Hi PrismML team — thanks for Bonsai 2 27B and for keeping KNOWN_ISSUES.md current; it saved this study several dead ends (the CUDA-13.3 crash cluster, reasoning_effort:"high" → 500, and the ngram no-op were all avoided because of it).

We ran an independent reproduction on a consumer Ampere card (RTX 3080 10GB, sm_86), which is absent from the README throughput table, and an engine-matched quality comparison between PTQ1_0 and a conventional 2-bit quant of the same base model (Qwen3.8-27B-UD-IQ2_XXS, unsloth). Everything below is from a self-contained repro package (runners, per-item JSONs, fixture, analysis script) that we can hand over in full.

1. Throughput rows you don't have yet: RTX 3080 (10GB)

llama-bench, fork build prism-b10735-842b188 (Linux CUDA 12.8), batch 1, depth 0, -ngl 99 -fa on; t/s are mean over llama-bench's internal repetitions (SD as printed); size = on-disk file size:

pack size pp512 tg128
PTQ1_0 (1.75 bpw) 5.53 GiB 1210.6 ± 29.8 52.18 ± 0.05
PQ2_0 (2.13 bpw) 6.70 GiB 1184.5 ± 30.9 61.38 ± 0.26
Qwen3.8-27B-UD-IQ2_XXS (2.06 bpw, same base) 6.76 GiB 1119.1 ± 32.8 44.46 ± 0.05
  • On consumer Ampere PQ2_0 decodes ~18% faster than PTQ1_0 (61.4 vs 52.2 tg128) at pp parity. That matches your H100/A100/Blackwell ordering, not the RTX 4090/L40S/Ada rows — the sm_86 crossover point vs the Ada parts may be worth a line in the card's table.
  • Both ternary packings beat the conventional IQ2_XXS at tg128 while smaller in footprint (52.2/61.4 vs 44.5).

2. Context ladder (PTQ1_0, 10GB card), every step verified with a real generation

16K q8_0 KV → 6571 MiB peak observed VRAM · 32K q8_0 = 7195 MiB (recommended serving config; ≈3,045 MiB of nominal 10-GiB capacity nominally unallocated — not reliably available to other processes) · 96K q4_0 = 8155 MiB · 128K = 8891 MiB · 160K q4_0 = 9627 MiB (highest tested working) · 192K fails at load (compute-buffer OOM). KV is cheap on the hybrid-attention backbone (~16 KV-carrying layers): 32K q8_0 costs only ~630 MiB.

3. Engine-matched quality: PTQ1_0 vs conventional 2-bit of the same base model

Framing: this compares deployable model packages (quantized checkpoint + serving recipe) under
stated settings — it is engine-matched but NOT a weights-matched quantization ablation; the two
packages may also differ in post-quant calibration.

LiveCodeBench v6, 50-problem deterministic fixture (seed 20260812; 14 easy / 14 medium / 22 hard), one sample per problem, temp 0.2, max_tokens 8192, single stream, identical prompt/evaluator for both arms (our runner is a fork of the same evaluator; per-item records included):

arm pass@1 hard cap-hits (8192)
Qwen3.8-27B-UD-IQ2_XXS, Prism fork b10735 16/50 (32%) 0/22 34
Bonsai 2 PTQ1_0, Prism fork b10735, reasoning_effort: medium 32/50 (64%) 6/22 18

Paired item-level analysis: 16 problems pass on PTQ1_0 and fail on IQ2_XXS, 0 the other direction (exact McNemar p = 3.1e-05, attached to the prespecified 50-item fixture and single-sample runs). The IQ2_XXS 0/22 hard tier occurred in both engine runs (13/50 on stock-llama.cpp+MTP, 16/50 on the fork; the engine switch's +3 is not significant at n=50); the ternary pack passes 6/22 at the same 8192 budget (7/22 at 16384, budgets not cross-comparable).

Two serving-relevant side findings:

  • reasoning_effort: medium beats the template default (xhigh) at 8192-token budgets: 32/50 vs 21/50, paired 11–0 discordants (exact McNemar p = 9.8e-04), fewer cap-hits. Consistent with your model-card guidance for moderate output limits.
  • Cap hits are common and budget-dependent: lifting the budget 8192→16384 (32K q8_0 KV fits easily) yields a net +3 problems and cuts cap-hits 18→14 (we report paired gains and losses below in the per-item data; a cap hit does not by itself establish the response would have passed with more tokens). Cap-hits within the both-fail items are a tie (18 vs 18) — the overall cap-hit difference lives entirely on items only PTQ1_0 passes.

4. Pack trade-off is two-sided (quality vs decode)

At identical 8192/medium settings, PQ2_0 scores 28/50 vs PTQ1_0's 32/50 — a four-problem observed quality advantage that is not statistically resolved on this fixture (2-vs-6 discordants) — while PQ2_0's decode-speed advantage (18%) is clear. Pack choice is application-dependent; we do not claim a quality-per-GB ordering from this test.

5. Notes on the runtime (all against b10735)

  • reasoning_effort accepted values observed: medium / xhigh; "high" → HTTP 500; "low" behaves ≈ xhigh (matches KNOWN_ISSUES).
  • Probing with max_tokens ≤ ~64 returns empty content for this thinking model (entire budget goes to reasoning) — worth flagging in the README's quickstart so testers don't misread it as a broken load.
  • llama-bench from the fork build handles the custom quant types cleanly (used for the rows above).

The full package (runners, fixture, per-item JSONs, analyze.py that regenerates every table and the McNemar tests, SHA256SUMS) is attached to this issue as bonsai2_3080_repro_20260925.tar.gz. Also happy to run additional configs on the 3080 if useful — it's idle and the card is at your table's disposal.

— Independent repro on ubuntu-server (RTX 3080 10GB, Ubuntu 24.04, driver 595.84), 2026-09-24/25

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions