ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RecurrentGatedDeltaRule 算子 pytest 测试框架实战:从 golden 生成、随机泛化到 mssanitizer 检测

RecurrentGatedDeltaRule 算子 pytest 测试框架实战:从 golden 生成、随机泛化到 mssanitizer 检测 算子库人工智能深度学习Ascend【免费下载链接】ops-transformer本项目是CANN提供的transformer类大模型算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-transformer点击查看免费下载导读本指南围绕 CANN ops-transformer 仓库中attention/recurrent_gated_delta_rule算子的 pytest 测试框架展开它覆盖了该算子在 NPU 上功能验证的完整链路CPU 侧复现算子逻辑生成 golden 数据、NPU 侧通过 TorchNPU 直调算子、以及两者之间的精度对比。读完本文你将掌握 single / rdv / random / random_npu / mss 五种测试模式的用法、随机用例生成规则、双层种子复现机制以及 mssanitizer 设备侧内存检测的接入方式可直接用于该算子的日常调测与回归验证。一、框架定位与整体架构1.1 要解决什么问题RecurrentGatedDeltaRule循环门控 Delta 规则RGDR是一种应用于线性注意力机制与循环神经网络的算子在每个时间步根据输入q_t、k_t、v_t与上一隐藏状态S_{t-1}计算输出o_t与新状态S_t算法公式见 算子 README。由于计算过程带循环依赖NPU kernel 的正确性验证不能只靠跑通必须逐元素与可靠参照实现比对。该测试框架正是为此设计CPU 侧复现算子功能用以生成 golden 数据NPU 侧通过 TorchNPU 进行算子直调获取实际数据精度对比进行 CPU 与 NPU 结果的精度对比验证算子功能。1.2 与算子工程的关系该测试框架位于算子的tests/pytest/目录与算子源码同仓管理算子接口声明recurrent_gated_delta_rule.h 定义了l0op::RecurrentGatedDeltaRule的入参顺序query、key、value、beta、stateRef、actualSeqLengths、ssmStateIndices、g、gk、numAcceptedTokens、scaleValue测试中通过torch_npu.npu_recurrent_gated_delta_rule(...)以 eager 方式直调该接口见下文 golden 脚本算子功能、参数表与产品支持情况见 算子 README 及 aclnnRecurrentGatedDeltaRule 文档。二、当前实现范围参数约束速查测试框架当前支持的参数范围如下这也是所有用例含随机用例生成时必须遵守的边界参数约束batch_size大于 0mtp1 ~ 8Nk、Nv≤ 256且 Nv ≥ Nk、Nv 需整除 NkDk、Dv≤ 512actual_seq_lengths长度为 batch_size数值 ≥ 0 且 ≤ mtp不指定时默认长度为 batch_size、数值为 mtp 的数组T sum(actual_seq_lengths)ssm_state_indices长度为 T数值需小于 block_num不指定时默认[0,1,...,T-1]block_num手动传入需 ≥ Tdata_typeBF16query / key_datarange左区间最小 -1右区间最大 1gamma / gamma_k_datarange右区间最大 0beta_datarange左区间最小 0右区间最大 1三、环境配置与前置条件3.1 前置要求安装 TorchNPU 安装包需及时更换为最新版本官方安装教程见 Ascend/pytorch完成环境安装和环境变量配置具体操作参考仓库根目录的 README。3.2 custom 包调用框架支持 custom 包调用方式即在编译安装好的 CANN 环境上以 custom 算子包形式加载本算子后运行测试。四、pytest 文件结构与职责tests/pytest/ ├── test_run.sh # 执行脚本五种模式入口 ├── conftest.py # pytest 钩子逐用例记录参数/结果/精度/种子会话结束落 CSV ├── recurrent_gated_delta_rule_golden.py # CPU 侧 golden 实现 CPU/NPU 精度对比 ├── pytest.ini # pytest 基础配置 ├── test_recurrent_gated_delta_rule_single.py # 单用例运行主程序参数化入口 ├── recurrent_gated_delta_rule_operator_single.py# CPU 侧算子逻辑 NPU 算子直调封装 ├── test_recurrent_gated_delta_rule_paramset.py # 单用例入参配置 └── test_recurrent_gated_delta_rule_paramset_rdv.py # RDV 测试入参配置各文件职责如下test_run.shshell 执行入口根据第一个参数分发到 single / rdv / random / random_npu / mss 分支自动创建output/目录、生成时间戳日志与 CSV 路径并通过tee保存屏显conftest.py两条核心钩子。_set_tensor_seed夹具在每条用例前固定torch与torch.npu的随机种子TORCH_SEED指定则用指定值否则自动生成并回写pytest_runtest_makereport逐用例采集结果、入参、精度 PctRlt、错误信息pytest_sessionfinish在会话结束写入 CSVrecurrent_gated_delta_rule_golden.py包含 CPU golden 实现cpu_recurrent_gated_delta_rule、数据生成器rand_range、精度对比函数check_result以及 eager 直调封装run_recurrent_gated_delta_rule_eagertest_recurrent_gated_delta_rule_single.py定义param_names与随机参数生成器_generate_random_param_dict用pytest.mark.cipytest.mark.parametrize将用例参数化执行pytest.ini基础 pytest 配置log_format %(message)s标记ci由主程序文件中的pytest.mark.ci使用。4.1 主流程代码骨架执行链路为test_run.sh设置TEST_MODE与CSV_FILE→test_recurrent_gated_delta_rule_single.py根据模式构建参数组合 →recurrent_gated_delta_rule_operator_single.output_operator解包参数 →run_recurrent_gated_delta_rule_eager依次完成参数校验、数据生成、CPU golden、NPU 直调与精度断言。核心直调代码如下npu_out torch_npu.npu_recurrent_gated_delta_rule( query, key, value, init_state, betabeta, scalescale_value, actual_seq_lengthsact_seq_len, ssm_state_indicesssm_state_indices, num_accepted_tokensnum_accepted_tokens, gg, gkgk, )五、五种测试模式与使用方法在tests/pytest/目录下执行test_run.sh不同参数对应不同模式。5.1 单用例调测single手动配置 test_recurrent_gated_delta_rule_paramset.py 中的参数文件内置Testcase0、Testcase1两组通过ENABLED_PARAMS启用执行bash test_run.sh single5.2 RDV 测试rdvRDV 模式使用 test_recurrent_gated_delta_rule_paramset_rdv.py 中预定义的参数池ENABLED_PARAMS_RDV覆盖 batch_size × mtp × dk × dv 组合、nk/nv 比例矩阵、大 shape如 dkdv512以及 state 为 fp32 / 非连续non-contiguous的变体适用于批量回归bash test_run.sh rdv从源码看rdv 参数池由GROUP_1~GROUP_6与L0_L1_CASES拼接而成并通过_gen_fp32_state_cases、_gen_non_contiguous_state_cases派生 state 数据类型与内存布局的交叉组合最终用例规模为_ALL_BF16_CASES × 4。5.3 随机用例测试random随机生成 N 条用例并执行含 CPU golden 精度对比可用RANDOM_SEED环境变量固定随机种子复现不指定则自动生成并记录到 CSVbash test_run.sh random 1005.4 随机用例测试仅 NPUrandom_npu随机生成 N 条用例设置SKIP_GOLDEN1跳过 CPU golden 计算与精度对比仅执行 NPU 算子。由于输入张量直接在 NPU 上生成host 内存占用低执行速度更快bash test_run.sh random_npu 1005.5 mssanitizer 检测mss随机生成 N 条用例仅 NPU 执行不跑 golden并在 mssanitizer 下运行检测设备侧内存越界、非法地址访问等问题。屏显含 ERROR即判定 FAIL脚本退出码为 1。默认只检测本算子 kernel--kernel-nameRecurrentGatedDeltaRule跳过 ZerosLike/ViewCopy/TensorMove/rand 等旁路 kernel 的检测开销bash test_run.sh mss 10mssanitizer 安装前置条件官方快速入门文档mssanitizer 快速入门CANN 工具包已自带时无需额外安装如/home/developer/Ascend/cann-9.2.0/bin/mssanitizer确保其所在目录在 PATH 中未自带时源码编译安装git clone https://gitcode.com/Ascend/mssanitizer.git cd mssanitizer python3 build.py # 编译完成后安装 run 包 artifacts/mindstudio-sanitizer_26.0.0_x86_64.run --run --install-path/home/developer/Ascend/mss 模式环境变量定制MSS_TOOLracecheck bash test_run.sh mss 10 # 换检测工具(memcheck/racecheck/initcheck/synccheck) MSS_KERNEL bash test_run.sh mss 10 # 关闭kernel过滤检测全部kernel MSS_EXTRA_OPTS--leak-checkyes --full-backtraceyes bash test_run.sh mss 10 # 追加mssanitizer参数 MSSANITIZER_BIN/path/to/mssanitizer bash test_run.sh mss 10 # 指定mssanitizer路径从 test_run.sh 源码看mss 模式还有两个值得关注的实现细节_mss_preflight前置校验会先跑 1 条用例确认 mssanitizer 真正拦截到 kernel日志中出现[mssanitizer] Start...sanitizer on kernel否则直接中止避免检测无效但显示通过的假象MSS_BATCH分批模式下每批使用seedi独立种子重启 mssanitizer避免 host 内存累积CSV/log 追加写入单一文件。六、随机用例生成规则random / random_npu / mss 三种模式共用同一套随机参数生成器_generate_random_param_dict见 test_recurrent_gated_delta_rule_single.py在算子约束内从 0 随机生成不依赖 single/rdv 参数池。每条用例的入参生成规则如下按算子接口入参顺序接口入参随机规则约束/说明query (T, Nk, Dk)TB×mtp, Nkrandint(1,256), Dkrandint(1,min(512,budget))dtype 固定 bf16key (T, Nk, Dk)复用 Nk/Dkdatarange 固定 [-1,1]value (T, Nv, Dv)NvNk×randint(1,256//Nk), Dvrandint(1,min(512,budget//Dk))datarange 随机 choice([-10,10], [-1,1])state (BlockNum, Nv, Dv, Dk)BlockNumB×mtp, 复用 Nv/Dv/Dkdtype 随机 choice(bf16,fp32), datarange [-10,10]beta (T, Nv)复用 T/Nvdatarange 固定 [0,1]scale1/sqrt(Dk)自动计算actual_seq_lengths (B,)默认全 mtp不指定时自动生成ssm_state_indices (T,)默认 [0,1,...,T-1]不指定时自动生成num_accepted_tokens (B,)has_num_accepted_tokensTrue 时 randint(1, mtp)50%概率启用g (T, Nv)has_gammaTrue 时生成, datarange choice(4种负值区间)50%概率启用, dtype fp32gk (T, Nv, Dk)has_gamma_kTrue 时生成, datarange choice(4种负值区间)50%概率启用, dtype fp32state_non_contiguouschoice([False, True])50%概率非连续其他固定项data_type 固定 bfloat16query/key_datarange 固定 [-1,1]beta_datarange 固定 [0,1]state_datarange 固定 [-10,10]。shape 约束0Nk≤256、0Nv≤256 且 Nv≥Nk 且 Nv%Nk0、0Dk≤512、0Dv≤512、mtp≤8、BlockNum≥T。内存约束Dk×Dv 受 state 元素数上限_STATE_ELEM_CAP2.0B约束budget STATE_ELEM_CAP // (BlockNum × Nv)防止单进程 host OOM。源码注释给出了估算依据单 case host 峰值 ≈ baseline(1.6GB) 10×state 元素字节数bf16 state 最坏情形下原张量 2E .to(fp32)4E .clone()4E 10E取 2.0B 时 host 峰值约 21.6GB不超出 24GB 上限NPU HBM 远不构成瓶颈。随机种子机制RANDOM_SEED控制 shape/参数序列一个 seed 对应一组确定的 N 条用例参数TORCH_SEED控制张量数值每条用例独立conftest 自动生成并记 CSV不设RANDOM_SEED时自动生成并回写os.environconftest 落 CSV复现RANDOM_SEEDseed bash test_run.sh random N整批复现或TORCH_SEEDtensor_seed配合 CSV 入参单条数值级复现。重复概率参数空间约 5×10¹⁰500 亿10000 条撞车概率 0.1%实际不会重复。七、结果输出与复现所有模式执行后均输出到output/目录已 gitignorerun_时间戳.log/mss_时间戳.log完整执行日志tee 屏显result_时间戳.csv逐用例结果表每行一条用例列含义如下列说明random_seed随机 shape 序列种子random 系模式single/rdv 为固定参数集无此值tensor_seed本条用例张量数值种子每条独立记录test_modesingle/rdv/randomcheck_typeprecision带 golden 精度对比 / execution_only仅 NPU 执行 / execution_onlymss_toolmssanitizer 检测resultpytest 执行结果PASSED/FAILED/SKIPPEDmss_checkmssanitizer 检测结论PASS/FAIL(errorsN)/CRASH仅 mss 模式由脚本解析日志回填out_pct_rlt / state_pct_rlt输出与 state 的精度达标率 PctRlt 真实值如 99.999982%仅 precision 模式记录batch_size...state_non_contiguous24 列本条用例全部入参errmsg失败详情截断 2000 字符关于mss_check回填的实现由于 mssanitizer 报错时 pytest 仍可能 PASSEDtest_run.sh 中的_backfill_mss_check函数会解析日志中 ERROR块的个数并回填到 CSV 对应列分批模式下_merge_batch_csvs负责将各批次 CSV 按顺序合并为单一文件。失败用例复现两层种子配合 CSV 入参# 整批复现同 shape 序列CSV 取 random_seed RANDOM_SEEDrandom_seed bash test_run.sh random N # 单条数值级复现同 shape 同张量数值CSV 取入参与 tensor_seed TORCH_SEEDtensor_seed bash test_run.sh random 1八、环境变量汇总变量作用适用模式RANDOM_SEED固定随机 shape 序列种子不设则自动生成并记 CSVrandom/random_npu/mssTORCH_SEED固定张量数值种子不设则每条自动生成并记 CSV全部RANDOM_CASE_COUNT随机用例条数test_run.sh 已透传random 系SKIP_GOLDEN1 跳过 CPU golden 与精度对比仅 NPU 执行random_npu/mssCSV_FILE指定 CSV 输出路径test_run.sh 已自动设置全部CSV_APPEND1 时 CSV 追加写入分批模式自动设置手动使用需自行管理 header全部MSS_BATCHmss 分批大小每批重启 mssanitizer 避免 host 内存累积0不分批mssMSS_TOOLmssanitizer 检测工具memcheck/racecheck/initcheck/synccheckmssMSS_KERNELkernel 过滤名默认 RecurrentGatedDeltaRule置空检全部mssMSS_EXTRA_OPTS追加 mssanitizer 参数如 --leak-checkyesmssMSSANITIZER_BINmssanitizer 可执行文件路径mss九、日志与 CSV 自动保存所有模式均通过tee自动保存屏显到output/目录已 gitignore模式日志文件CSV 文件single/rdv/random/random_npuoutput/run_timestamp.logoutput/result_timestamp.csvmss单进程output/mss_timestamp.logoutput/result_timestamp.csvmss分批 MSS_BATCH0output/mss_timestamp.log追加output/result_timestamp.csv追加十、精度对比实现要点golden 侧精度对比的核心是 recurrent_gated_delta_rule_golden.py 中的check_result函数其判定策略可归纳为三层达标率门槛使用np.isclose(rtol, atol, equal_nanTrue)逐元素比对统计PctRlt 通过元素数 / 总数 × 100%默认pct_thd0.005即允许 0.5% 比例不达标误差上限保护即使达标率满足若归一化相对误差max_error max_diff_hd(10.0)仍判失败防止个别元素严重溢出溢出监控golden 侧出现 inf/nan 时单独上报并计数。对 bf16 使用rtol0.0078125, atol0.0001其他类型使用rtol0.005, atol0.000025大张量按122分块比对以控制 host 峰值内存。run_recurrent_gated_delta_rule_eager在最后对输出与 state 两个结果分别断言Pass任一失败即用例失败。十一、与算子实现的衔接从测试回看算子语义测试框架中 golden 的计算流程与 算子 README 中的公式严格对应每个时间步先对状态施加门控衰减S S * alpha * alphak再按 delta 规则更新S S (v - S·k) * beta * k^T最后o S·q / sqrt(Dk)cpu_recurrent_gated_delta_rule中q q * scale_value即对应1/sqrt(d_k)缩放。state 在测试中以stateRef语义原地更新npu_state_out init_statessm_state_indices将每个时间步映射到对应状态块num_accepted_tokens用于从 batch 中已接受 token 位置初始化状态——这些行为均可从测试入参与 golden 实现直接观察到。若需进一步阅读算子侧实现可参考 op_host 目录 下的 def/infershape/tiling 源文件与 op_kernel 目录 的 kernel 实现。十二、快速上手指南在仓库根目录完成 README 所述的环境安装与配置并安装 TorchNPU首次验证推荐先跑单用例配置 test_recurrent_gated_delta_rule_paramset.py 后执行bash test_run.sh single需要批量回归时执行bash test_run.sh rdv泛化验证用RANDOM_SEEDseed bash test_run.sh random 100需要快速执行不做精度对比用bash test_run.sh random_npu 100内存安全检测在安装 mssanitizer 后执行bash test_run.sh mss 10并可用MSS_TOOL/MSS_BATCH等环境变量定制所有结果均自动落盘output/result_timestamp.csv失败用例按 CSV 中的random_seed与tensor_seed两层种子即可精确复现。赞分享算子库人工智能深度学习Ascend【免费下载链接】ops-transformer本项目是CANN提供的transformer类大模型算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-transformer点击查看免费下载相关推荐CANN SHMEM 算子泛化性测试框架实战指南基于 pytest 的随机化精度验证方案CANN SHMEM 算子泛化性测试框架实战指南基于 pytest 的随机化精度验证方案 本指南完整解析 tests/examples/README.md h通信高性能计算人工智能CANNAscendCANN ops-transformer FIA 算子 A2/A3 pytest 精度泛化测试框架实战CANN ops transformer FIA 算子 A2/A3 pytest 精度泛化测试框架实战 本文围绕 ops transformer 仓库中 exp算子库人工智能深度学习Ascendlightning_indexer 算子 pytest 测试框架实战CPU Golden 生成、NPU 直调与精度对比全流程解析lightning_indexer 算子 pytest 测试框架实战CPU Golden 生成、NPU 直调与精度对比全流程解析 导读 本文以 CANN op算子库人工智能深度学习Ascend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表