用 Claude 生成 CUDA kernel 技能并迁移到开源模型
We Got Claude to Build CUDA Kernels and teach open models!
Hugging Face 博客介绍新工具 upskill,用大模型生成并评估 agent 技能,再交给小模型使用,在编写 CUDA kernel 任务上做了基准测试。
用教师模型生成 Skill 再迁移到小模型的完整流程,读者可据此评估自己场景下的迁移收益。
Agent skills 最棒的一点是,可以针对难题对 Agent 进行技能升级。看待这一点有两种方式:
- 你可以使用 Opus 4.5 或其他 SOTA 模型,去攻克最难的难题。
- 你可以使用在笔记本电脑上运行的模型,把它们升级到能处理更难的难题。在本篇博客中,我们将向你展示如何做到后者。
本篇博客将带你了解如何使用一个新工具 upskill,借助大模型生成和评估 Agent skills,并将其用于较小模型。我们将以diffusers模型编写 CUDA kernel 的任务来对 upskill 进行基准测试,但这一流程对于降低成本,或用较小模型处理困难和领域特定问题来说普遍有用。
什么是 Agent skills?
如果你还没听说过,Agent skills 正在席卷 coding agent 领域。事实上,它们是一个很直接的概念:用文件来定义模型上下文,比如用 markdown 写指令、用脚本写代码。这种文件格式使它们易于生成、分享和审查。简而言之,它们是跨模型和工具共享能力的实用媒介,在特定领域或难题上最为有用。而不是模型本来就能做好的事情。
本文通过使用 Claude 生成一个 Skill 文件来展示这一过程,该文件可供开源模型用于一项复杂且专门的任务:编写 CUDA kernel。 我们首先基于现有文档尝试了一个简单的 skill,发现它提升了部分模型的性能,但并非全部。事实上,对某些模型来说,它甚至可能降低性能或增加 token 用量。请查看下图,了解模型在有和没有基础 skill 时的性能表现。
现在,让我们来了解如何使用 upskill 对你的 Agent 进行难题技能升级,并衡量性能。
1. 让教师模型(Claude Opus 4.5)构建一个 kernel
首先,我们使用 Claude Code 以交互方式构建一个 kernel 并导出 trace。我们通过指导、验证和添加文档链接完成了这一过程。这个略显朴素的过程对于揭示模型最初的挑战很重要。事实上,你可以多次迭代:用 skill 的草稿版本尝试解决任务,并在较小模型上做实验。每一次,你都可以指示 Agent 改进该 skill,并在较小模型上测试它。
这是我们创建并一直用来构建 kernel 的 skill 示例。我们从这段 agent trace 开始,其中 Agent 能够构建一个 kernel,但也离不开一些帮助。
2. 从 trace 中制作一个 agent skill
一旦教师模型完成了任务,我们需要它来制作一个 skill。有多种有效的方法可以做到这一点。
- 在同一个会话中,指示 Agent 为它刚完成的任务创建一个 skill 文件。
- 在 Agent 会话中使用 Anthropic 的‘skill creator’ skill,或者结合导出的 trace 和新的 Agent 会话来使用。
- 使用
upskill工具基于该 trace 创建一个 skill。
大多数情况下,前两个选项会生成可用的技能。然而,具备该技能的智能体性能却是未知的。这正是 upskill 的用武之地,因为它还会根据 trace 为你的技能生成测试用例。然后它会比较两种情况下的结果:使用 trace,或应用技能。我们在下面看到,原始模型(Claude Opus)在有无技能的情况下表现相同。这意味着该技能针对这个模型捕捉到了任务。很好!
3. 把你的技能带到开源、更小或更便宜的模型上
最后,我们需要将新创建的技能转移到我们打算使用的工具或模型中。像 codex、cursor 和 opencode 这样的多数工具都已为技能统一采用了一种一致的格式,即位于 {agent}/skills/{skill_name}/SKILL.md 的目录,因此我们只需把技能目录复制到这个位置。
借助 upskill,我们可以将技能和一组模型传给 eval 命令,upskill 将在这些模型上分别在有技能和无技能的情况下运行测试用例,以比较性能。我们可以看到,该技能提高了一些开放模型的准确率,但并非所有模型。
在这种情况下,我们可能希望通过重新生成技能来进一步迭代 gpt-oss 技能。我们可以执行 upskill generate --from {skill}。
智能体技能远不止模型性能。通常智能体无论有无技能都能达到给定准确率,只是需要消耗更多 token 才能做到。对于重复性任务,我们希望优化智能体,使其用更少的 token 达到相同的准确率。下面的结果揭示了技能的另一个维度。一些模型显著降低了其性能 token 用量,而另一些模型在使用技能时反而消耗更多 token。例如,使用 moonshotai/Kimi-K2-Thinking 时,该技能在准确率和 token 用量方面明显有效。然而,对于 Claude Opus 4.5,性能没有明显提升,token 用量却增加了,因此你不希望将这一技能用于 Claude Opus 4.5。
tldr; 用你创建的技能来试用和评估模型。使用 upskill eval 或类似工具来评估模型在有技能和无技能情况下的性能。
以上就是为你的编码智能体在难题上进行技能提升的高层次端到端流程。现在像这样试用 upskill:
# install upskill
pip install upskill
# or use uvx
uvx upskill --help
# generate a skill based on an agent trace
upskill generate "write nvidia kernels" --from ./trace.md
# evaluate models on a skill
upskill eval ./skills/my-skill/ --model haiku --model sonnet
# generate skills for local models
upskill generate "parse YAML"
--model opus
--eval-model "unsloth/GLM-4.7-Flash-GGUF:Q4_0"
--eval-base-url http://localhost:8080/v1
深入教程:用智能体技能构建 kernel
我们对如何提升智能体的技能有了高层次的理解。现在让我们看看我们为编写 CUDA kernel 所解决的用例。
我们不只是想编写 kernel 代码,还想理解完整的 kernel-builder 工作流:项目结构、build.toml 配置、针对特定架构的优化,以及 PyTorch 绑定。本教程展示了 upskill 如何创建真正有效的经过验证的技能。
kernel-builder-cuda-kernels 技能教会 Claude 关于 CUDA 开发所需了解的一切:以哪种 GPU 架构为目标、如何组织 kernel-builder 项目、何时使用共享内存而非寄存器,以及如何编写 PyTorch 绑定。
有了这一技能,你可以告诉 Claude 诸如:
Build a fused LayerNorm + GELU kernel optimized for H100.
而 Claude 将创建完整的项目结构、CUDA 实现和构建配置——遵循 kernel-builder 所期望的确切约定。
这并非生成样板代码。该技能编码了领域专业知识:H100 使用计算能力 9.0,共享内存应对齐到 128 字节,异步内存复制需要 __CUDA_ARCH__ >= 900。这些需要花费数小时从文档中收集的知识,被打包成约 500 个按需加载的 token。
安装与设置
安装 upskill:
pip install upskill
# or use uvx for one-off runs
uvx upskill --help
设置你的 API 密钥:
export ANTHROPIC_API_KEY=sk-ant-...
export HF_TOKEN=hf_...
就这样。Upskill 默认使用 Anthropic Claude Opus-4.5 模型,但也支持通过 OpenAI 兼容端点将 OpenAI 和本地模型用作生成器。我们希望用更昂贵、更高质量的模型来生成技能,而用更小的模型来使用它们。像罗宾汉一样。
技能生成
让我们逐步演示生成一个技能,教智能体如何使用 HuggingFace 的 kernels 库构建 CUDA 内核。
生成技能
从清晰的任务描述开始:
upskill generate "build optimized CUDA kernels for PyTorch using HuggingFace kernel-builder"
上面我们使用了 upskill,但实际上它可以是任何智能体或聊天工具以及导出的轨迹。
upskill generate "write kernels" --from <agent-trace>.md
另外,我们也可以从现有技能开始并对其进行添加:
upskill generate "add more error handling and edge cases"
--from ./skills/kernel-builder-cuda-kernels/
upskill 会加载现有技能,应用你的改进,并重新评估以确保这些更改有所帮助。
upskill 会创建技能、生成测试用例、评估性能,并根据失败进行改进:
Generating skill with sonnet...
Generating test cases...
Evaluating on sonnet... (attempt 1)
60% -> 95% (+35%) OK
kernel-builder-cuda-kernels
Build optimized CUDA kernels for PyTorch using HuggingFace kernel-builder.
SKILL.md ~520 tokens
baseline ████████████ 60%
with skill ███████████████████ 95% (+35%)
Saved to ./skills/kernel-builder-cuda-kernels
基线显示模型在没有任何技能时的表现。“使用技能”的结果显示技能注入上下文后的表现。35% 的提升意味着该技能有效。
该技能按照 Agent Skills 规范保存为一个目录:
./skills/kernel-builder-cuda-kernels/
├── SKILL.md # Main instructions (~520 tokens)
└── skill_meta.json # Metadata and test cases
打开 `SKILL.md` 查看 upskill 生成的内容:
---
name: kernel-builder-cuda-kernels
description: Build optimized CUDA kernels for PyTorch using HuggingFace kernel-builder.
---
# Building CUDA Kernels with kernel-builder
## Overview
This guide explains how to create optimized CUDA kernels for PyTorch models
using HuggingFace's kernel-builder. It covers project setup, kernel implementation,
and building for specific GPU architectures like NVIDIA H100.
## Project Structure
project/
├── build.toml # Build configuration
├── kernel_src/ # CUDA kernel implementations
│ ├── attention.cu
│ ├── layernorm.cu
│ └── geglu.cu
└── torch-ext/ # PyTorch C++ bindings
└── torch_binding.cpp
## Build Configuration
Create `build.toml` to define your kernel package:
[general]
name = "diffuser_kernels"
backends = ["cuda"]
[general.cuda]
# H100 is compute capability 9.0
capabilities = ["9.0"]
...
在不同模型上评估
重要的测试是:这个技能是否能帮助本地或更便宜的模型构建内核?
# Start a local OpenAI-compatible server with a web UI:
llama-server -hf unsloth/GLM-4.7-Flash-GGUF:Q4_K_M
# Evaluate on local model (llama.cpp server)
upskill eval ./skills/my-skill/
--model "unsloth/GLM-4.7-Flash-GGUF:Q4_0"
--base-url http://localhost:8080/v1
Generating skill with sonnet...
Generating test cases...
Evaluating on "unsloth/GLM-4.7-Flash-GGUF:Q4_0"... (attempt 1)
40% -> 85% (+45%) OK
baseline ████████░░░░░░░░░░░░ 40%
with skill █████████████████░░░ 85% (+45%)
Saved to ./skills/kernel-builder-cuda-kernels
在 "unsloth/GLM-4.7-Flash-GGUF:Q4_0" 上提升 45% 意味着该技能成功地将领域知识从一个能力更强的模型迁移到一个更快、更便宜的模型上。能在较弱模型上工作的技能,在更强的模型上肯定也能工作。
这就是核心价值主张:用昂贵的模型创建技能,然后用廉价或本地模型部署这些技能。
upskill 中的评估是如何工作的
upskill 使用教师-学生方法来评估模型,其中教师模型为学生模型生成测试用例以供评估。
- 教师模型(Opus)生成技能
- 测试用例(Opus)根据任务描述自动生成
- 学生模型(本地)在有和没有技能的情况下进行评估
- 技能提升衡量改进程度
如果你将一个现有技能传给 upskill eval,它会为该技能生成测试用例并在这些用例上评估模型。测试用例是简单的输入/输出对,用于验证智能体是否理解任务:
{
"cases": [
{
"input": "Create a build.toml for a CUDA kernel targeting H100",
"expected": {"contains": "9.0"}
},
{
"input": "Write a basic CUDA kernel template with proper includes",
"expected": {"contains": "cuda_runtime.h"}
}
]
}
我们还可以测试一个技能在不同模型上的表现:
upskill eval ./skills/kernel-builder-cuda-kernels/
--model haiku --m kimi --runs 5
Evaluating kernel-builder-cuda-kernels across 2 model(s)
3 test case(s), 5 run(s) per model
haiku
Pass rate: 4/5 (80%) Avg assertions: 2.8/3
sonnet
Pass rate: 5/5 (100%) Avg assertions: 3.0/3
┏━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Model ┃ Pass Rate ┃ Avg Assertions ┃ Avg Tokens ┃
┡━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ haiku │ 4/5 │ 2.8/3 │ 1250 │
│ kimi │ 5/5 │ 3.0/3 │ 1890 │
└────────┴───────────┴────────────────┴────────────┘
这有助于你找到成本-性能的最佳平衡点:也许带技能的 Haiku 对你的用例来说已经足够好,从而节省大量 API 成本。
下一步
我们已经展示了 upskill 可以创建经过验证的技能,将领域专业知识从强大的模型迁移到更便宜的模型。内核构建技能只是可能实现的一个例子。
一些可以尝试的事情:
- 为你的内部工具生成技能
- 为你的代码库构建技能库
- 捕获团队内部知识
- 跨模型进行基准测试
这种方法适用于任何需要反复编写详细提示的专门任务。技能可跨 Claude Code、Codex、Cursor 以及其他支持 Agent Skills 规范的工具移植。
资源
来源:Hugging Face Blog · hf-mirror.com



