ascend-kernel-generator
Generate, verify, and continuously improve AscendC custom kernels for user-specified operators using multi-kernel-bench.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Generate, verify, and continuously improve AscendC custom kernels for user-specified operators using multi-kernel-bench.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Ascend C Kernel Code Optimization Skill. 使用本地RAG知识库检索优化经验,对算子kernel代码进行迭代优化。 核心流程: 识别bottleneck -> 检索RAG -> 生成修改 -> 评估 -> 迭代 Trigger examples: "optimize kernel", "优化 kernel 代码".
Detect and fetch the latest “Ascend C算子开发” PDF from the Huawei Ascend CANN Community Edition documentation, download page for a user-specified version, then convert the PDF into chapter-level markdown files and save them under ascend_dev_guide_sections/.
生成面向华为 Ascend(昇腾)设备的 NPU 迁移流程,包括环境与版本校验、模型导出/编译生成 OM、INT8 校准与量化、部署验证以及精度/性能对比。Use when the user mentions NPU迁移、昇腾、Ascend、ATC、OM、MindIR、StreamManager,或谈到模型编译/量化、精度回归与延迟吞吐评估。
| name | ascend-kernel-generator |
| description | Generate, verify, and continuously improve AscendC custom kernels for user-specified operators using multi-kernel-bench. |
| metadata | {"short-description":"AscendC kernel generation, verification, and golden solution management.","version":"0.1.0"} |
This skill builds on multi-kernel-bench to generate, verify, and continuously improve AscendC custom kernels for user-specified operators.
The skill implements the following high-level loop:
add / mse_loss / matmul_add 等)examples/add.py 同格式的 AscendC kernel 工程描述文件。/verify,或其命令行客户端 scripts/verify.py)进行 编译 + 正确性 + 性能 验证。scripts/save_golden_solution.py,将实现固化到 reference/golden_solutions/。reference/docs/、reference/ref_repositories/ 等资料进行修复,并重复验证与固化流程。请不要在model_src,python_bind_src中实现计算逻辑或者直接调用torch库中的函数,如at::conv2d,而应该在kernel_src中的Compute()函数来实现计算逻辑,使用完全自研核函数来实现算子
Key directories for this skill:
examples/
add_torch_reference.py:Torch 参考实现示例。add.py:与 multi-kernel-bench 集成的 AscendC 自定义算子完整示例(包含 project_json_src、host_tiling_src、kernel_src 等)。scripts/
multi-kernel-bench/:Env、Backend 与 AscendC 编译/执行管线。save_golden_solution.py:将验证通过的实现保存到 reference/golden_solutions/ 并更新 info.json。verify.py:用于调用 HTTP 评测服务 /verify / /verify_stream,并在流式模式下将验证轨迹写入 traj.json。get_error_code_num.py:对 traj.json 中的每一条记录进行分类,统计报错代码数量与索引、正确代码数量与索引。get_code_diff.py:读取 traj.json,将错误代码与后续或最近的正确代码进行两两配对,生成 error_fix_pairs.json,每条记录包含 idx、code_pair_name、op、error_idx、correct_idx、error_code、code_diff、error、summary。get_content.py:给定 error_fix_pairs.json 路径和 idx,打印对应索引的完整内容,便于 Agent 阅读和总结。extract_error_fix_into_experience.py:给定 error_fix_pairs.json 路径、idx 与一段简短文字,将该文字写入对应 pair 的 summary 字段。save_fix_traj.py:从 error_fix_pairs.json 中抽取 {op, error, code_diff, summary},写入 skill_root/reference/issues/{op}.json,形成可长期复用的错误修复经验库。reference/
docs/:Ascend C / CANN / ACL 等官方文档与最佳实践的分片文本。
ascendc_dev_guide_sections/ascendc_best_practice_sections/acl_interface_ref_sections/ref_repositories/:开源仓作为算子模板与工程结构参考。
ascend-samples/cann-ops/ops-math/ops-nn/ops-transformer/golden_solutions/:已通过验证的 AscendC 实现(如 add.py、mse_loss.py 等)与 info.json。issues/:预留的错误与修复轨迹目录(由内部脚本维护,不直接暴露给用户)。template.md:单算子视角的 prompt 结构与工作流模板。本 Skill 可能以多种方式安装并被调用:
~/.claude/skills/ascend-kernel-generator/<workspace>/.claude/skills/ascend-kernel-generator/Skill 安装路径(记为 skill_root)用于存放内部记忆:
skill_root/reference/golden_solutions/:长期保存已通过验证的 AscendC kernel,实现能力增长。skill_root/reference/issues/:预留的错误与修复轨迹仓库(当前对上层接口隐藏)。在调用本 Skill 的任何脚本前,上游系统应先定位 skill_root,并建议注入环境变量:
ASCEND_SKILL_ROOT=<skill_root>如果未设置该环境变量,scripts/save_golden_solution.py 与 scripts/save_error_fix_traj.py 会自动将 skill_root 解析为:
skill_root = parent_dir_of(this_scripts_folder)这样,即使 Skill 被安装到不同位置,内部记忆始终相对于安装路径进行读写。
When the user invokes this skill, they should describe the desired operator. The model should first normalize this into a structured spec:
add, reduce_sum, leaky_relu, matmul_add。"math", "reduce", "activation", "matmul", "loss" 等。name, dtype, shape(是否可变)、layout(NCHW / ND / ...)、broadcast / reduce 规则。name, dtype, shape 与输入的关系。softmax, log_sum_exp)。该结构化信息既用于 Torch 参考实现,也用于 AscendC kernel 设计与 project_json_src 描述。
目标:将算子需求转写为 可执行的 Torch 参考实现。若用户给定一个torch的参考实现,则将该实现参考给定结构来进行修改;若用户已经给出符合结构(包含Model、get_inputs、get_init_inputs)的torch实现,则改名之后直接使用,同时后续严禁对该文件进行修改。
./<op>_torch_reference.py(或 <user_output_dir>/<op>_torch_reference.py)examples/add_torch_reference.py 的结构:
Model(nn.Module) 或 ModelNew(nn.Module),在 forward 中实现算子逻辑。get_inputs():根据算子规格生成随机输入张量列表。get_init_inputs():初始化所需的额外张量/参数。要求:
在完成 Torch 参考实现后,模型需要输出一个 详细的算子设计说明,包括:
examples/add.py / reference/golden_solutions/add.py 中的 project_json_src 格式。nameparam_type(required / optional)format(如 "ND", "NCHW" 等)type(float, half, int32 等)host_tiling_src:tiling data 结构、BLOCK_DIM、TILE_NUM 等策略(可参考 add 与 ascend-samples/operator/)。host_operator_src:InferShape / InferDataType 实现与 op 注册逻辑。kernel_src 中的类与核函数原型(如 KernelAdd + add_custom)。Init / CopyIn / Compute / CopyOut。AscendC::GlobalTensor, AscendC::LocalTensor, AscendC::TPipe, AscendC::TQue, AscendC::Add 等。python_bind_src:TORCH_LIBRARY_IMPL 与 PYBIND11_MODULE 的注册逻辑。model_src:ModelNew 中调用 custom_ops_lib.<op_name> 的方式。重要约束(禁止 hack 实现):
- 模型在生成Ascendc算子代码中的
model_src以及python_bind_src时,不得直接依赖 Torch 的高阶 API / 预构建算子(例如torch.nn.Linear、torch.matmul等)来「偷跑」算子逻辑;- 需要将算子核心计算拆解为自定义 AscendC kernel,并通过
custom_ops_lib中的函数在ModelNew里进行调用;- 当需要初始化权重时,参考下面的方式在ModelNew中初始化;
class ModelNew(torch.nn.Module):
def __init__(self, ...):
super(ModelNew, self).__init__()
...
self.conv2d = torch.nn.Conv2d(...)
...
def forward(self, x: torch.Tensor) -> torch.Tensor:
return custom_ops_lib.xxx(x, self.conv2d.weight,...)
在这一阶段,模型应使用 bash / grep / ripgrep 等工具检索相似算子以做参考:
reference/golden_solutions/*.pyreference/ref_repositories/ascend-samples/reference/ref_repositories/cann-ops/reference/ref_repositories/ops-math/reference/ref_repositories/ops-nn/reference/ref_repositories/ops-transformer/示例命令(由上游工具执行,在仓库根目录下):
rg "AddCustom" reference -n
rg "reduce_sum" reference/ref_repositories -n
核心产物:一个与 examples/add.py / reference/golden_solutions/add.py 格式一致的 Python 文件,包含以下全局变量:
project_json_srchost_tiling_srchost_operator_srckernel_srcpython_bind_srcmodel_src推荐输出位置(应位于用户当前目录或用户指定目录):
./<op>.ascendc.py 或 ./tmp/<op>.py约束:
project_json_src 中的 op 名称与自定义 op 工程内的类/函数名相匹配(如 AddCustom / add_custom)。DataCopy、Add、Mul 等算子 API 的使用方式生成 Torch 参考实现和 AscendC kernel 描述文件后,需要对实现进行 编译 + 正确性 + 性能 验证。
在推荐的部署形态下,评估由一个独立的 HTTP 评测服务 驱动,该服务封装在 scripts/multi-kernel-bench/verify_server.py 中,
对外暴露统一的 /verify 接口,内部仍然调用 multi-kernel-bench 的 Env 管线。上游系统通常不直接操作 HTTP,而是通过命令行客户端 scripts/verify.py 进行封装调用。
重要约束(禁止直接执行底层 multi-kernel-bench 校验脚本):
scripts/verify.py,其内部再调用 HTTP 服务 /verify。scripts/verify.py(推荐)为了方便在命令行或简单脚本中调用 HTTP 评测服务,本仓库提供了一个轻量客户端,上游推荐统一通过该脚本完成评估调用:
scripts/verify.pyurllib,通过 HTTP 调用 /verify。--op:算子名称,例如 add、mse_loss;--reference_path:Torch 参考实现文件路径,例如 examples/add_torch_reference.py;--kernel_code_path:AscendC kernel 描述文件路径,例如 examples/add.py;--url:可选,HTTP 评测服务地址,默认 http://127.0.0.1:23457/verify,可通过环境变量 ASCEND_VERIFY_URL 覆盖。若与 --stream 一起使用,且 URL 以 /verify 结尾,会自动切换到 /verify_stream。--stream:可选,启用流式接口 /verify_stream,实时接收评测日志(NDJSON 协议)。若未显式传入 --stream,但 --url 或 ASCEND_VERIFY_URL 以 /verify_stream 结尾,客户端会自动启用流式模式。--result_json_path:最终评测结果 JSON 的保存路径。示例用法(在仓库根目录):
python scripts/verify.py \
--op add \
--reference_path examples/add_torch_reference.py \
--kernel_code_path examples/add.py \
--stream \
--result_json_path ./add_verify_result.json
该脚本仅作为 HTTP 服务的客户端封装,不直接参与 multi-kernel-bench 的内部逻辑,符合本节前述“所有验证通过统一评估接口触发”的约束。
当通过 HTTP 服务 /verify(或命令行客户端 scripts/verify.py)返回成功(exit_code=0 且 correctness=True)时,Agent 应主动调用 scripts/save_golden_solution.py 将当前实现固化到 Skill 安装目录下的内部记忆 中。
重要:虽然 scripts/verify.py 在验证成功时会自动尝试保存 golden solution(通过内部调用 save_golden_solution.py),但为了更好的功能解耦和流程控制,强烈推荐 Agent 在验证成功后显式调用 save_golden_solution.py。
# 由上游系统预先导出 ASCEND_SKILL_ROOT 指向本 Skill 的安装路径
export ASCEND_SKILL_ROOT=/path/to/ascend-kernel-generator
python "$ASCEND_SKILL_ROOT/scripts/save_golden_solution.py" \
--op <op_name> \
--result_path <验证结果JSON文件路径> \
--kernel_code_path <算子的ascendc实现文件路径> \
--reference_path <算子的torch实现文件路径>
该脚本会(相对于 skill_root 操作):
skill_root/reference/golden_solutions/<op>.py。skill_root/reference/golden_solutions/info.json 中记录:
performance:性能指标hardware:硬件信息saved_at:保存时间戳ref_path:相对路径(如果提供了 --reference_path,当前版本中此字段被注释)golden solutions 将作为下一次算子生成与修复时的优先参考项。
当验证失败(exit_code!=0)时,进入 错误分析–修复循环。
基于 compile_info / correctness_info 中的关键信息,使用 grep/rg/bash 检索:
reference/golden_solutions/*.pyreference/ref_repositories/ascend-samples/reference/ref_repositories/cann-ops/reference/ref_repositories/ops-math/reference/ref_repositories/ops-nn/reference/ref_repositories/ops-transformer/reference/docs/ascendc_dev_guide_sections/reference/docs/ascendc_best_practice_sections/reference/docs/acl_interface_ref_sections/模型应输出 三段式分析:
然后在原始 AscendC 描述文件中进行 最小必要修改,避免完全重写。
在多次尝试修复同一算子的过程中,scripts/verify.py 的流式模式会将每次尝试的代码与结果追加到 traj.json 中(参见 verify.py 中对 traj 的写入逻辑)。基于该轨迹文件,本 Skill 提供了一套标准化的错误修复经验抽取流程:
统计错误/正确代码分布
使用:
python scripts/get_error_code_num.py --traj_path /path/to/traj.json
构造错误-正确代码配对与差异
使用:
python scripts/get_code_diff.py --traj_path /path/to/traj.json --output ./error_fix_pairs.json
{"idx", "code_pair_name", "op", "error_idx", "correct_idx", "error_code", "code_diff", "error", "summary": ""}error_fix_pairs.json;code_diff 为统一 diff 文本,error 尝试从验证结果中的错误信息/原因字段中抽取,summary 初始为空字符串。按需查看单条错误-修复 pair 内容
使用:
python scripts/get_content.py --json_path ./error_fix_pairs.json --idx <k>
idx 打印 error_fix_pairs.json 中的某一条记录,方便 Agent 阅读 error_code、code_diff 与 error 等字段。撰写精简的错误修复总结 summary
对于每一条值得保留的错误-修复 pair,Agent 应基于第 3 步的输出,总结一段简短、可复用的文字描述(错误原因+错误分析+修复方案)。
然后调用:
python scripts/extract_error_fix_into_experience.py \
--pairs_path ./error_fix_pairs.json \
--idx <k> \
--summary "<short_fix_summary>"
将该 summary 写入对应 pair 的 summary 字段中。
固化为 issues 经验库条目
当对当前 error_fix_pairs.json 中的若干条 pair 完成 summary 填写后,调用:
export ASCEND_SKILL_ROOT=/path/to/ascend-kernel-generator
python scripts/save_fix_traj.py \
--op <op_name> \
--pairs_path ./error_fix_pairs.json
该脚本会:
ASCEND_SKILL_ROOT(或自动推断安装根目录);{op, error, code_diff, summary} 结构;skill_root/reference/issues/<op>.json,作为后续算子生成/修复阶段可检索的经验。通过上述步骤,可以在不污染用户工作目录的前提下,将多次失败→成功的修复过程沉淀为结构化经验,用于指导后续同类算子的自动修复与生成。
最终会话结束前,无论生成成功与否,都需要清理 skill_root/scripts/multi-kernel-bench/tmp 目录。但用户路径下的内容要进行保留。
使用脚本一键清理:
python3 skill_root/scripts/cleanup_tmp.py