بنقرة واحدة
kernel-generator
Triton Ascend 算子代码生成 Skill — 根据 KernelBench 格式任务描述生成高性能 Triton Ascend 内核代码。支持首次生成和基于错误反馈的迭代优化。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Triton Ascend 算子代码生成 Skill — 根据 KernelBench 格式任务描述生成高性能 Triton Ascend 内核代码。支持首次生成和基于错误反馈的迭代优化。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
擅长在 Ascend NPU 平台上编写高效 Triton 算子的性能优化专家。 按照严格的顺序逐步优化 Triton 代码,每次只尝试一个优化点, 确保优化前后功能一致、精度一致。 ⚠️ 只能使用本 skill 规定的优化方式,禁止使用任何超出本 skill 之外的优化方式。
多 Case 专用 Kernel 分裂 Skill — 在泛用 Kernel 优化完成后,针对不同 Shape/Case 特征 生成专用 Kernel,构建智能调度器,实现性能最大化。失败自动回退到泛用 Kernel。
算子代码验证 Skill — 按照标准验证流程验证生成的内核代码。 创建验证项目文件,调用 scripts/verify.py 运行验证,验证通过后 调用 scripts/benchmark.py 进行性能测试并收集结果。
TileLang kernel 设计与实现专家 Skill。为 PyTorch Model 设计并实现自定义 TileLang kernel: 完成 block-level 设计、tile-level 设计,并生成 model_new_tilelang.py 调用自定义 TileLang kernel。
AscendC kernel 转译与实现专家 Skill。将 TileLang 设计转译为 AscendC kernel, 并生成 model_new_ascendc.py 调用 AscendC kernel。
测试用例精简专家 Skill。读取 `{output_dir}` 中与算子对应的 `.json` 文件, 对其中的输入 cases(JSON Lines 格式,每行一个 `{"inputs": [...]}` 对象)进行精简, 使 case 数量尽量不超过 10 个,同时保证覆盖度。
| name | kernel-generator |
| description | Triton Ascend 算子代码生成 Skill — 根据 KernelBench 格式任务描述生成高性能 Triton Ascend 内核代码。支持首次生成和基于错误反馈的迭代优化。 |
| argument-hint | 输入:op_name、task_desc(任务文件内容)、arch。 可选:sketch(算法草图)、previous_code、verifier_error、conductor_suggestion、user_requirements。 输出:包含 ModelNew 类的完整内核代码。 固定参数:backend=ascend、framework=torch、dsl=triton_ascend。 |
你的任务是基于以下固定配置生成优化的内核代码:
⚠️ 生成的代码必须是纯 Triton Ascend 实现,禁止退化成 PyTorch。
| 禁止操作 | 示例 | 原因 |
|---|---|---|
| torch 计算函数 | torch.matmul(x, w), torch.relu(x), torch.sum(x) | 必须在 @triton.jit kernel 中实现 |
| torch.nn.functional | F.softmax(x, dim=-1), F.linear(x, w), F.relu(x) | 必须在 @triton.jit kernel 中实现 |
| tensor 方法计算 | x.sum(), x.mean(), x.softmax(dim=-1), x.relu() | 必须在 @triton.jit kernel 中实现 |
| tensor 运算符 | x @ w, x + y, x * y, x / y | 必须在 @triton.jit kernel 中实现 |
| nn.Module 调用 | self.conv(x), self.linear(x), self.layer(x) | 必须在 @triton.jit kernel 中实现 |
| 允许操作 | 示例 | 说明 |
|---|---|---|
| buffer 分配 | torch.empty(shape), torch.zeros(shape), torch.ones(shape) | 用于存储 kernel 输出 |
| 形状操作 | x.view(...), x.reshape(...), x.permute(...), x.transpose(...) | 不涉及计算 |
| 元信息查询 | x.shape, x.dtype, x.device, x.numel() | 用于 grid 计算 |
| kernel 启动 | kernel[grid](...args) | 调用自定义 @triton.jit kernel |
# ❌ 错误 1:完全无 kernel,纯 PyTorch
def forward(self, x, w):
return torch.matmul(x, w)
# ❌ 错误 2:有 kernel 但 forward 未调用
@triton.jit
def matmul_kernel(...):
pass
def forward(self, x, w):
return torch.matmul(x, w) # kernel 定义了但没用
# ❌ 错误 3:混合实现(部分 kernel + 部分 torch)
def forward(self, x, w):
y = self.kernel[grid](x, w)
return y.sum(dim=-1) # ← 违规:tensor 方法计算
# ❌ 错误 4:tensor 运算符
def forward(self, x, w):
y = self.kernel[grid](x, w)
return y + 1 # ← 违规:+ 是 PyTorch 运算符
@triton.jit
def add_kernel(x_ptr, y_ptr, output_ptr, n, BLOCK_SIZE: tl.constexpr):
idx = tl.arange(0, BLOCK_SIZE)
x = tl.load(x_ptr + idx)
y = tl.load(y_ptr + idx)
output = x + y # ← 计算在 kernel 中
tl.store(output_ptr + idx, output)
class ModelNew(nn.Module):
def forward(self, x, y):
output = torch.empty_like(x) # ✅ 允许:buffer 分配
add_kernel[(1,)](x, y, output, x.numel(), BLOCK_SIZE=128) # ✅ 允许:kernel 启动
return output # ✅ 允许:直接返回 kernel 输出
你将获得以下信息:
Model 类)sketch) — kernel-designer 生成的算法草图(首次生成时由 workflow 传入)硬件规格(按 arch 选择对应文件):
| arch | 文档 |
|---|---|
| ascend910b4 | @references/hw-ascend910b4.md |
| ascend910b3 | @references/hw-ascend910b3.md |
| ascend910b2c | @references/hw-ascend910b2c.md |
| ascend910b2 | @references/hw-ascend910b2.md |
| ascend910b1 | @references/hw-ascend910b1.md |
| ascend910_9362 | @references/hw-ascend910-9362.md |
| ascend910_9372 | @references/hw-ascend910-9372.md |
| ascend910_9381 | @references/hw-ascend910-9381.md |
| ascend910_9382 | @references/hw-ascend910-9382.md |
| ascend910_9391 | @references/hw-ascend910-9391.md |
| ascend910_9392 | @references/hw-ascend910-9392.md |
@references/triton-ascend-fundamentals.md — API 参考、编程基础、Grid 配置、内存优化、性能优化、调试清单
@references/triton-ascend-examples.md — PyTorch + Triton Ascend 完整示例代码
根据算子类型,额外加载对应的参考文档:
| 算子类型 | 识别特征 | 加载文档 |
|---|---|---|
| Element-wise | add/mul/relu/sigmoid/tanh/gelu/exp/log/silu 等逐元素操作 | @references/triton-ascend-elementwise.md |
| MatMul | matmul/bmm/linear/gemm 等矩阵乘法 | @references/triton-ascend-matmul.md |
| Reduce | sum/mean/max/min/softmax/layernorm/logsoftmax 等归约操作 | @references/triton-ascend-reduce.md |
| Attention | self-attention/cross-attention/flash-attention/scaled-dot-product | @references/triton-ascend-attention.md |
| Sort/Select | nms 等排序选择操作 | @references/triton-ascend-sort-select.md |
| Interpolate | Interpolate等插值操作 | @references/triton-ascend-interpolate.md |
如果算子涉及多种类型(如融合算子),加载所有相关文档。
当传入了 sketch(kernel-designer 生成的算法设计草图)时,必须以草图为基础进行代码实现 ,充分利用其中的算法思路和优化策略。
如果没有传入 sketch,则根据 task_desc 自行设计实现方案。
当只有 op_name、task_desc 等基本参数时:
task_desc 中 Model.forward() 的参考实现ModelNew 类当用户要求修改已有代码时:
当上一轮验证失败时:
verifier_error,理解失败的具体原因conductor_suggestion 中的修复方向进行修改生成的代码必须是一个完整的 Python 文件,包含以下结构:
import torch
import torch.nn as nn
import triton
import triton.language as tl
# 其他必要的 import(如 torch_npu)
# Kernel 函数(一个或多个)
@triton.jit
def {op_name}_kernel(...):
# 高性能内核实现
...
# 新 Model 类
class ModelNew(nn.Module):
def __init__(self, <与原 Model 完全相同的参数>):
super().__init__()
# 与原 Model 相同的初始化逻辑
# 在此获取核心数(如需要)
def forward(self, <与原 Model 完全相同的输入>):
# 调用自定义 kernel
...
return output
| 约束 | 说明 |
|---|---|
类名 ModelNew | 必须使用 ModelNew,不能是 Model |
| 接口一致 | __init__ 和 forward 的签名必须与原 Model 完全一致 |
| 输出一致 | 输出的形状、数据类型必须与原 Model 一致 |
| 自包含 | 所有 kernel 函数和辅助函数必须定义在同一文件内 |
| 可执行 | 代码必须可以直接导入运行 |
| 无测试代码 | 不需要生成测试代码 |
| 权重一致 | 含随机权重的算子(Conv2d/Linear 等)必须通过固定种子确保权重一致 |
| 禁止 PyTorch 退化 | forward() 中所有核心计算必须在 @triton.jit kernel 中实现,禁止使用 torch./F./tensor 方法/tensor 运算符 |
当任务描述中的 Model 类包含 nn.Conv2d、nn.Linear、nn.ConvTranspose2d 等带可学习参数的模块,或者使用 torch.randn / nn.Parameter(torch.randn(...)) 创建随机参数时,必须在 ModelNew.__init__ 中通过固定随机种子来确保与原 Model 的权重完全一致。
原理:验证框架会在创建 Model 前调用 torch.manual_seed(0),再在创建 ModelNew 前再次调用 torch.manual_seed(0)。只要两者在 __init__ 内部以相同的顺序创建参数,就能获得完全一致的权重。
标准模式:
class ModelNew(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, ...):
super().__init__()
# 1. 固定种子 — 必须与验证框架中的种子一致 (0)
torch.manual_seed(0)
# 2. 按照原 Model 的**完全相同的顺序**创建模块并提取权重
# 确保随机数消耗顺序一致
conv = nn.Conv2d(in_channels, out_channels, kernel_size)
self.weight = nn.Parameter(conv.weight.clone())
self.bias = nn.Parameter(conv.bias.clone()) if conv.bias is not None else None
# 如果原 Model 还有其他随机参数(如 nn.Parameter(torch.randn(...))),
# 也必须在此按相同顺序创建
self.extra_bias = nn.Parameter(torch.randn(bias_shape))
def forward(self, x):
# 使用提取的权重调用自定义 kernel
return custom_conv_kernel(x, self.weight, self.bias, ...)
核心要点:
ModelNew.__init__ 的第一行必须调用 torch.manual_seed(0)Model.__init__ 完全一致(因为每次 torch.randn 调用会推进随机状态)nn.Module(如 nn.Conv2d)来获取权重,而非手动 torch.randn —— 这保证内部参数的 shape 和初始化方式一致Model 有多个含权重的模块,必须按原顺序逐一创建并提取重要:思考过程中请只做框架级别的分析和决策,例如:
不要在思考过程中写出完整的代码,完整代码只在最终输出中给出。