Codex 与 Claude 定制 CUDA 核:技能驱动开发

我们构建了一个智能体技能(Skill),专门用于教会编码智能体如何编写可直接投入生产的 CUDA 核。然后,我们让 Claude 和 Codex 针对两个真实目标进行开发:一个是 diffusers 库的 LTX-Video 视频生成流程,另一个是 transformers 库的 Qwen3-8B 大语言模型。智能体为两者都生成了可工作的内核,包括正确的 PyTorch 绑定和基准测试,实现了端到端的自动化。
编写 CUDA 核很难。编写能正确集成到 transformers 和 diffusers 中的 CUDA 核更难。这里有特定架构的内存访问模式、向量化策略、Warp Shuffle 归约操作,以及十几个足以绊倒经验丰富开发者的集成陷阱。这恰恰是那种专业化、高风险、适合智能体技能大显身手的问题。
我们为编码智能体提供了它们所需的领域知识,例如:针对哪种 GPU 架构、如何构建一个内核构建器(kernel-builder)项目、何时使用共享内存而非寄存器、如何编写 PyTorch 绑定。剩下的工作由智能体完成。如果你用过 LLM 训练技能 或读过 《我们让 Claude 去教开源模型》,会对这个模式感到熟悉:将领域专业知识打包成技能,让智能体去解决问题。
为什么需要一个内核技能?
Kernel Hub 解决了定制硬件内核的分发问题。你可以通过一个简单的 get_kernel 调用从 Hub 加载预编译的内核,无需构建,无需配置标志。然而,仍然需要有人来编写这些内核。这个技能就是为了填补这个空白。
CUDA 内核开发涉及的知识面非常广:
- 针对每一代 GPU(如 H100、A100、T4)的硬件特定优化指南,它们有不同的计算能力、共享内存大小和带宽特性。
- 在库层面,
diffusers和transformers有不同的模块层次结构、归一化约定和集成模式。自定义内核需要在 PyTorch 中注册,才能被torch.compile识别。 - 在分发层面,内核可能依赖特定的 CUDA、PyTorch 和 Python 版本,这会产生庞大的环境矩阵。
这些领域知识往往散落在文档标签页和 Stack Overflow 的回答里。一个智能体技能可以将它们打包成可按需加载的上下文。
首先,我们来看看如何立即使用这个技能,然后再深入探讨我们是如何对生成的内核进行基准测试的。
安装技能
该技能随 kernels 库一起发布。只需一条命令即可将其安装到你的编码智能体中:
# 我们需要从 main 分支安装 kernels
pip install git+https://github.com/huggingface/kernels.git#subdirectory=kernels
kernels skills add cuda-kernels --claude
这会将技能放入 .claude/skills/cuda-kernels/ 目录,Claude Code 和 Cursor 会自动识别。对于其他智能体:
# Codex
kernels skills add cuda-kernels --codex
# OpenCode
kernels skills add cuda-kernels --opencode
# 自定义目标路径
kernels skills add cuda-kernels --dest ./my-agent/skills/
# 全局安装(在所有项目中可用)
kernels skills add cuda-kernels --global
# 覆盖现有安装
kernels skills add cuda-kernels --claude --force
安装完成后,就可以向你的智能体发出提示了:
为 transformers 库中的 Qwen3-8B 模型,构建一个面向 H100 的向量化 RMSNorm 内核。
或者,你可以提出更开放的要求:
为 transformers 库中的 Qwen3-8B 模型,构建一个面向 H100 的优化注意力内核。将其与 PyTorch 基线进行基准测试,并验证端到端性能的提升。
智能体可以读取技能,选择合适的架构参数,生成 CUDA 源代码,编写 PyTorch 绑定,设置 build.toml,并创建基准测试脚本。
如果你正在开发更复杂的内核,或者技能未涵盖的架构特定优化,该技能也提供了基础的构建块和模式供你起步。我们也欢迎对技能本身做出贡献。
技能包含什么?
该技能大约包含 550 个 Token 的结构化指导,外加参考脚本、GPU 优化指南、故障排除文档和完整的工作示例。像 Codex 和 Claude 这样的智能体编码工具可以读取这些内容,并生成一个可工作的内核项目。
它涵盖了:
- 针对 H100、A100 和 T4 的 NVIDIA GPU 架构感知优化(计算能力、内存带宽、共享内存大小、块大小调整)
- 针对
diffusers和transformers的集成模式,包括每个库特有的陷阱 - 支持 BF16、FP16 和 FP32 的向量化内存访问模式的内核模板
- 用于独立内核微基准测试和端到端流程比较的基准测试工作流
- 通过
get_kernel实现的 HuggingFace Kernel Hub 集成,用于加载社区内核
.claude/skills/cuda-kernels/
├── SKILL.md # 主要说明文件(约550个Token)
├── scripts/
│ ├── benchmark_example.py # 端到端基准测试模板
│ ├── benchmark_rmsnorm.py # 独立内核微基准测试
│ ├── ltx_kernel_injection_example.py # Diffusers 集成模式示例
│ ├── transformers_injection_example.py # Transformers 集成模式示例
│ └── huggingface_kernels_example.py # Kernel Hub 集成示例
└── references/
├── diffusers-integration.md # Diffusers 指南(含陷阱)
├── transformers-integration.md # Transformers 指南
├── huggingface-kernels-integration.md
├── h100-optimization-guide.md
├── a100-optimization-guide.md
├── t4-optimization-guide.md
├── kernel-templates.md
└── troubleshooting.md
当智能体加载这个技能时,它就获得了从“给我写个 RMSNorm 内核”到一个可构建、可基准测试的项目所需的一切。它会通过 grep 和 glob 在技能目录中查找相关文件和目录。因此,以易于查找的方式构建技能结构很重要。
智能体被指示按照 references/kernel-templates.md 中的模板生成内核,并生成一个完整的内核项目:
examples/your_model/
├── kernel_src/
│ └── rmsnorm.cu # 向量化 CUDA 内核
├── torch-ext/
│ ├── your_kernels/__init__.py
│ └── torch_binding.cpp # PyTorch C++ 绑定
├── benchmark_rmsnorm.py # 微基准测试脚本
├── build.toml # kernel-builder 配置
├── setup.py # pip install -e .
└── pyproject.toml
我们在两个真实目标上测试了这个流程。
内核基准测试:Diffusers (LTX-Video on H100)
智能体为 diffusers 库的 LTX-Video 视频生成流程构建了 RMSNorm、RoPE 3D、GEGLU 和 AdaLN 内核。完整示例位于 examples/ltx_video/。我们针对 H100 优化了 RMSNorm 内核。所有基准测试均在 H100 80GB HBM3 GPU 上以 BFloat16 精度运行。
如果你想查看生成的内核,请访问此示例。
独立 RMSNorm 基准测试
首先,我们将独立的 RMSNorm 内核性能与 PyTorch 基线进行比较。这是优化流程中的主要加速点。
| 形状 | 自定义内核 (ms) | PyTorch (ms) | 加速比 |
|---|---|---|---|
| [1x1024x2048] | 0.039 | 0.064 | 1.64x |
| [2x1024x2048] | 0.040 | 0.073 | 1.82x |
| [4x1024x2048] | 0.052 | 0.093 | 1.78x |
| [1x4096x2048] | 0.052 | 0.093 | 1.79x |
| [2x4096x3072] | 0.102 | 0.209 | 2.04x |
| [1x8192x2048] | 0.083 | 0.150 | 1.81x |
| [4x4096x3072] | 0.173 | 0.393 | 2.26x |
平均加速比:1.88倍,带宽效率达到 H100 理论带宽(3,350 GB/s)的 34.7%。
端到端视频生成 (49帧, 30步, H100 80GB)
接下来,我们比较优化内核与基线(无编译)以及 torch.compile 基线的端到端视频生成性能。
| 配置 | 时间 (s) | it/s | 加速比 |
|---|---|---|---|
| 基线(无编译) | 2.87 | 12.58 | 1.00x |
| 生成的优化内核 | 2.70 | 13.52 | 1.06x |
| 基线 + torch.compile | 2.14 | 19.05 | 1.34x |
| 优化内核 + torch.compile | 2.01 | 18.45 | 1.43x |
RMSNorm 在 LTX-Video 中约占总体计算量的 5%。剩余时间花在注意力机制、线性投影和 VAE 解码上。单一类型的内核带来 6% 的端到端加速,与这个计算分布是一致的。
内核基准测试:Transformers (Qwen3-8B on H100)
智能体为 transformers 库的 Qwen3-8B 大语言模型构建了一个 RMSNorm 内核,该模型在 32 层中包含 65 个 RMSNorm 模块。完整示例位于 examples/qwen3_8b/。我们针对 H100 优化了 RMSNorm 内核。所有基准测试均在 H100 80GB HBM3 GPU 上以 BFloat16 精度运行。
如果你想探索这个内核,请查看这里。
独立 RMSNorm 基准测试
我们再次将独立的 RMSNorm 内核性能与 PyTorch 基线进行比较。
平均加速比:1.94倍,带宽效率达到 H100 理论带宽(3,350 GB/s)的 22.3%。
| 形状 | 自定义内核 (ms) | PyTorch (ms) | 加速比 |
|---|---|---|---|
| [1x128x4096] | 0.040 | 0.062 | 1.58x |
| [1x512x4096] | 0.038 | 0.064 | 1.69x |
| [1x1024x4096] | 0.037 | 0.071 | 1.90x |
| [1x2048x4096] | 0.045 | 0.091 | 2.03x |
| [1x4096x4096] | 0.071 | 0.150 | 2.12x |
| [4x512x4096] | 0.056 | 0.093 | 1.67x |
| [8x256x4096] | 0.045 | 0.092 | 2.06x |
| [1x8192x4096] | 0.109 | 0.269 | 2.47x |
加速比随序列长度增加而提升:128 个 Token 时为 1.58 倍,8192 个 Token 时达到 2.47 倍。对于长上下文推理,自定义内核大约能将 RMSNorm 的延迟减半。
将你的内核发布到 Hub
智能体给你一个可工作的内核。Kernel Hub 让你可以分享它,这样任何人都可以在无需编译的情况下加载它。以下是从智能体输出到发布内核的完整路径。
1. 验证项目结构
智能体生成的项目已经遵循 kernel-builder 的布局:
your_kernel/
├── build.toml # 构建配置
├── kernel_src/
│ └── rmsnorm.cu # CUDA 内核源代码
└── torch-ext/
├── torch_binding.cpp # 注册 Torch 算子
└── your_kernels/
└── __init__.py # 包装 _ops 的 Python API
build.toml 告诉 kernel-builder 要构建什么。智能体会为你生成这个文件,包括针对目标 GPU 的正确 cuda-capabilities:
[general]
name = "your_kernels"
backends = ["cuda"]
[torch]
src = ["torch-ext/torch_binding.cpp"]
[kernel.rmsnorm]
backend = "cuda"
src = ["kernel_src/rmsnorm.cu"]
depends = ["torch"]
cuda-capabilities = ["9.0"] # H100
2. 使用 Nix 构建所有变体
Kernel Hub 的内核必须支持所有最近的 PyTorch 和 CUDA 配置。kernel-builder 的 Nix flake 会自动处理这个问题。将示例 flake.nix 复制到你的项目中并运行:
nix flake update
nix run .#build-and-copy -L
这会为每个必需的 PyTorch/CUDA 变体构建内核,并将结果放在 build/ 目录中。为了加速构建,可以启用 HuggingFace Nix 缓存:
nix run nixpkgs#cachix -- use huggingface
3. 创建 Hub 仓库并推送
在 Hub 上创建一个模型仓库并上传构建好的内核:
huggingface-cli repo create your-org/your-kernel --type model
huggingface-cli upload your-org/your-kernel ./build
4. 其他人只需一行代码即可加载
一旦发布,任何人都可以在零编译的情况下使用你的内核:
from kernels import get_kernel
rmsnorm = get_kernel("your-org/your-kernel")
get_kernel 会检测用户的 Python、PyTorch 和 CUDA 版本,并下载匹配的预编译二进制文件。无需构建,无需配置标志,通常几秒钟内即可就绪。
技能和 Hub 是互补的。技能负责开发。Hub 负责分发。用技能构建一个内核,用基准测试脚本验证它,发布到 Hub,它就成了所有人的一行代码。
我们开发了一个智能体技能(Agent Skill),专门教编程智能体如何编写生产级 CUDA 核函数。然后,我们让 Claude 和 Codex 瞄准了两个真实目标:一个 diffusers 流水线和一个 transformers 模型。智能体为两者都生成了可工作的核函数,包括正确的 PyTorch 绑定和端到端的基准测试。我们对这些核函数进行了基准测试,发现优化后的核函数在独立性能和端到端性能上都能带来加速。
相关资源
觉得有用?分享给更多人


