pypto_pro.language.TensorLayout#

产品支持情况#

  • Ascend 950PR/Ascend 950DT:支持

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持

  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持

功能说明#

数据布局枚举,用于描述GM Tensor的存储形式和Tile的数据排列形式。

  • GM Tensor支持ND、NZ,默认ND。

  • Tile支持ND、DN、NZ、ZN、NN、ZZ,默认值由内存空间决定。

原型定义#

PYPTO_DECLARE_ENUM(
    TensorLayout,
    ND,
    DN,
    NZ,
    ZN,
    NN,
    ZZ
)

参数说明#

参数值

说明

ND

非分形行主序,最后一维连续。支持用于Tensor和Tile;GM Tensor默认使用ND,典型用于普通GM Tensor、UB Tile和Fixpipe Buffer。

DN

非分形列主序。仅支持用于Tile,典型用于UB上的[ROWS, 1]列向量,如归约结果和histogram索引。

NZ

NZ分形排列。支持用于Tensor和Tile,典型用于GM Tensor、L1 Buffer、L0A Buffer和L0C Buffer。

ZN

ZN分形排列。仅支持用于Tile,典型用于L0B Buffer和转置搬入时的L1 Buffer。

ZZ

ZZ分形排列。仅支持用于Tile,用于MX矩阵乘中左量化系数矩阵在L1 Buffer和L0A_MX Buffer中的布局。

NN

NN分形排列。仅支持用于Tile,用于MX矩阵乘中右量化系数矩阵在L1 Buffer和L0B_MX Buffer中的布局。

约束说明#

  • GM Tensor仅支持ND(行主序,默认)和NZ(分形布局)。

  • NZ只声明GM内存的布局,不会把普通ND buffer自动转换成NZ。调用Kernel前,输入buffer必须已经按NZ物理顺序完成packing;NZ输出也必须使用按NZ格式分配的buffer。高维NZ Tensor的最后两轴固定解释为[M, N],所有前导轴均作为batch轴,不支持在layout中指定任意分形轴。

  • NZ将逻辑[…, M, N]存储为[…, ceil(N/C0), ceil(M/16), 16, C0]。M/N无需分形对齐,但实际存储空间必须按align(M, 16) × align(N, C0)的容量分配并使用上述NZ物理排布;仅分配M × N元素的紧凑buffer不受支持。补齐区不属于逻辑Tensor内容,框架不会为传入的buffer自动扩容或完成packing。DT_FP4E2M1和DT_FP4E1M2的C0为64;DT_INT8、DT_UINT8、DT_FP8E4M3FN、DT_FP8E5M2、DT_FP8E8M0和DT_HF8的C0为32;DT_FP16、DT_BF16、DT_INT16和DT_UINT16的C0为16;DT_FP32、DT_INT32和DT_UINT32的C0为8;DT_INT64和DT_UINT64的C0为4。4位数据类型的M/N同样按逻辑元素计数,不使用packed字节数作为Tensor shape。

  • MX矩阵计算使用的E8M0分组缩放因子在GM中仍声明为普通ND Tensor;物理shape和搬运约束见matmul_mxload

  • Tile的布局约束请参见pypto_pro.language.TileType

调用示例#

GM Tensor布局声明#

import pypto_pro.language as pl

x: pl.Tensor[[64, 128], pl.DT_FP16]                   # 默认ND
x_nz: pl.Tensor[[64, 128], pl.DT_FP16, pl.NZ]         # 显式指定NZ

UB Tile的ND与DN#

import pypto_pro.language as pl

# UB中的普通数据Tile使用ND
tile_src = pl.TileType(shape=[32, 128], dtype=pl.DT_UINT16,
                       target_memory=pl.MemorySpace.Vec, layout=pl.ND)

# UB中的单列Tile使用DN,例如归约结果
tile_red = pl.TileType(shape=[32, 1], dtype=pl.DT_FP32,
                       target_memory=pl.MemorySpace.Vec, layout=pl.DN)

Cube分形布局#

Cube计算涉及的L1 Buffer、L0A Buffer、L0B Buffer和L0C Buffer采用不同的默认分形布局。以下示例显式写出各内存空间的默认布局:

import pypto_pro.language as pl

# L1 Buffer和L0A Buffer默认使用NZ
mat_type = pl.TileType(shape=[64, 64], dtype=pl.DT_FP32,
                       target_memory=pl.MemorySpace.Mat, layout=pl.NZ)
left_type = pl.TileType(shape=[64, 64], dtype=pl.DT_FP16,
                        target_memory=pl.MemorySpace.Left, layout=pl.NZ)

# L0B Buffer默认使用ZN
right_type = pl.TileType(shape=[64, 64], dtype=pl.DT_FP16,
                         target_memory=pl.MemorySpace.Right, layout=pl.ZN)

# L0C Buffer默认使用NZ
acc_type = pl.TileType(shape=[64, 64], dtype=pl.DT_FP32,
                       target_memory=pl.MemorySpace.Acc, layout=pl.NZ)

MX矩阵乘量化系数的ZZ与NN#

ZZ和NN分别用于MX矩阵乘的左、右量化系数矩阵。量化系数的数据类型为DT_FP8E8M0,逻辑shape分别为[M, K/32]和[K/32, N]。L1 Buffer默认使用NZ,因此需要为左、右量化系数Tile显式指定ZZ和NN;L0A_MX Buffer和L0B_MX Buffer则默认使用对应布局。

import pypto_pro.language as pl

M, K, N = 64, 128, 64
G = K // 32

# L1 Buffer中的左、右量化系数Tile
scale_a_l1_type = pl.TileType(
    shape=[M, G], dtype=pl.DT_FP8E8M0,
    target_memory=pl.MemorySpace.Mat, layout=pl.ZZ,
)
scale_b_l1_type = pl.TileType(
    shape=[G, N], dtype=pl.DT_FP8E8M0,
    target_memory=pl.MemorySpace.Mat, layout=pl.NN,
)

# L0A_MX Buffer和L0B_MX Buffer未指定layout时分别默认使用ZZ和NN
scale_a_type = pl.TileType(
    shape=[M, G], dtype=pl.DT_FP8E8M0,
    target_memory=pl.MemorySpace.ScaleLeft,
)
scale_b_type = pl.TileType(
    shape=[G, N], dtype=pl.DT_FP8E8M0,
    target_memory=pl.MemorySpace.ScaleRight,
)