ci: build jit-cache wheels for CUDA 13.4 with 10.7a (Rubin/SM107) - #4577
Vinnie6167 wants to merge 1 commit into
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
Included review availability: Your plan provides up to 8 included reviews per hour; 7 remain after this review. 📝 WalkthroughWalkthroughChangesCUDA 13.4 JIT-cache release support
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: 🔵 Low · up to This PR adds CUDA 13.4 jit-cache builds for Rubin coverage, but raw 13.4 inputs should be verified to select the new cu134 artifact and the aarch64 wheel must be measured against the 2 GiB release-asset limit before publication. The change is mergeable with explicit maintainer follow-up on these bounded release risks. Possibly related issues
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
The published flashinfer-jit-cache wheels contain no SM107 code, so Rubin users hit "no kernel image is available for execution on the device" (flashinfer-ai#4363). The cu13.0 wheel ships sm_75 sm_80 sm_89 sm_90a sm_100a sm_103a sm_120f (+ sm_110a sm_121a on aarch64); sm_100a and sm_103a are architecture-specific and will not load on SM107, and there is no sm_100f family target to fall back to. Add a fourth CUDA to the jit-cache matrix rather than altering the existing ones. 13.4 is required, not merely preferred: nvcc gains compute_107 only in CUDA 13.4 (--list-gpu-arch: 13.2 no, 13.3 no, 13.4 yes). It cannot be backported to the cu13.0 tier, because the modules whose call sites do not pass map_sm107_to_100f emit -gencode=arch=compute_107a verbatim and would fail the build there. Setting 10.7a does two distinct things: - Modules built through the call sites that pass map_sm107_to_100f=True get -gencode=arch=compute_100f,code=sm_100f, because the bundled CUTLASS has no struct Sm107 yet (cutlass_supports_sm107()). Measured on a cu13.4 build of this tree: 820 of 1007 modules. - Everything else compiles native sm_107a (7 of 1007), and has_sm107 in aot.py flips true, which is what pulls in the four Rubin-only modules: fp4_quantization_107, fused_moe_trtllm_sm107, trtllm_gemm_sm107 and trtllm_low_latency_gemm_sm107. DOCKER_IMAGE needs no special case: it already interpolates matrix.cuda, so this resolves to pytorch/manylinux2_28-builder:cuda13.4 and pytorch/manylinuxaarch64-builder:cuda13.4, both published on Docker Hub since 2026-08-14 (pytorch/pytorch#192256). Also extends the hardcoded upload loop to 134. A matrix entry missing from that list builds successfully and is then silently never attached to the release. test-nightly-build deliberately stays at cuda 12.9/13.0: it runs on sm86 runners and consumes only x86_64 artifacts, so it cannot exercise SM107 either way. The cu12.8 / cu12.9 / cu13.0 arch lists are unchanged; only the new tier differs. Validation so far: a cu13.4 x86_64 wheel built from this tree is 1.790 GiB, 89.5% of GitHub's 2 GiB release-asset limit. The aarch64 figure is still being measured -- see the PR description. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
0fec835 to
575bfa1
Compare
Note
Prerequisite now met. This needs
pytorch/manylinux2_28-builder:cuda13.4andpytorch/manylinuxaarch64-builder:cuda13.4. Both are published on Docker Hub as of2026-08-14 (6.59 GiB and 6.89 GiB), built by pytorch/pytorch's
build-manywheel-images.ymlonmain(sha66c3e509) and rebuilt since — tags through-v2.14.0-rc4dated 2026-08-18. The x86 image config confirmsBASE_CUDA_VERSION=13.4with
/usr/local/cuda -> /usr/local/cuda-13.4. CUDA 13.4 support landed upstream inpytorch/pytorch#192256.
Two caveats worth a maintainer's view:
(
.ci/docker/common/install_cuda.sh::install_134notes 13.4 ships no runfile-localinstaller yet). If building official release wheels against a preview CTK is a
concern, better to say so before this merges.
the aarch64 wheel-size question further down is unanswered.
For the record, a public
nvidia/cuda:13.4would not have substituted here — glibc 2.39against the
manylinux_2_28tag these wheels declare with no auditwheel check(
flashinfer-jit-cache/build_backend.py::get_tag).📌 Description
The published
flashinfer-jit-cachewheels contain no SM107 (Rubin) code, so Rubin usershit
no kernel image is available for execution on the device.The cu13.0 wheel ships
sm_75 sm_80 sm_89 sm_90a sm_100a sm_103a sm_120f(plussm_110a sm_121aon aarch64).sm_100aandsm_103aare architecture-specific and will notload on SM107, and there is no
sm_100ffamily target to fall back to — so nothing inthe wheel runs on Rubin.
This adds a fourth CUDA to the jit-cache matrix rather than altering the existing
ones. CUDA 13.4 is required, not merely preferred:
nvccgainscompute_107only in13.4 (verified with
--list-gpu-arch: 13.2 no, 13.3 no, 13.4 yes). It cannot bebackported to the cu13.0 tier, because modules whose call sites do not pass
map_sm107_to_100femit-gencode=arch=compute_107averbatim and would fail the buildthere.
Setting
10.7adoes two distinct things, and both matter:map_sm107_to_100f=Trueget-gencode=arch=compute_100f,code=sm_100f, because the bundled CUTLASS has nostruct Sm107yet (cutlass_supports_sm107()). On a comparable internal build thatis 777 of 963 modules.
sm_107a(8 of 963 on that same build), andhas_sm107inaot.pyflips true — which is what pulls in the four Rubin-onlymodules:
fp4_quantization_sm107and theenable_rubin=Truevariants oftrtllm_gen_gemm,trtllm_low_latency_gemmandtrtllm_gen_fused_moe.Point 2 is why simply adding an explicit
10.0fentry to the existing cu13.0 builder isnot an adequate substitute — that would produce family cubins but leave those four
modules out of the cache entirely.
Changes
"13.4"inrelease.ymlandnightly-release.yml.>= 13.4tier inFLASHINFER_CUDA_ARCH_LIST:7.5 8.0 8.9 9.0a 10.0a 10.3a 10.7a 12.0f7.5 8.0 8.9 9.0a 10.0a 10.3a 10.7a 11.0a 12.0f 12.1afor cuda in 128 129 130→128 129 130 134. A matrix entrymissing from that hardcoded list builds successfully and is then silently never
attached to the release.
DOCKER_IMAGEneeded no change — it already interpolatesmatrix.cuda.test-nightly-buildis deliberately left at cuda 12.9/13.0. That job is the acceptancetest for these wheels: it installs the freshly built python/cubin/jit-cache artifacts,
sets
FLASHINFER_DISABLE_JIT=1so anything missing from the cache fails rather thansilently source-compiling, and runs the suite in 5 shards. It cannot cover SM107 today,
for two structural reasons that this PR cannot fix:
runs-on: [self-hosted, linux, x64, gpu, sm86, on-demand]— and there is no SM107 runner in public CI;
x86_64jit-cache artifact, so the aarch64 wheel is not exercisedby it at all today.
Adding a cu13.4 cell there would therefore cost build time without testing anything new.
The cu12.8 / cu12.9 / cu13.0 arch lists are byte-identical after this change; I resolved
the expression for all 8 matrix cells to confirm only the new tier differs.
❓ Open question for maintainers
Does the cu13.4 aarch64 wheel fit the 2 GiB release-asset ceiling? I have deliberately
not pre-empted this — the list above keeps
12.1a, matching cu13.0.Measured v0.6.17 release assets:
On an otherwise identical arch list, adding
10.7acosts roughly 0.34 GiB. That putscu13.4 x86_64 near 1.75 GiB (comfortable) but cu13.4 aarch64 near 2.0 GiB — right at
the ceiling this file already documents having hit (#3684 / #4519, which is why
12.1ais currently cu13.0-aarch64-only).
Worth weighing explicitly: #4363 is reported on aarch64 SM107 hardware, so aarch64 is
simultaneously the arch that most needs this wheel and the one at risk of not fitting.
Whatever gets trimmed to make room, it should not be
10.7a.Only a real cu13.4 build settles it. If it overshoots, dropping
12.1afrom the cu13.4aarch64 list is the obvious lever — sm121 users would stay on the cu130 wheel, which this
PR leaves untouched — but that is a maintainer's call about which architectures matter on
a Rubin-era stack, not something I wanted to decide silently.
🔍 Related Issues
Addresses #4363 (P0) — "CUDA 13/aarch64 JIT-cache package lacks SM107/10.7a coverage" —
which reports
no kernel image is available for execution on the devicefor the BF16paged-MLA specialization used by Kimi K3 (
head_dim_ckv=512,head_dim_kpe=64) onaarch64 SM107 under SGLang.
That issue's control experiment is what makes this a packaging fix rather than a kernel
one: uninstalling
flashinfer-jit-cache, settingFLASHINFER_CUDA_ARCH_LIST=10.7aandletting FlashInfer source-JIT the same operator passed numerical validation and completed
two-node TP8 Kimi K3 serving with full GSM8K accuracy. Source-build SM107 support landed
in #4122; this is its packaging counterpart.
I have deliberately not used a closing keyword, for two reasons:
until the cuda13.4 builder images exist and a release runs.
paged MLA without uninstalling the jit-cache. The harness for that already exists —
test-nightly-builddoes exactly this, viaFLASHINFER_DISABLE_JIT=1— but it runs onsm86 runners and consumes only x86_64 artifacts. Satisfying that half of the issue needs
an SM107 runner plus aarch64 artifact coverage in that job, which is separate work from
this PR.
Maintainers should feel free to add a closing keyword for that issue if you would rather
it auto-close on the release that first carries the wheel — I have avoided writing one
here so that merging this PR does not close it prematurely.
🚀 Pull Request Checklist
✅ Pre-commit Checks
pre-commitby runningpip install pre-commit(or used your preferred method).pre-commit install.pre-commit run --all-filesand fixed any reported issues.🧪 Tests
unittest, etc.).CI-only change; there is no unit test that exercises a release matrix. The validation
that matters needs the 13.4 builder image and is listed below — none of it has been run
yet, since the image does not exist:
nvcc --list-gpu-arch | grep compute_107inside the builder, both arches.cuobjdump --list-elfcensus over all modules: expectsm_107ain the ~8 modules thatdo not take the mapping,
sm_100fbroadly present, no other arch lost.has_sm107-gated modules are present by name.raises "no kernel image".
sm_100a/sm_103apaths unchanged.Reviewer Notes
The
FLASHINFER_CUDA_ARCH_LISTternary is now four tiers deep and close to itsreadability limit. I kept the in-idiom extension to minimise review surface, but a matrix
include:refactor that names the arch list per cell would be cleaner — happy to do thatinstead if you'd prefer.
Independently of this PR: once the bundled CUTLASS gains
struct Sm107, the ~13map_sm107_to_100f=Truecall sites switch fromsm_100fto nativesm_107aautomatically with no code change, per the comment in
compilation_context.py.Summary by CodeRabbit