kernel-numerics-verifier 是一个数值正确性验证技能,来源为 pytorch/torchtitan,用于验证手写低精度 GPU 内核(Triton 或 CUDA)的前向与反向计算结果是否数值正确。
用途 它针对手写内核建立三套实现进行对比:golden 为 eager FP64 实现(FP64 不受支持时使用 FP32),reference 为与内核输入输出同 dtype 的 eager 实现,target 为同 dtype 的手写 Triton/CUDA 内核。低精度输入只生成一次,再无损上转为 FP64 供 golden 使用,从而只衡量内核算术误差,不混入输入量化误差。
主要能力
- 正确性门控:对每个输出张量和梯度张量,在 golden dtype 下计算 reference_error、target_error、rounding_floor 与 absolute_floor,并以 threshold = fudge_factor * reference_error + absolute_floor 作为阈值。存在已有算子容差时沿用;否则从 fudge_factor = 2.0、project_atol = 0 起步,且须在运行 target 前声明,不得仅为让失败内核通过而调大。
- 条件性检查:在门控前衡量参考误差相对 golden 结果是否显著。若参考相对误差超过预声明可接受值(无既有值时以 10% 作为诊断触发阈值),则不得依据 2 倍门控给出通过或失败结论。对归约操作,检查造成误差的输出元素并采集 FP64 逐项贡献,计算条件数 sum(abs(per_term)) / abs(sum(per_term));条件数大说明抵消放大了项误差,但本身不能证明 target 正确。
- 门控失效时的分析:比较两个合法 FP32 归约顺序以衡量累加顺序敏感性;跨多个归约长度与随机种子重复,误差随 sqrt(T) 增长约指示零均值数值噪声,随 T 增长约指示系统性偏差,并记录各 T 的条件数;比较 reference 与 target 的误差分布与偏差,target 特有偏差、异常缩放或语义不匹配判为失败。若两者都处于同一条件性噪声包络内,报告 PASS WITH LIMITATIONS;若证据无法区分数值噪声与内核 Bug,报告 INCONCLUSIVE。
- 简单逐元素内核还要求结果正确舍入或处于 1 至 2 ULP 之内,更大因子需已有被接受实现在代表性输入上的证据。
使用方式(工作流)
- 阅读内核、eager 公式、调用点与现有测试,记录公式、中间 dtype、累加器 dtype、输出 dtype、支持形状、掩码与 NaN/Inf 行为。
- 为 reference 与 target 创建相同低精度输入,将相同值无损上转生成 golden 输入。
- 在应用数值容差前比较形状、dtype、NaN 位置及正负 Inf 位置,任何不匹配即失败。
- 检查参考相对误差;参考足够准确时才应用正确性门控,否则进行条件性分析。
- 对每个前向输出应用相应判定流程。
- 三套实现使用同一个随机上游梯度,并分别检查每个输入与参数梯度。
- 测试生产形状、最小合法形状、相关内核 tile 尺寸上下相邻维度,并加入与操作相关的对抗性数值,如抵消、极端 logits 或接近零的方差。
- 若内核非确定性,重复相同输入并要求每个结果通过同一门控。
- 失败时先诊断再调整容差:先查索引与掩码,再查累加器 dtype、过早类型转换、归约顺序、数值稳定化、近似函数与反向公式。
结果输出 对前向和每个梯度报告一张紧凑表格,包含张量、Ref/golden、条件、target 误差、阈值、门控是否有效与结论;给出单一结论 PASS、PASS WITH LIMITATIONS、FAIL 或 INCONCLUSIVE,并说明已测试的形状、dtype 与不支持的情况。不得以单一形状或仅前向测试宣称一般正确性。数值验证通过后才进行性能基准测试。
适用场景与限制 适用于手写低精度内核的数值验证、与 eager 基线的误差对比及归约顺序敏感性分析。资料未提供该技能的安装方式、调用命令、代码文件结构、支持的硬件平台、性能数据及收费信息。