已关闭
[ReduceLogSumExp] aclnnLogSumExp 的 dtype/format/empty dim 语义在头文件、文档、实现和 UT 中不一致 #1455
KununK创建于  5月2日关闭于  7月30日
KununK
KununK
5月2日 创建

问题描述

在阅读 math/reduce_log_sum_exp 时发现,aclnnLogSumExp 的 API 契约在头文件注释、README/docs、实际实现和 UT 中存在几处不一致,可能导致用户接入时误用,也会让 UT 对边界语义的覆盖不够明确。

具体不一致点

1. 头文件声明的 dtype/format 与 README/docs、实现不一致

math/reduce_log_sum_exp/op_api/aclnn_logsumexp.h 中的接口注释写到:

  • self 数据类型支持 FLOAT16、BFLOAT16、FLOAT32
  • 数据格式支持 ND、NCHW、NHWC、HWCN、NDHWC、NCDHW
  • out 数据格式也支持上述格式,且需要与 self 一致

README.mddocs/aclnnLogSumExp.md 中写的是:

  • self 支持 FLOAT、FLOAT16、BFLOAT16、INT32、INT64、INT16、INT8、UINT8、BOOL
  • out 支持 FLOAT、FLOAT16、BFLOAT16
  • 数据格式支持 ND

实际实现 op_api/aclnn_logsumexp.cpp 中:

  • CheckDtypeValid 也确实允许整型和 BOOL 作为输入,并在后续将 FLOAT16/BFLOAT16/整型 promote 到 FLOAT 计算;
  • 对 format 的处理只是:
if(self->GetStorageFormat() != Format::FORMAT_ND){
    OP_LOGW("Format only support ND");
}

也就是实现层面并没有与头文件注释中的多 format 支持保持一致。

2. dim 为空的语义在实现和 UT 中不够一致

aclnn_logsumexp.cpp 中的注释和实现都表明:dim->Size() == 0 时按“所有轴 reduce”处理。

相关逻辑包括:

// dim为空时,所有轴都视为mask,与竞品一致
if (dim->Size() == 0) {
    dimMask.flip();
}

以及:

// 输入dim为空aclIntArray时,添加输入self的dim
if (dim->Size() == 0) {
    op::Shape shape = self->GetViewShape();
    size_t dimDum = shape.GetDimNum();
    int64_t appendDim[dimDum];
    for (uint64_t i = 0; i < dimDum; i++) {
        appendDim[i] = static_cast<int64_t>(i);
    }
    dim = uniqueExecutor.get()->AllocIntArray(appendDim, dimDum);
}

但 UT 中 case_14 注释为“dim为空”,却构造了:

self shape: {2, 4}
dim: {}
keep_dim: false
out shape: {1}
EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);

如果 dim == {} 的语义是 all-reduce,则 keep_dim=false 的期望输出更可能应是 0 维标量 shape {},而不是 {1}。当前 case 实际验证的是“out shape 不匹配时报错”,并没有验证 dim 为空本身的支持语义。

3. 负数维度 UT 命名与实际验证目标不一致

case_22 注释为“负数维度测试”:

self shape: {2, 3, 4}
dim: {-2}
keep_dim: false
out shape: {2, 3}
EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);

但对于 self={2,3,4}dim=-2 等价于 reduce 第 1 维,keepDim=false 时合理输出 shape 应为 {2,4}。当前用例失败原因更像是 out shape {2,3} 不匹配,而不是负数维度本身非法。

影响

这些不一致会带来几个问题:

  1. 用户按头文件注释接入时,可能误用非 ND format;
  2. 用户可能不知道 self 实际支持整型/BOOL 输入;
  3. dim={} 和负数维度的边界语义没有被 UT 明确覆盖,后续重构时容易回归;
  4. README/docs/header 三处 API 契约不一致,维护成本较高。

建议

  1. 统一 aclnn_logsumexp.hREADME.mddocs/aclnnLogSumExp.md 中的 dtype 和 format 描述。
  2. 如果当前算子只支持 ND,建议头文件注释也改为仅 ND,并在实现中考虑将非 ND format 从 warning 改为参数校验失败,或明确说明会内部按 ND 处理。
  3. dim={} 增加正向 UT,明确 all-reduce 语义。
  4. 调整 case_22,区分“负数维度支持”与“out shape mismatch”两个测试目标。
likedislike
sunchun成员
5月6日 评论:

您好,感谢您提出的issue,正在安排相关人员定位分析,请耐心等待。

likedislike
sunchun成员
5月7日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
5月7日 将 sunchun 设为负责人
RRobell
5月15日 关联了pull request:[Docs] Align LogSumExp API descriptions
Ssunchun成员
7月29日 关联了pull request:开源仓issue处理
Ssunchun成员
7月29日 删除了关联的pull request:开源仓issue处理
Ssunchun成员
7月29日 关联了pull request:开源仓issue处理
Ssunchun成员
7月29日 删除了关联的pull request:[Docs] Align LogSumExp API descriptions
CANN-robotCANN-robot成员
7月30日 关闭了 issue
CANN-robotCANN-robot成员
7月30日 添加了label:resolved
Ssunchun成员
8月3日 关联了pull request:reducelogsumexp 非法格式拦截