Skip to content

nix-builder: improvements in NCCL handling - #951

Merged
danieldk merged 7 commits into
mainfrom
nccl-2.32.3
Oct 30, 2026
Merged

danieldk merged 7 commits into
mainfrom
nccl-2.32.3

Conversation

@danieldk

@danieldk danieldk commented Oct 29, 2026 •

Copy link
Copy Markdown
Member
  • Use NCCL version to match the version that Torch was built with.
  • Ensure that a kernel can use NCCL by propagating it as a CUDA build input
  • Add an example kernel to check in CI that NCCL can be built against.
  • Provide mkNccl to easily construct NCCL derivations from Python wheels (hope to switch to CUDA manifests soon, but there are currently some clashing files).
  • Support passing an overlay to genKernelFlakeOutputs.

@danieldk

danieldk commented Oct 29, 2026 •

Copy link
Copy Markdown
Member Author

The latter change is much more general, but can be used by a kernel like DeepEP to pass a newer NCCL. For example:

{
  inputs.kernel-builder.url = "github:huggingface/kernels";

  outputs =
    { self, kernel-builder }:
    kernel-builder.lib.genKernelFlakeOutputs {
      inherit self;
      path = ./.;

      # This kernel needs NCCL 2.32.3 or newer, which is newer than the NCCL
      # that any of the supported Torch versions depend on.
      overlays = [
        (
          final: prev:
          let
            nccl = final.mkNccl {
              version = "2.32.3";
              wheels = {
                x86_64-linux.cuda13 = {
                  url = "https://files.pythonhosted.org/packages/5b/29/6b277e63c92d91f9cb4d1a3a554e148983de39d54baa652bb52c798af78e/nvidia_nccl_cu13-2.32.3-py3-none-manylinux_2_27_x86_64.whl";
                  sha256 = "1459723080ac889d73a26edfa3e04383a7928ab31ac8f0ec43b3ea9548b04ff3";
                };
                aarch64-linux.cuda13 = {
                  url = "https://files.pythonhosted.org/packages/58/0a/c29c302036a06d27dd732588f3fd8ee89b1f7b0087e38c668ae7be8ff7b2/nvidia_nccl_cu13-2.32.3-py3-none-manylinux_2_27_aarch64.whl";
                  sha256 = "a5bee92b2f4af218c109f8d221c3c9adcc752b94ae0ffcb0ed5abf9341a7724c";
                };
              };
            };
          in
          {
            pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
              (
                python-final: python-prev:
                prev.lib.mapAttrs (_: torch: torch.override { inherit nccl; }) (
                  prev.lib.filterAttrs (name: _: prev.lib.hasPrefix "torch-bin_" name) python-prev
                )
              )
            ];
          }
        )
      ];
    };
}

@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, 176-178, 266-267
TOTAL 2465 283 89%

Updated by the Test kernels workflow on commit 5821c964f7a7b0a557076dbe9d7704b5592608dd.

@drbh drbh left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm!

@danieldk
danieldk merged commit 11139cc into main Oct 30, 2026
53 of 59 checks passed
@danieldk
danieldk deleted the nccl-2.32.3 branch October 30, 2026 08:42
backends = ["cuda"]

[general.hub]
repo-id = "kernels-test/nccl-version"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this also exist in https://github.com/huggingface/kernels-test so that we also properly sign this in case an upload is needed? @danieldk

IlyasMoutawwakil added a commit to huggingface/kernels-community that referenced this pull request Nov 3, 2026
kernel-builder now gives every CUDA kernel the NCCL of its Torch build
(huggingface/kernels#951), with `mkNccl` and flake overlays to pick another
version. DeepEP 2.5 needs NCCL 2.32 APIs, newer than the 2.30.7 of
kernel-builder's Torch, so the flake overrides Torch's NCCL with 2.32.3 built
from the nvidia-nccl-cu13 wheels. Their headers are byte-identical to the 69
headers the recipe assembled from NCCL's Git sources, so the recipe no longer
vendors NCCL: the vendor, moves, version substitutions, include paths and the
header README go, and regenerate.py drops its --nccl input.

Bumps kernel-builder to 88e9dd07, which includes the NCCL support.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
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