| Files | Last commit | Last update |
|---|---|---|
fix(stateless_exponential): 优化lambd极小值约束的校验描述 Co-authored-by: liangtongxue<lianglihui@h-partners.com> # message auto-generated for no-merge-commit merge: !6464 merge fix/stateless-exponential-lambd-fp32-min into master fix(stateless_exponential): 优化lambd极小值约束的校验描述 Created-by: liangtongxue Commit-by: liangtongxue Merged-by: cann-robot Description: ## 问题背景 stateless_exponential 的 lambd 参数经 IR Attr(FLOAT) 以 fp32 精度下发。当 lambd 为趋近于 0 的极小值(double 合法 > 0,但 < 2^-150 ≈ 7.006e-46)时,double→fp32 转换后下溢为 0,被 tiling 层以 lambd must be greater than 0 拒绝。该报错未说明根因,且 aclnn 层原值以 %f 打印(1e-46 显示为 0.000000),易被误读为入参校验缺陷。 对标竞品 PyTorch:lambd 接口恒为 double,host 按 double 原值校验 > 0;CUDA 上 fp32 输出对极小 lambd 放行并输出 +inf(IEEE 除零),不报错。本仓 self 仅支持 FP16/BF16/FP32,lambd 极小值在 fp32 精度下无有效计算意义(1/λ 恒溢出),故维持现有 <= 0 拦截口径不变。 ## 修改方案 **不改变任何判断逻辑**(拦截条件、拦截点、行为链完全不变),仅优化约束与校验描述,将约束口径明确为:**lambd 必须大于 0,且不能是 fp32 无法表示的极小值(double 转 fp32 后下溢为 0)**。 1. op_api/aclnn_stateless_exponential.cpp:CheckLambdability 报错补充极小值下溢说明;原值打印 %f 改为 %g(极小值不再显示 0.000000) 2. op_host/arch35/stateless_exponential_tiling_arch35.cpp:tiling 拒绝 reason 补充极小值下溢说明 3. docs/aclnnStatelessExponentialTensor.md:参数约束与错误码描述同步(定性描述,不承诺具体阈值:2^-150 依赖 IEEE 默认舍入模式,不宜作为对外承诺) 4. 新增 op_api 层 L2 UT(19 用例):lambd 正常域 / 小值 / subnormal / 极小值(double→fp32 下溢链路在 aclnn 层按 double 原值校验放行,构图通过)/ <=0 拒绝 / nullptr / dtype / 维度校验 5. 新增 aclnn 级 ST 用例:stateless_exponential 14 条、sim_thread_exponential 13 条(lambd 极小值/subnormal/FLT_MIN 边界),并为 sim_thread_exponential golden.py 补充 aclnnSpec ## Test Plan - [x] clang-format --dry-run -Werror 对改动 cpp 通过 - [x] ST csv 全字段 ast 解析与数值边界断言通过(float(1e-46)==0、float(1e-38) subnormal 保留、1e-37 全元素不溢出等) - [x] pre-commit 全量通过(clang-format / ruff check / ruff format / codespell / OAT) - [x] UT 宏展开参数序与 aclnnStatelessExponentialTensorGetWorkspaceSize 签名逐一核对 - [ ] CI 编译(compile 门禁) - [ ] ST 用例在 arch35 环境回归 Fixes #3765 See merge request: cann/ops-math!6464 | 20 days ago | |
fix(stateless_exponential): 优化lambd极小值约束的校验描述 Co-authored-by: liangtongxue<lianglihui@h-partners.com> # message auto-generated for no-merge-commit merge: !6464 merge fix/stateless-exponential-lambd-fp32-min into master fix(stateless_exponential): 优化lambd极小值约束的校验描述 Created-by: liangtongxue Commit-by: liangtongxue Merged-by: cann-robot Description: ## 问题背景 stateless_exponential 的 lambd 参数经 IR Attr(FLOAT) 以 fp32 精度下发。当 lambd 为趋近于 0 的极小值(double 合法 > 0,但 < 2^-150 ≈ 7.006e-46)时,double→fp32 转换后下溢为 0,被 tiling 层以 lambd must be greater than 0 拒绝。该报错未说明根因,且 aclnn 层原值以 %f 打印(1e-46 显示为 0.000000),易被误读为入参校验缺陷。 对标竞品 PyTorch:lambd 接口恒为 double,host 按 double 原值校验 > 0;CUDA 上 fp32 输出对极小 lambd 放行并输出 +inf(IEEE 除零),不报错。本仓 self 仅支持 FP16/BF16/FP32,lambd 极小值在 fp32 精度下无有效计算意义(1/λ 恒溢出),故维持现有 <= 0 拦截口径不变。 ## 修改方案 **不改变任何判断逻辑**(拦截条件、拦截点、行为链完全不变),仅优化约束与校验描述,将约束口径明确为:**lambd 必须大于 0,且不能是 fp32 无法表示的极小值(double 转 fp32 后下溢为 0)**。 1. op_api/aclnn_stateless_exponential.cpp:CheckLambdability 报错补充极小值下溢说明;原值打印 %f 改为 %g(极小值不再显示 0.000000) 2. op_host/arch35/stateless_exponential_tiling_arch35.cpp:tiling 拒绝 reason 补充极小值下溢说明 3. docs/aclnnStatelessExponentialTensor.md:参数约束与错误码描述同步(定性描述,不承诺具体阈值:2^-150 依赖 IEEE 默认舍入模式,不宜作为对外承诺) 4. 新增 op_api 层 L2 UT(19 用例):lambd 正常域 / 小值 / subnormal / 极小值(double→fp32 下溢链路在 aclnn 层按 double 原值校验放行,构图通过)/ <=0 拒绝 / nullptr / dtype / 维度校验 5. 新增 aclnn 级 ST 用例:stateless_exponential 14 条、sim_thread_exponential 13 条(lambd 极小值/subnormal/FLT_MIN 边界),并为 sim_thread_exponential golden.py 补充 aclnnSpec ## Test Plan - [x] clang-format --dry-run -Werror 对改动 cpp 通过 - [x] ST csv 全字段 ast 解析与数值边界断言通过(float(1e-46)==0、float(1e-38) subnormal 保留、1e-37 全元素不溢出等) - [x] pre-commit 全量通过(clang-format / ruff check / ruff format / codespell / OAT) - [x] UT 宏展开参数序与 aclnnStatelessExponentialTensorGetWorkspaceSize 签名逐一核对 - [ ] CI 编译(compile 门禁) - [ ] ST 用例在 arch35 环境回归 Fixes #3765 See merge request: cann/ops-math!6464 | 20 days ago | |
fix: StatelessRandomChoiceWithMask补注册OutputShapeDependOnCompute并补充UT;补齐4个random算子tiling UT的expectTilingData;修复Bernoulli两个ST executor的__call__重复定义 Co-authored-by: liangtongxue<lianglihui@h-partners.com> # message auto-generated for no-merge-commit merge: !6835 merge fix/stateless-random-choice-with-mask-output-shape-depend into master fix: StatelessRandomChoiceWithMask补注册OutputShapeDependOnCompute并补充UT;补齐4个random算子tiling UT的expectTilingData;修复Bernoulli两个ST executor的__call__重复定义 Created-by: liangtongxue Commit-by: liangtongxue Merged-by: cann-robot Description: ## 描述 本 PR 包含两部分修复(commit 已合一): ### 一、StatelessRandomChoiceWithMask 补注册 OutputShapeDependOnCompute StatelessRandomChoiceWithMask 的输出 y/mask 为数据依赖 shape(三类算子),kernel 侧已实现 shapeOut 缓冲区回写真实输出 shape,但 op impl 注册链缺少 OutputShapeDependOnCompute 标记: - GE 编译期不会给节点打 DEPEND_SHAPE_RANGE 三类算子标记(shape_inference.cc 中仅当 functions->IsOutputShapeDependOnCompute() 为真时设置) - rt v2 执行期走普通 InferStorageShape 路径,输出 shape 保持 [-1, rank] - CalcAlignedSizeByShape 按 -1 × rank 计算 tensor size 得负数失败,整图执行报错 RunGraph failed, error code:1343242272,报错数值随输入 rank 变化(shape_size[-1]/[-2]/[-3]/[-4]) GEIR 用例 StatelessRandomChoiceWithMask_bool_int32_int64_ND_* 的 s/d 两模式全量在同一报错点失败,对比可正常执行的同类算子 NonZero/UniqueConsecutive/BroadcastGradientArgs,其 IMPL_OP_INFERSHAPE 注册链均含 OutputShapeDependOnCompute,本算子缺失。 **修复**:注册链补 .OutputShapeDependOnCompute({OUT_IDX_Y, OUT_IDX_MASK})。补齐后走三类算子路径:编译期打 DEPEND_SHAPE_RANGE 标记 → lowering 走 InferMaxShape(调用算子已注册的 InferShapeRange 按 max shape 分配输出内存并分配 shape buffer)→ kernel 回写真实 shape → SetOutputShape 同步实际输出 shape。kernel 侧无需改动。另新增 3 个 UT 用例覆盖 InferShapeRange 正常/上界路径与注册完整性断言。 ### 二、补齐公共 tiling 结构 prob 字段扩展后 4 个算子 tiling UT 的 expectTilingData !5714 为 bernoulli 标量场景在公共结构 RandomUnifiedSimtTilingDataStruct 末尾新增 probDims(int32+padding)/probSizes[8]/probStrides[8](共 17 个 int64 槽位),tilingData 序列化从 51 词扩展至 68 词,但下列 4 个算子 tiling UT 的 expectTilingData 仍是旧 51 词,经 tiling_case_executor.cpp 全量逐词比较时尾部多出 17 个 0 而失败(共 15 例): - sim_thread_exponential: fp32/fp16/bf16 3 例 - stateless_random: test_0/test_1 2 例 - stateless_uniform: test_0~test_8 9 例 - truncated_normal_v2: 910D_float_001 1 例 **修复**:各 UT 新增 PROB_ADDR_TAIL 宏追加至 expectTilingData 尾部([51] probDims(int32+padding) [52..59] probSizes[8] [60..67] probStrides[8],仅 stateless_bernoulli 填充、上述算子不消费恒为 0),并对涉改文件做 clang-format 归一。 ### 三、修复 aclnnBernoulli/aclnnBernoulliTensor 两个 ST executor 的 __call__ 重复定义 executor_aclnnBernoulli.py 与 executor_aclnnBernoulliTensor.py 的 Method 类中 __call__ 定义了两遍:第一份(含 super().__init__(task_result) 与 OpsDataset.seed_everything())被第二份覆盖成为死代码,种子固定逻辑永不执行,两个 ST 用例的随机输入不受种子控制。 **修复**:第一份改回 __init__(与 aclnnDropoutGenMaskV2/aclnnInplaceUniform 等规范 executor 一致),使 seed_everything 在构造期生效;同步清理 ruff 存量问题(未使用的 torch_npu/numpy 导入、引号与空白归一,规范 executor 均不显式导入 torch_npu,NPU 后端由 atk 框架统一管理)。AST 校验两 Method 类方法序列均为 ['__init__','__call__']。 ## 关联的Issue fixes #4275(UT 失败统一单 issue 跟踪,原按算子拆分的 #4263~#4266 已关闭并入) fixes #3835(Bernoulli 两个 ST executor 的 __call__ 重复定义,种子固定逻辑死代码) GEIR 全量 200 个 all_coverage 用例在 rt v2 路径执行失败(shape_utils.cc CalcAlignedSizeByShape: shape_size[-N])。 ## 测试 - StatelessRandomChoiceWithMask infershape UT 通过 - ophost UT(ascend950)4 算子共 33 用例全部通过(此前失败的 15 例逐条确认恢复) - pre-commit 全钩子通过(clang-format/codespell/OAT 合规等) - 待 GEIR 环境重跑 all_coverage s/d 两模式回归验证 ## 文档更新 不涉及 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6835 | 10 days ago |