Closed
aclnnTransMatmulWeight / aclnnNpuFormatCast 资料未给出 NZ 存储排布,输出正确性不可判定 #3953
liuhanwen8Add on  16 days agoClosed at  8 days ago
liuhanwen8
liuhanwen8
16 days ago Create

aclnnTransMatmulWeight / aclnnNpuFormatCast 资料未给出 NZ 存储排布,无法判断输出是否正确

1. 环境

Ascend 910B2(A2)单卡;CANN 9.2.0;npu-smi 26.1.1;aclnn 单算子直调。

2. 问题

aclnnTransMatmulWeight(trans_data/docs/aclnnTransMatmulWeight.md)与
aclnnNpuFormatCast(npu_format_cast/docs/aclnnNpuFormatCast.md)的输出都是
私有格式(FRACTAL_NZ)的存储序:

  • TransMatmulWeight:「经过此接口后刷新成预处理后的 Matmul weightTensor,
    格式根据亲和性进行 ND 或私有格式的转换」——没有说转换后的元素排布;
  • NpuFormatCast:只给了 dstFormat / additionalDtype / actualFormat 的枚举取值表,
    同样没有给 dstTensor 的元素排布公式。

结果是:调用方(以及算子的自测)拿到输出后,没有任何资料依据能判断它是否正确,
只能靠「值集合不变」这类弱不变量,或者干脆不做数值校验。

实测(fp16、src = 16x16、值 0..255 唯一):

  • 输出确实是输入值的一个排列(值集合完全一致,无重复无丢失);
  • 但排布方式与资料无关可查,只能按「NZ = [N1, K1, C0, C0],元素 (n1,k1,i,j) ← src[n1·C0+i, k1·C0+j]」
    这一业界约定去反推;对 C0 的取值(16 / 32)与实际 itemsize 的关系也无说明。

3. 复现

src = fp16[16x16],值 = 0..255(唯一)
调用 aclnnTransMatmulWeight(原地)或 aclnnNpuFormatCast(ND→NZ)
读回输出:与输入是同一组值,但顺序被打散

4. 期望

在两份资料的「功能说明」里补:

  1. 输出存储序的显式公式(含 C0 的取值规则:按 itemsize 还是按 additionalDtype);
  2. 未对齐 shape(例如 4x4、17x17)时补齐块的填充值语义(补 0 还是未定义);
  3. 至少一个「输入 shape → storage shape」的示例(NpuFormatCast 的
    aclnnNpuFormatCastCalculateSizeAndFormat 已有组合表,但缺排布)。

5. 实际

两份资料都只描述「转成亲和格式」,不给排布;因此这类接口的数值正确性
在资料层面不可判定,只能靠实现自查。

likedislike
liuhanwen8liuhanwen8
16 days ago Added label: documentation
陈思
陈思Collaborators
15 days ago Comments:

您好,感谢反馈!明确逻辑元素与 NZ 存储位置的对应关系、补齐区域语义及示例,确实有助于独立校验输出。按公开版本 584b2ea6 核对,需要先区分已有说明与仍待补充的内容。

已有规则与参考映射

NpuFormatCast 的 A2/A3 功能说明已经给出 C0 = 32B / sizeof(additionalDtype),参数表也说明 additionalDtype=-1 默认使用源类型。因此,本单 FP16、additionalDtype=-1 或 FP16 的 ND→NZ 场景中,C0=16。目前资料主要缺少的是完整的元素索引映射及边界区域承诺,不能概括为完全没有 C0 说明。

以逻辑矩阵 [..., M, N] 表示输入,形状计算源码返回的 NZ 存储形状为:

[..., ceil(N/C0), ceil(M/16), 16, C0]

仓内测试参考实现通过补齐、reshape 和 transpose 给出下列有效元素映射,前导批次索引保持不变:

NZ[..., n1, m1, m0, n0] = ND[..., 16*m1 + m0, C0*n1 + n0]

这也说明两个内层轴分别是固定的 16 和 C0,不能对所有类型都写成两个 C0。上述 FP16 条件下,4×4 对应 [1,1,16,16],17×17 对应 [2,2,16,16];16×16 是单块,按该参考映射展平后顺序保持不变。因此,报告中的“顺序打散”仍需结合实际参数、存储元数据和读回方式复核,当前不能仅凭值集合不变判定转换正确,也不能据此确认设备输出有误。

资料补充方向

建议在两接口资料中补充适用平台、类型及格式条件下的映射公式、逻辑 shape 与 storage shape 示例,并明确哪些补齐位置可被校验。参考代码使用零补齐,但它属于测试参考,尚不足以单独承诺 A2 所有设备转换路径的补齐字节均为零,本次也未新增 NPU 复测。

TransMatmulWeight 还需要说明与权重大小计算接口配套分配容量,以及转换后存储形状/格式元数据的更新。有效元素可按索引逐一校验,也可配合已支持的 NZ→ND 回转检查逻辑数据;这些比仅比较值集合更有辨识力。后续将继续核对 A2 实际转换和补齐区域行为,跟踪两份资料的映射说明与示例一致性。

likedislike
陈思陈思Collaborators
15 days ago Assign chen_0715 as responsible person
陈思陈思Collaborators
15 days ago Added label: pending-confirmation
陈思陈思Collaborators
15 days ago Removed label: pending-confirmation
CchenyifengCollaborators
14 days ago Assign Anthony0331 as responsible person
CchenyifengCollaborators
14 days ago Removed responsible person chen_0715
yyt_hwyyt_hwCollaborators
14 days ago Associated pull request
CANN-robotCANN-robotCollaborators
8 days ago Close issue
CANN-robotCANN-robotCollaborators
8 days ago Added label: resolved
yyt_hwyyt_hwCollaborators
8 days ago changed custom state from 进行中 to 已完成