Skip to content

Volta (sm_70) speed on strata-poly: measured GLM-5.3-Flash numbers + request for a Volta kernel path and --kv q8_0 for glm5next #88

Open

Description

@llollaalloll

Feature request: Volta (sm_70) path for strata-poly — tensor-core kernels + --kv q8_0 for glm5next

Follow-up to #73 (the kda_step_kernel launch-bound fix, 79d51a1, which we hit and bisected). With that fix the engine runs on our rig; this issue is about speed on the same hardware, and a request for the two repo gaps that cap it.

Hardware (what you don't have — reporting per COMMUNITY_BENCHMARKS.md)

  • 2x Tesla V100-PCIE 32GB (sm_70, ~897 GB/s, PCIe gen3, no NVLink) + 1x RTX 2080Ti 22GB (sm_75)
  • Xeon E5-2673 v3 x2 (24c/48t, Haswell, AVX2, no AVX-512), 2 NUMA nodes; 251 GiB RAM; Linux; driver 570.211.01, CUDA 12.8
  • Build: main as of 23 Oct (includes 79d51a1), -D CMAKE_CUDA_ARCHITECTURES=70;75

Model and measured numbers (what we measured)

GLM-5.3-Flash-REAP50-Q3_K_M.gguf, 78.78 GB (half routed experts pruned, 6,192 experts left, own draft/MTP block). 3-card --layer-split auto, 128K context, --vram-reserve-mib 2048:

  • experts resident: 85.7% in VRAM (rest through the CPU path)
  • decode, no-graphs: 34-35 tok/s
  • decode, CUDA graphs on: 37.8-44.9 tok/s
  • draft/MTP active, acceptance low in our runs (~1 of 2 guessed tokens kept)
  • 4-case bench against our production baseline: short 71% / mid 47% / tooljson 82% / reasoning 44%

Baseline for comparison, same rig, same day class: Qwen3.8-Flash-Next IQ3_XXS on the Strata project's own engine (v0.1.41 custom build, sm_70), 3-card split, experts 100% VRAM-resident: 75-97 tok/s decode. So poly-on-Volta runs at roughly half of what the same cards do for the Strata engine's expert path.

What we believe caps it (from reading the source; measurements not yet run per-request)

  1. STRATA_POLY_MMA is compiled out below sm_75 (src/poly/kernels.cu ~1646: __CUDA_ARCH__ < 750 -> 0), and tensor_cores() gates on ptxVersion >= 75 (~2150). Volta has tensor cores (m16n8k8 f16) but no ldmatrix; the poly flash-attention and MMA paths therefore fall back on our cards. Upstream Strata's own native_mmvq.cu already carries a measured Volta table (kIlRows_70[], read off a V100-SXM2 bench), so the project has proven Volta tuning — it just isn't in the poly kernels.
  2. --kv q8_0 is rejected for GLM (src/poly/engine.cpp ~991: "only supported for qwen35moe models in v1"). At 128K fp16 KV the residency headroom is what keeps 14.3% of experts off-card; q8_0 for glm5next would directly attack the expert-residency gap we measured (85.7%).
  3. The repo-seeded --expert-profile counts come from 5090 runs; we have not yet recalibrated on this rig (config work on our side, listed for honesty).

What we ask

  1. A Volta path for the poly kernels: enable the tensor-core step on sm_70 (m16n8k8 without ldmatrix, or a Volta-specific variant), and/or route poly expert GEMV through the already-tuned native_mmvq Volta table.
  2. --kv q8_0 (or the int8/int8k readers from poly: --kv int8 (and int8k) — a compute-native Q8_0 KV cache for qwen35moe and Gemma 4 #33/poly: --kv int8 and --kv int8k for Gemma 4, with the readers renamed apart from q8_0's #59) for glm5next.

We can run any A/B you want on real sm_70 hardware — we are likely the only Volta box reporting on this repo, and #87 shows the Pascal/Volta-adjacent paths are actively being worked. Happy to re-run the same 4-case bench against a same-day build with a candidate patch, and to post per-run JSON.

What we did not test

Activity

  1. VecSzn commented on Oct 25, 2026

    @VecSzn
    Collaborator

    Thanks for the numbers, neither are planned on my side right now, I don't have a V100 and GLM's KV cache is not laid out like Qwen3.6's, PRs are welcomed though, and it's your offer to A/B on the V100s that would let me take them.

  2. Csavoldi commented on Oct 26, 2026

    @Csavoldi

    Another 2x V100-PCIE-32GB box here (47 GB RAM, Xeon E5-2682 v4, no third card — our Qwen3.8 numbers and Docker recipe are in #95). Reading this issue pushed us to try the poly engine on Volta, so a small data point for the "it has not run on such a card" note in docs/OLDER_GPUS.md:

    strata-poly runs on Volta. Built from main (7b70075) per the docs with CUDA 12.9.1, -DCMAKE_CUDA_ARCHITECTURES=70 -DSTRATA_EXPERIMENTAL_SM60=ON, target strata-poly, and served Qwen3.6-35B-A3B UD-Q3_K_M split across both cards (context 32768, the setup default for this model).

    Baseline strata_bench medians, no fattn/fdec/gdn-mma (i.e. exactly the fallback paths this issue is about):

    test result
    chat decode 157.5 tok/s (135-196)
    chat first token 0.25 s
    4K prompt 2614.7 tok/s
    16K prompt 2778.3 tok/s
    agent decode / cache hit 134.2 tok/s / 68.5 %

    Two things we hit on the way, both being investigated:

    1. poly_attend_test dies with attention scores: cuBLAS status 1 on the V100 — inside attend_batch's cublasGemmStridedBatchedEx (fp16 in / fp32 out, DEFAULT_TENSOR_OP). The engine's own prefill through the same path works fine (a 14k-token prompt went through no problem), so it looks shape-specific rather than a broken Volta path; we're narrowing down which size crosses the line.
    2. Sanity-checked that the hardware path your kernel work would build on is real: mma.sync.aligned.m8n8k4 (in the exact 8-accumulator form qsa_prompt_attn.cu uses, with the fragment mapping documented there) and wmma 16x16x16 both compile under CUDA 12.9, execute correctly, and show HMMA.884 in SASS on driver 580.173.02. The mapping comment in qsa_prompt_attn.cu reproduced all 256 outputs of our probe exactly.

    Next on our side: a (256, 256, 64) row for the Volta fattn config table plus letting make_setup accept Volta (the dormant VOLTA_MMA_AVAILABLE branches in fattn_mma.cuh look reachable for Qwen3.6's 64-column tile), and after that a Volta arm for the GDN path modeled on the same m8n8k4 pattern. PRs to follow if the numbers hold up — happy to coordinate so we don't duplicate your A/B offer.

  3. llollaalloll commented on Oct 28, 2026

    @llollaalloll
    Author

    @Csavoldi — this is the rig behind the original post (2x V100-PCIE-32GB + 2080Ti-22GB, driver 570.211, CUDA 12.8). Your data point changes our plan: poly-on-Volta clearly has headroom when the model is fully resident.

    Our target, stated plainly: GLM-5.3-Flash-REAP50 within reach of our production baseline — Qwen3.8-Flash-Next IQ3_XXS on the Strata engine, 2-card split, experts 100% resident, int8 KV, 262K ctx = 132-134 tok/s decode on these same cards. Current poly numbers for GLM: 34-35 (no-graphs) / 37.8-44.9 (graphs), experts 85.7% resident on 3 cards.

    Two questions before we duplicate effort:

    1. Timeline on the Volta fattn PR ((256,256,64) row + make_setup accepting Volta + GDN arm): rough ETA? We'd rather A/B your patch than write a parallel one.
    2. Tile coverage: your dormant-branch note says the VOLTA_MMA_AVAILABLE path looks reachable "for Qwen3.6's 64-column tile". Does the same m8n8k4 pattern cover glm5next's attention/head shapes, or does GLM need its own table rows? (Our blocker list from the OP: STRATA_POLY_MMA gate at __CUDA_ARCH__<750, tensor_cores() ptxVersion>=75, --kv q8_0 rejected for glm5next.)

    Coordination offer, concrete: we can run your candidate branch against our fixed 4-case bench (short / mid / tooljson / reasoning, temp 0, nonce per request, per-run JSON posted) on real sm_70, same-day build, both 2-card (2x V100 only) and 3-card configs — including a --kv q8_0 A/B if your branch grows one. We are also the only box here that already bisected a poly kernel launch bug on Volta (#73 / 79d51a1e), so we can triage Volta-specific launch failures fast.

    One data request from our side: your 157.5 tok/s was Qwen3.6-35B-A3B (~23GB, fully resident on 2x32GB). Have you tried anything on the 60-80GB class where experts cannot all fit? That residency gap is our dominant cost and we want to know if your setup ever crossed it.

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