Hugging Face kernel-builder:构建和扩展生产就绪 CUDA 内核的指南

Hugging Face 已发布 kernel-builder 库,这是一套旨在简化自定义 CUDA 内核的创建、扩展和部署的工具。通过在多个 PyTorch 和 CUDA 版本之间自动化构建过程并与 Hugging Face Hub 集成,kernel-builder 使开发者能够从本地 GPU 函数转向稳健、可共享的生产系统,而无需处理依赖管理和构建时的复杂性。

现代 CUDA 内核的结构

构建生产就绪的内核需要对源代码、构建清单和环境可复现性进行结构化的处理。Hugging Face 推荐一种特定的项目结构,以确保与 kernel-builder 工具的兼容性:

  • build.toml: 项目清单,负责协调构建过程。
  • csrc/: 包含原始 CUDA 源代码。
  • flake.nix: 通过锁定构建器及其依赖的版本,确保可复现的构建环境。
  • torch-ext/: 包含用于 PyTorch 操作符的 Python 包装器和 C++ 绑定。

注册原生 PyTorch 操作符

与简单的 Python 绑定不同,kernel-builder 强调使用 TORCH_LIBRARY_EXPAND 宏将函数注册为原生 PyTorch 操作符。这种做法提供了两个关键的技术优势:

  1. torch.compile 兼容性:原生注册使 PyTorch 编译器能够“看到”该操作符,从而将其融合到更大的计算图中以降低开销。
  2. 硬件特定实现:开发者可以为同一操作符提供多个后端(例如 CUDA 和 CPU)。PyTorch 的调度器会根据输入张量的设备自动选择正确的实现。

构建与开发工作流

为确保可复现性,kernel-builder 使用 Nix shell。开发者可以进入一个带有特定 PyTorch 和 CUDA 版本的隔离沙箱(例如 nix develop .#devShells.torch27-cxx11-cu126-x86_64-linux),在本地编译和测试内核。build2cmake 命令用于生成必要的 CMake 和 Python 构建产物,随后可通过 pip install -e . 以可编辑模式安装内核,实现快速迭代。

分发与扩展

要让内核面向更广泛的社区使用,必须“合规”,即能够在所有受支持的 PyTorch 和 CUDA 版本上构建并运行。kernel-builder 工具通过 nix build . -L 自动化多版本构建流程。

Hugging Face Hub 集成

构建完成后,使用 kernels upload 命令或通过 Git LFS 将内核上传至 Hugging Face Hub。这样用户即可动态加载内核,而无需传统的安装步骤:

from kernels import get_kernel
optimized_kernel = get_kernel("your-username/optimized-kernel")

生产部署挑战

在生产环境中扩展自定义内核需要严格的版本管理和部署策略,以防止破坏下游依赖。

语义化版本和锁定

由于 Hub 仓库基于 Git,用户可以将内核固定到特定的提交哈希。然而,Hugging Face 建议使用语义化版本(如 v1.1.2 的 Git 标签)以实现平滑升级。

对于大规模项目,kernels 库通过 pyproject.toml 支持项目级管理。通过在 [tool.kernels.dependencies] 部分指定版本范围并运行 kernels lock .,开发者会生成 kernels.lock 文件。这确保项目的所有用户使用完全相同的内核版本,可通过 get_locked_kernel 加载。

运行时与部署优化

为避免在运行时下载二进制文件——这对 Docker 镜像和安全环境至关重要——kernels 库提供了预下载机制:

  1. kernels download .:此 CLI 命令会将 kernels.lock 文件中指定的所有内核下载到本地 Hugging Face 缓存中。
  2. load_kernel:此函数从本地缓存加载内核,如果二进制缺失则抛出异常,确保在应用执行期间不会出现意外的网络请求。

通过 Python Wheel 的遗留支持

虽然基于 Hub 的加载因其自动版本匹配和来源可追溯性而被首选,kernel-builder 仍支持通过 Python wheel 的传统部署方式。kernels to-wheel 命令可将 Hub 内核转换为针对不同 PyTorch、CUDA 和架构组合的一组 wheel,便于通过传统的 Python 包管理器分发。

Sources