已开启
[RFC]: 三方 triton 算子迁移补充ATK测试用例并进行性能优化 #33
QianZH97创建于 17 天前
17 天前 添加了label:rfc
17 天前 关联了看板:MindSDK版本issue看板
17 天前 修改了issue 的描述
17 天前 修改了issue 的描述
17 天前 修改了issue 的描述
此处折叠了56条消息 查看更多
12 天前 关联了pull request:[feat][ops] 修改部分测试用例报错
12 天前 关联了pull request:[fix]修复已迁移算子实际运行时出现的问题
12 天前 关联了pull request:[feat] triton_dense_to_jagged性能测试用例替换
状态(Status): Draft
作者(Authors): @QianZH97
创建日期(Created): 2026-09-16
更新日期(Updated): 2026-09-17
相关 Issue/PR: #123、#128
1. 概述
1.1 简介
本提案旨在将 GPU 三方仓(recsys-examples、FBGEMM)中沉淀的典型推荐领域 Triton 算子迁移至 ops-rec 的
experimental/triton/atk_test目录,为每个算子补充完善的 NPU / GPU 双端 ATK 精度与性能测试用例,并在 NPU 侧通过 autotune 等策略完成性能优化与基线固化。本提案同时定义了「源算子 → 双端 ATK 用例 → 性能优化 → 基线固化」的可持续迁移规范,后续新增三方 Triton 算子按此模板持续迁移。1.2 动机
使用场景 / 用例
推荐系统(含生成式推荐)模型训练与推理链路大量依赖社区 Triton 算子,典型算子包括 jagged/dense 不规则张量转换、变长 Flash Attention 及其反向(dk / dv / dbias)等。这些算子上游主要源自 NVIDIA 推荐生态的两大三方仓:ecsys-examples 和 FBGEMM。将这类算子迁移至 ops-rec,可补齐昇腾平台推荐场景的 Triton 算子能力,并复用到 RecSDK 等的推荐模型链路中。
当前痛点
必要性与用户价值
若不立项,三方 Triton 算子迁移将停留在「每次迁移凭经验手工组织、无规范可依、无基线可查」的状态:新算子落地成本高、命名与目录组织杂乱、性能优化收益不可量化。完成后可形成一套可复制的迁移模板,显著降低后续算子迁移成本,并为每个算子沉淀永久可追踪的双端精度基准与性能基线。
不做此提案的影响
昇腾推荐场景的 Triton 算子生态适配持续依靠零散人工迁移,无法规模化吸收社区算子红利;算子性能优化(autotune 等)缺少统一的迁移规范与可量化的性能基线。
1.3 目标
目标:
非目标(边界):
约束说明:
2. 用例分析
generate_<op_name>.py+<op_name>.yaml生成全组合精度用例,NPU 端 kernel 与 GPU 端原版 kernel 逐用例对比atk case/atk node自动化执行;可靠性:NPU/GPU 结果一致<op_name>_performance.json固化 shape,NPU 端 autotune 优化 kernel 与 GPU 端对照,读取性能数据atk node重复执行对比收益atk server与 NPU 端atk node双机可用3. 方案设计
3.1 总体方案
3.1.1 整体设计思路
以「原版 kernel 保留 + NPU 优化 kernel 独立文件 + 双端 ATK 用例」为核心思路:GPU 侧保留原版 Triton kernel 作为精度/性能的对照基准(不优化、不做 autotune),NPU 侧提供适配昇腾硬件并经 autotune 等策略优化后的 kernel,两者通过一致的 ATK API 封装接入 ATK 框架,实现跨端精度对比与性能基准测试。
3.1.2 迁移目录规范
在
experimental/triton/atk_test下,以 Triton 算子名命名文件夹,文件夹内包含npu_atk_test与gpu_atk_test两个子目录:各产物职责说明:
<op_name>.py(kernel)@triton.autotune等包装,num_warps/BLOCK_*等参数自动选优)<op_name>_api.py@register注册算子、继承BaseApi,实现 run/compare 逻辑,调用同目录 kernel。GPU 侧与 NPU 侧均必须放置<op_name>.yamlname/api_type/triton_api_type/generate/standard等字段,可声明triton_name指定调用原版 kernel 名)generate_<op_name>.py<op_name>_performance.jsonperformance_device任务的输入README.md3.1.3 源算子与产物放置
gpu_atk_test/放置原版 Triton 算子文件以及 ATK 调用测试的 api 文件。npu_atk_test/放置:<op_name>.yaml+generate_<op_name>.py);<op_name>_performance.json,性能基线数据随算子一并入库);<op_name>.py,BLOCK_*/num_warps等策略自动选优);<op_name>_api.py),同时作为 NPU 侧精度/性能任务的执行入口。3.1.4 里程碑
gpu_atk_test→ NPU 适配优化 kernel 落盘npu_atk_test→ 精度/性能用例生成与固化 → README 记录来源」逐算子迁移,NPU 端 kernel 以 autotune 完成基础调优3.2 技术选型
2. 目录清晰、天然支持跨端对比
3. 单算子模板可复制
arbitrary_func类自动化流程尚未沉淀为通用能力3.3 功能与性能设计
3.3.1 NPU 端 kernel 性能优化
NPU 侧以
@triton.autotune包装 kernel,将BLOCK_T/BLOCK_L/BLOCK_D/num_warps等策略参数纳入自动选优,grid 从META中读取BLOCK_T等动态计算:# NPU 端示例(autotune 策略): # 以变长 Flash Attention 反向 dk kernel 为例 @triton.autotune(configs=_JAGGED_DENSE_FLASH_ATTENTION_BWD_DK_AUTOTUNE_CONFIGS, key=["..."] ) def _jagged_dense_flash_attention_bwd_dk_kernel(...): ...优化策略要点:
BLOCK_T ∈ {16, 32, 64, 128}、BLOCK_L ∈ {16, 32}、num_warps ∈ {1, 2, 4, 8}等组合,覆盖典型 shape。3.3.2 数据模型(ATK 用例文件)
<op_name>.yamlname、api(pytorch)、version、api_type、triton_api_type、triton_name、generate、dtype_numbers、outputs、standard(如acc: single_bm)等generate_<op_name>.pyseq_offsets单调递增整数、ind_offsets可选非负整数等<op_name>_performance.json3.3.3 影响范围
仅影响 ops-rec 仓库
experimental/triton/atk_test/下的目录结构与文件,不涉及 AscendC 静态算子、Python 包ops_rec/打包逻辑、构建系统build.sh/ CMake。3.4 安全隐私与 DFX 设计
3.4.1 安全隐私设计
本提案所有 ATK 用例数据均为本地生成的随机 / 确定性张量,不涉及敏感业务数据、无越权访问与数据泄露风险,仅需遵循 ops-rec 现有安全规范(含
Copyright (c) Huawei Technologies Co., Ltd.许可头、Apache-2.0 License)。3.4.2 DFX 设计
兼容性:
可维护性:
可测试性:
atk case/atk node执行),GPU 端原版 kernel 作为对比基准;用例生成脚本确定性可重放。可靠性:
3.5 编程与调用设计
3.5.1 编程模型基本设计
开发环境设计:
set_env.sh环境变量)、PyTorch + torch_npu、triton + triton_ascend、ATK 工具; GPU 端: triton、ATK 工具atk case/atk server/atk node命令开发约束:
seq_offsets单调递增、首 0 尾sum_len)。可验收设计:
3.5.2 接口定义与设计
3.5.2.1
<op_name>.yaml(ATK 精度用例定义文件)npu_atk_test/<op_name>.yaml。输入参数:
name<op_name>一致apipytorchapi_typetriton_api_typetriton_namegenerategenerate_<op_name>dtype_numbersoutputsstandardacc: single_bmatk case -f <op_name>.yaml -p generate_<op_name>.py后于result/<op_name>/json/生成all_<op_name>.json。generate指向的生成脚本存在。name: <op_name> api: pytorch version: v2.1 api_type: <op_name> triton_api_type: <op_name> triton_name: <triton原版kernel名> generate: generate_<op_name> dtype_numbers: 50 outputs: 0 standard: acc: single_bm3.5.2.2
<op_name>_api.py(ATK 自定义 API 封装)npu_atk_test/与gpu_atk_test/,分别调用对应目录的 kernel。输入参数:
devicenpu:0/cuda:0input tensorstandard配置关联的比对结果)。torch.npu.is_available()判断)。import torch from atk.configs.dataset_config import InputDataset from atk.tasks.api_execute import register from atk.tasks.api_execute.base_api import BaseApi from <op_name> import <op_name>_kernel # 导入同目录 kernel @register class <OpName>Api(BaseApi): def __init__(self, dataset: InputDataset): super().__init__(dataset) # 解析 yaml / dataset 提供输入 def run(self): # 调用 <op_name>_kernel 完成计算,返回输出 ...3.5.2.3 端到端 ATK 流程命令
生成精度测试用例
atk case -f <op_name>.yaml -p generate_<op_name>.py生成的精度用例位于
result/<op_name>/json/,文件名为all_<op_name>.json。远端 GPU 服务器起监听命令
精度测试
注:如需保存性能对比数据则需在指令后加
--save_data profile。性能测试
3.5.3 编程手册设计
experimental/triton/atk_test/的算子 README。4. 测试设计
atk case生成全组合精度用例 +atk node拉取accuracy任务,NPU 端与 GPU 端原版 kernel 对比,阈值按 dtype/shape 约定;若与 GPU 对比精度不满足要求,则转换为双精度、以 CPU 为准。performance_device任务基于<op_name>_performance.json读取性能数据,量化 M1 / M2 性能优化策略的收益。M2 阶段深度调优后同步更新性能基线。5. 缺点和风险
<op_name>_performance.json、与算子同名 yaml/api 等新命名,需保证与既有引用/脚本兼容6. 现有技术
参考项目 / 社区设计:
fbgemm_gpu内提供大量 jagged/dense Triton kernel(如triton_jagged_tensor_ops.py、triton_jagged_dense_flash_attention.py),是 jagged 类算子迁移的主要上游,本提案保留其原版 kernel 作为 GPU 侧基准。借鉴与差异:
2. 推荐场景的典型 shape/用例
2. 增加 autotune 等昇腾性能优化
3. 双端(GPU↔NPU)ATK 精度/性能对比体系
7. 未解决问题
autotune 配置:autotune 优化主要针对 Ascend 950PR & 950DT 系列产品进行 config 覆盖与选优,不对其它 SOC 变体(如 A2 / A3)做差异化 autotune 配置(见 3.3.1)。
附录
experimental/triton/atk_test下现有算子 README术语表:
lengths/offsets描述变长序列,推荐领域 embedding/序列特征常用欢迎加入社区,感谢您对社区的贡献 🎉!