Skip to content

docs: RTX 2080 Ti, Quadro RTX 6000, V100, A40, RTX A6000, RTX 4500 Ada and A100 40 GB results; GTX 1080 Ti does not run - #27

Open
yugt wants to merge 4 commits into
RustingStudio:mainfrom
yugt:more-nvidia-cards
Open

yugt wants to merge 4 commits into
RustingStudio:mainfrom
yugt:more-nvidia-cards

Conversation

@yugt

@yugt yugt commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

Eight more NVIDIA cards from a second Slurm cluster, each benchmarked before and after calibrate on CUDA and Vulkan, plus the test suite, and one card that does not run. Docs only.

Runs at f47e370, Qwen3.6-35B-A3B-UD-Q2_K_XL.gguf, one GPU per job with 8 cores and 48 GB RAM, cargo test with --test-threads=1.

pp 4096 prefill / decode, tok/s ("MTP off" is the calibrated run with --mtp 0; "calibrated" uses the MTP that calibrate chose):

Card (driver) CUDA, MTP off CUDA calibrated Vulkan, MTP off Vulkan calibrated cargo test
A100-PCIE 40 GB (615.71.09) 5877 / 169 5510 / 275 5639 / 136 5267 / 223 185 passed
RTX A6000 (615.71.09) 5094 / 188 4814 / 329 5052 / 165 4782 / 252 185 passed
A40 (615.71.09) 4805 / 159 4579 / 289 4796 / 141 4539 / 222 185 passed
RTX 4500 Ada (615.71.09) 4934 / 153 4631 / 273 4979 / 142 4645 / 221 185 passed
Quadro RTX 6000 (615.71.09) 2795 / 122 2660 / 179 2719 / 109 2558 / 143 181 passed, 4 failed
RTX 2080 Ti 11 GB (615.71.09) 2714 / 140 2595 / 197 2630 / 126 1864 / 158 181 passed, 4 failed
V100-SXM2 16 GB (580.95.05) 3145 / 128 2965 / 193 1676 / 120 1598 / 170 181 passed, 4 failed
V100-SXM2 32 GB (580.95.05) 3118 / 121 2951 / 183 1665 / 116 1585 / 169 181 passed, 4 failed

The cards sit in hosts with different CPUs, so compare within a row. The model fits in VRAM everywhere except the 2080 Ti (8213-8712 experts resident, hit rate 99.7-99.9%).

Two things I ran into

1. Four Vulkan kernel tests fail on Turing too, not only on the V100. On the RTX 2080 Ti, the Quadro RTX 6000 and both V100s, f16_weight_uploads_as_f32, gemm_matches_reference_for_every_type, gemv_partial_superblocks_and_q2_0 and vulkan_type_matrix fail with relative errors around 5e-4. With STRATA_VK_F16_TRUNC=1 all four cards pass 185 of 185. The two Turing cards report cooperative matrices (f16 and int8) and run driver 615.71.09, the same driver on which the Ampere and Ada cards pass without the variable. So the truncating f16 conversion is not specific to the Volta driver; the comment at tests/kernels.rs:339 says it is. The Turing and V100 Vulkan rows say "Runs, test suite passes with STRATA_VK_F16_TRUNC=1" and note that the variable only changes what the tests expect.

2. A GTX 1080 Ti (Pascal, driver 580.95.05) runs on neither backend.

  • --backend vulkan: no usable Vulkan device 0 (0 usable; NVIDIA GeForce GTX 1080 Ti: missing shaderFloat16).
  • --backend cuda with NVRTC 12.6: the startup line is cuda device 0: NVIDIA GeForce GTX 1080 Ti, sm_61 (Volta, m8n8k4), then NVRTC compile of kernels.cu failed with default_program(2321): error: identifier "__nanosleep" is undefined.

The README said "Pascal and older use Vulkan" and SUPPORTED_GPUS.md said "Use --backend vulkan; not tested"; both now say what happens on this card, and the README's Vulkan requirements list shaderFloat16. cargo test on that card reports 185 passed only because every GPU test skipped (no usable Vulkan device, and that job had no NVRTC loaded), so I did not count it as tested.

Would you like a small separate PR for this: an early "sm_61 is not supported" error for devices below sm_70 instead of the NVRTC compile failure and the "Volta" label? I have not written it.

What is not in here

  • The STRATA_VK_F16_TRUNC=1 runs got the variable through sbatch --export=ALL; the logs do not echo it. Three of the four reruns landed on another node of the same card type than the run without it (the Quadro RTX 6000 was the same node).
  • All test runs were serial, so nothing new on the parallel vkDestroyDevice hang from A100, A30, L40S and H100: tested rows, results, and default-model test checks by file name #24.
  • Only Q2_K_XL: no Q8_0 or BF16 on this cluster.
  • The RTX A4000 and the Quadro RTX 5000 were not tested: the jobs did not get to run and were withdrawn.

Full tables (mean, min-max of 3 repetitions), what calibrate chose, hosts and startup lines are in docs/more-nvidia-results.md.

🤖 Generated with Claude Code

https://claude.ai/code/session_014eNPMupWL2tifApEBfcCgi

yugt and others added 2 commits November 11, 2026 10:56
…a, A100 40 GB results; GTX 1080 Ti does not run

Tested rows and calibrated benchmarks for eight cards on a second cluster,
the kernel tests that need STRATA_VK_F16_TRUNC=1 on Turing as well as Volta,
and what happens on a GTX 1080 Ti (neither backend runs).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014eNPMupWL2tifApEBfcCgi
Vasyl-Trefilov added a commit to yugt/RustingStrata that referenced this pull request Nov 11, 2026
gemm_f's h2 packed with packFloat2x16(f16vec2(..)), which the NVIDIA
Volta and Turing Vulkan drivers truncate toward zero. Build the pairs
from rh (software round-to-nearest) and packHalf2x16, so the f16 GEMM
sees the same operands as CUDA's __float2half on every device.

This removes the STRATA_VK_F16_TRUNC test escape hatch and makes the
cross-backend GEMM check strict again. It also merges the duplicate V100
rows and fixes the 2080 Ti resident-expert range from RustingStudio#27.
gemm_f's h2 packed with packFloat2x16(f16vec2(..)), which the NVIDIA
Volta and Turing Vulkan drivers truncate toward zero. Build the pairs
from rh (software round-to-nearest) and packHalf2x16, so the f16 GEMM
sees the same operands as CUDA's __float2half on every device.

This removes the STRATA_VK_F16_TRUNC test escape hatch and makes the
cross-backend GEMM check strict again. It also merges the duplicate V100
rows and fixes the 2080 Ti resident-expert range from RustingStudio#27.
@Vasyl-Trefilov

Vasyl-Trefilov commented Nov 11, 2026 •

Copy link
Copy Markdown
Member

Thanks, this is a really useful report. I pushed a fix to your branch: gemm_f now rounds f16 GEMM inputs in software (rh + packHalf2x16), so the Volta/Turing truncation is gone — STRATA_VK_F16_TRUNC and the test workaround are deleted. Also merged the duplicate V100 rows and fixed the 2080 Ti resident range. CI passes and the Vulkan kernel suite passes on an RTX 3060.
Two things:

  1. Can you re-run the 2080 Ti, Quadro RTX 6000 and both V100s without STRATA_VK_F16_TRUNC on the new commit? We can't test the truncating drivers here.
  2. Yes please, send the sm61 PR — early "requires sm70+" error plus fixing the device_log "Volta" label for Pascal.
    Heads-up: gemm_f.spv got ~18% bigger from the software conversion, so if prefill regresses on Turing/Volta we can gate it with a specialization constant.
    And please if it's possible, then run bigger models, Q2 for this kind of hardware it kinda pointless, it's like driving on a F1 car in city 40km/h

@yugt

yugt commented Nov 11, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the fix. Re-ran on ea4c8a8, no STRATA_VK_F16_TRUNC in the environment.

1. Test suite: all four cards pass without the variable.

GPU Driver cargo test at ea4c8a8
RTX 2080 Ti 615.71.09 185 passed, 0 failed, 5 ignored
Quadro RTX 6000 615.71.09 185 passed, 0 failed, 5 ignored
V100 16 GB 580.95.05 185 passed, 0 failed, 5 ignored
V100 32 GB 580.95.05 185 passed, 0 failed, 5 ignored

2. Vulkan prefill is 2-6% slower with the software conversion. Same bench as in the doc (Q2_K_XL, --pp 512,4096 --tg 128 --reps 3), on the same node as the f47e370 run (the nodes have several cards of the type, so it may be another card of the node). Calibrated, --mtp 0, mean (min-max) tok/s, f47e370 -> ea4c8a8:

GPU Backend pp 512 prefill pp 4096 prefill decode after 4096
RTX 2080 Ti Vulkan 1934.8 (1764.2-2051.2) -> 1888.1 (1863.0-1909.8), -2.4% 2629.7 (2608.8-2642.7) -> 2498.7 (2477.6-2510.2), -5.0% 126.3 -> 126.0
Quadro RTX 6000 Vulkan 1872.6 (1688.9-1977.9) -> 1784.5 (1715.7-1832.6), -4.7% 2719.4 (2715.7-2724.0) -> 2669.9 (2659.6-2675.8), -1.8% 109.0 -> 108.3
V100 16 GB Vulkan 804.6 (796.3-809.8) -> 756.9 (736.6-767.0), -5.9% 1676.3 (1675.2-1678.0) -> 1630.2 (1627.1-1632.7), -2.8% 119.7 -> 119.7
RTX 2080 Ti CUDA (control) 2023.3 -> 2020.3 2713.5 -> 2713.2 139.7 -> 139.7
Quadro RTX 6000 CUDA (control) 1978.4 -> 1978.1 2794.6 -> 2827.2 122.3 -> 122.4
V100 16 GB CUDA (control) 2253.3 -> 2251.5 3144.9 -> 3147.3 128.1 -> 128.1

The pp 4096 ranges do not overlap on any of the three, and CUDA on the same nodes is unchanged, so it is the shader and not the node. The calibrated MTP run on the V100 shows the same -2.9% at pp 4096 (1597.7 -> 1551.9). Decode is not affected. The V100 32 GB bench is still queued. Whether 2-5% of Vulkan prefill on Turing/Volta is worth a specialization constant is your call; I can re-measure if you add one.

3. sm_61: PR coming separately (early "requires sm_70" error and the device_log label), already run on the GTX 1080 Ti.

4. Bigger models: fair point. Q8_0 (37.8 GB) and BF16 (71.1 GB), the same files as in datacenter-nvidia-results.md, are running now on these cards at ea4c8a8. I will add them to more-nvidia-results.md in this PR when they finish, together with the re-run above.

…cards

RTX 2080 Ti, Quadro RTX 6000 and both V100s pass 185 tests at ea4c8a8 with the variable unset. Vulkan prefill at
pp 4096 is 2-5% lower than at f47e370 on the same nodes. Q8_0 bench on A100 40 GB, A40, RTX 4500 Ada, Quadro RTX
6000, RTX 2080 Ti and V100 16 GB.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014eNPMupWL2tifApEBfcCgi
@yugt

yugt commented Nov 11, 2026

Copy link
Copy Markdown
Contributor Author

Pushed docs: re-run at ea4c8a8 ... to this branch: the re-run above and Q8_0 on six cards (A100 40 GB, A40, RTX 4500 Ada, Quadro RTX 6000, RTX 2080 Ti, V100 16 GB), in docs/more-nvidia-results.md.

One correction to my comment above: the Quadro RTX 6000 re-run landed on another card of the same node, and CUDA pp 4096 moved +1.2% there, so its -1.8% on Vulkan is not evidence by itself. The RTX 2080 Ti (-5.0%) and V100 16 GB (-2.8%) hold: CUDA on those nodes moved by 0.0% and +0.1%.

Q8_0 in short (CUDA, pp 4096, --mtp 0; full table in the doc):

GPU Resident experts Hit rate Prefill tok/s Decode tok/s Calibrated decode
A100 40 GB 10240/10240 100% 6480 187 279 (MTP 1)
A40 10240/10240 100% 5397 126 180 (MTP 1)
RTX 4500 Ada 6482/10240 98.9% 1680 96 MTP 0 chosen
Quadro RTX 6000 5975/10240 98.0% 1307 88 127 (MTP 1)
V100 16 GB 3930/10240 90.1% 803 65 75 (MTP 1)
RTX 2080 Ti 2313/10240 75.4% 697 57 MTP 0 chosen

Still queued: Q8_0 on the RTX A6000 and V100 32 GB, the V100 32 GB bench re-run, and BF16 on the five larger cards (the first shard is still downloading). The sm_61 change is #28.

@Vasyl-Trefilov

Copy link
Copy Markdown
Member

@yugt I also worried about DeepSeekV4.1 1017 performance and it's popular big local MoE model so could you rerun on the same nodes, page cache warm, with as many cores as the scheduler gives (ideally 32) and a budget sweep near the card limit?

A100 80 GB: STRATA_DS_GPU=1 STRATA_DS_PROF=1 STRATA_DS_GPU_EXPERTS=60,64,68,70
H100 NVL 94 GB: STRATA_DS_GPU=1 STRATA_DS_PROF=1 STRATA_DS_GPU_EXPERTS=72,76,80,84
And other GPUs if possible

Same prompt and -n 128. Please report, per budget: end-to-end tok/s, VRAM hit rate, expert/attention ms, and read_bytes so we know the cache is warm. If you can, add a llama.cpp baseline on the same node/file/prompt (--cpu-moe, current build) so we know what the target is.
This will help a lot to improve RustingStrata, thank you

@Vasyl-Trefilov

Copy link
Copy Markdown
Member

@yugt I don't know what you do and why you have so much GPUs and etc. but what do you think if I will try to bring RustingStrata closer to vLLM, so people like you can use it to sell API and maybe it will be even better then vLLM, I just want to know if you need this and if yes, then I will try to make it

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.

2 participants