Skip to content

feat: support rust gpu - #928

Open
drbh wants to merge 10 commits into
mainfrom
rust-gpu-support-2
Open

drbh wants to merge 10 commits into
mainfrom
rust-gpu-support-2

Conversation

@drbh

@drbh drbh commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator

this pr adds a rust-cuda backend where the kernel is a single crate compiled with cuda-oxide. its an alternative to #907, opened separately so the two approaches can be compared

similar to nvcc -gencode the crate is built once per capability in cuda-capabilities (same CUDA_KERNEL_ARCHS default as cuda)

  • each pass sets cfg(cuda_arch = "XX") for its capability and every lower one, so #[cfg(cuda_arch = "90")] acts like __CUDA_ARCH__ >= 900
  • each pass's ptx is compiled to sass with ptxas and packed into a fatbin in .nv_fatbin so cuobjdump can inspect it
  • the embedded ptx (.oxart) is stripped so nothing is jit compiled at load. +PTX ships that capability's ptx like cuda does
  • the new kernels-cuda crate loads the fatbin with cuModuleLoadData and launches on torch's current stream
  • cuda bindings come from https://github.com/drbh/cuda-bindings-prebuilt so bindgen is skipped

note: there can only be one rust-cuda component per extension and kernels should be loaded with kernels-cuda (the generated load doesnt link). build time also scales with the number of capabilities since its one cargo pass each (flash-attn2-rs is 787s for 5 caps vs 351s single pass)

this pr is dependent on NVIDIA/cuda-rust#1601 (CudaStream::borrow_raw) and pins a fork until that is merged

@HuggingFaceDocBuilderDev

Copy link
Copy Markdown

The docs for this PR live here. All of your documentation changes will be reflected on that endpoint. The docs are available until 30 days after the last update.

@danieldk
danieldk self-requested a review October 26, 2026 10:28
Some elementary functions (like `erff`) are not available yet, so
we need to use `__nv_<fun>`. However, we need to provide the libdevice
path through `CUDA_OXIDE_LIBDEVICE` to make it work.
We need to link against `__nv_*` symbols for some elementary functions.
However, host copies of the kernels continue to be referenced by the
launcher (even though they are never used), resulting in unresolved
`__nv_*` symbols for host functions. Weaken linkage to avoid this issue.
@github-actions

Copy link
Copy Markdown

Coverage report — kernels/

Measured on: Python 3.10 / Torch 2.13.0.
Other CI configurations are not included in this number.
Hardware-gated code paths (ROCm/XPU/NPU/Darwin/Windows) are excluded or unreachable on the Linux+CUDA runner.

Total coverage: 88.5% — threshold: 80% — ✅

Per-file breakdown
Name Stmts Miss Cover Missing
src/kernels/__init__.py 14 0 100%
src/kernels/_system.py 6 1 83% 10
src/kernels/_versions.py 130 14 89% 53, 59-60, 63-64, 102, 165-170, 199, 219
src/kernels/archs.py 56 1 98% 94
src/kernels/backends.py 215 63 71% 42, 46, 50-53, 70, 92, 110, 119, 123, 127-129, 150, 159, 163, 167-169, 190, 201, 203, 210-213, 222, 226, 230-255, 263, 286-306
src/kernels/compat.py 9 1 89% 5
src/kernels/deps.py 70 1 99% 56
src/kernels/digest.py 58 5 91% 71-73, 136-137
src/kernels/hf_hub.py 62 2 97% 21, 23
src/kernels/importer.py 74 5 93% 158, 162, 165, 179-180
src/kernels/install.py 21 7 67% 76-100
src/kernels/layer/__init__.py 7 0 100%
src/kernels/layer/_interval_tree.py 103 4 96% 23, 52, 147, 150
src/kernels/layer/device.py 48 12 75% 42, 47-49, 91, 96-98, 101, 149, 152, 156
src/kernels/layer/func.py 93 5 95% 94, 119, 195, 315, 390
src/kernels/layer/globals.py 5 0 100%
src/kernels/layer/inspect.py 27 0 100%
src/kernels/layer/kernelize.py 83 7 92% 306, 314-315, 321, 325, 341-343
src/kernels/layer/layer.py 320 14 96% 212, 259, 447, 606-607, 628, 636, 647, 688, 692, 705, 760, 801, 876
src/kernels/layer/mode.py 14 0 100%
src/kernels/layer/repos.py 136 36 74% 32, 35-42, 73, 86, 90, 99-100, 103, 106-109, 116-117, 120, 123-126, 133-134, 137, 140-143, 150-151, 154, 157-160, 235
src/kernels/load.py 71 2 97% 338, 378
src/kernels/locking.py 89 64 28% 35-83, 91-98, 102-125, 137, 152-159, 165-175, 179-186
src/kernels/python_deps.py 58 6 90% 59-60, 64-65, 101, 104
src/kernels/resolver.py 162 1 99% 248
src/kernels/status.py 50 2 96% 25, 79
src/kernels/validate.py 104 7 93% 9, 101, 172, 195-196, 232-233
src/kernels/variants.py 278 17 94% 65, 96, 117, 147, 256-257, 299-302, 304, 388-394, 400-406, 455-461
src/kernels/verify.py 102 6 94% 44, 170-172, 260-261
TOTAL 2465 283 89%

Updated by the Test kernels workflow on commit 90c61854d8fbc9e563f34859bc469d6fc66fc552.

@drbh drbh mentioned this pull request Oct 28, 2026
@drbh drbh changed the title feat: support rust gpu (alternative approach) feat: support rust gpu Oct 28, 2026

This branch has not been deployed

No deployments
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.

3 participants