pypto.matmul#
产品支持情况#
产品 |
是否支持 |
|---|---|
Ascend 950PR/Ascend 950DT |
√ |
Atlas A3 训练系列产品/Atlas A3 推理系列产品 |
√ |
Atlas A2 训练系列产品/Atlas A2 推理系列产品 |
√ |
功能说明#
实现input 、mat2矩阵的矩阵乘运算,计算公式为:out = input @ mat2
input 、mat2为源操作数,input 为左矩阵;mat2为右矩阵
out 为目的操作数,存放矩阵乘结果的矩阵
注意事项#
左右矩阵数据类型必须一致:matmul 的左右矩阵数据类型必须相同(如 BF16+BF16、FP16+FP16),不支持混合输入(如 BF16+FP32)
推荐使用低精度输入:BF16/FP16 输入直接 matmul 输出 FP32,比先 cast 到 FP32 再 matmul 性能更好,且精度相当
避免不必要的 cast:将 BF16 升级到 FP32 再进行 matmul 计算不会有精度提升,反而会产生额外的数据搬移开销
利用随路 transpose:matmul 支持
a_trans和b_trans参数,可以在矩阵乘时随路完成转置,避免额外调用 transpose 操作必须先设置 TileShape:调用 matmul 接口前需要通过
set_cube_tile_shapes设置 M、N、K 轴上的切分大小
函数原型#
matmul(input, mat2, out_dtype, *, a_trans = False, b_trans = False, c_matrix_nz = False, extend_params=None) -> Tensor
参数说明#
表1:API参数说明
参数名 |
输入/输出 |
说明 |
|---|---|---|
input |
输入 |
表示输入左矩阵。不支持输入空Tensor。 |
mat2 |
输入 |
表示输入右矩阵。不支持输入空Tensor。 |
out_dtype |
输出 |
表示输出矩阵数据类型,支持DT_FP32,DT_FP16,DT_BF16, DT_INT32。 |
a_trans |
输入 |
参数a_trans表示输入左矩阵是否转置,默认为False。 |
b_trans |
输入 |
参数b_trans表示输入右矩阵是否转置,默认为False。 |
c_matrix_nz |
输入 |
参数c_matrix_nz表示输出矩阵的Format是否采用NZ格式,默认为False,当前仅支持设置False,即输出矩阵仅支持ND格式。 |
extend_params |
输入 |
支持bias、fixpipe反量化及TF32舍入模式TransMode功能,详见下表。 |
表2:extend_params参数说明
参数名 |
说明 |
|---|---|
scale |
表示pertensor量化场景(使用同一个缩放因子将高精度数映射到低精度数)输出矩阵反量化的参数。 |
scale_tensor |
表示perchannel量化场景(对每一个输出通道独立计算一套量化参数)输出矩阵反量化的矩阵。 |
bias_tensor |
表示偏置矩阵。 |
relu_type |
表示输出矩阵是否进行ReLu操作。 |
trans_mode |
表示是否使能TF32计算及TF32舍入模式。 |
返回值说明#
返回值为out 矩阵(Tensor)。
约束说明#
Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持DT_HF8,DT_FP8E5M2,DT_FP8E4M3,不支持extend_params中的trans_mode参数。
Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持DT_HF8,DT_FP8E5M2,DT_FP8E4M3,不支持extend_params中的trans_mode参数。
调用matmul接口前需要通过pypto.set_cube_tile_shapes设置M、N、K轴上的切分大小
当矩阵维度为3维或者4维时,需要调用pypto.set_vec_tile_shapes接口设置vector的TileShape切分,如未设置,接口内部会设置2维的vec_tile_shape,其值为128,128。
调用matmul接口的输入为调用pypto.reshape后的NZ格式时,需要调用pypto.set_matrix_size接口设置pypto.reshape前的输入到matmul的原始Shape的m,k,n值。
调用matmul接口的输入矩阵维度为3维/4维并且数据格式为NZ格式时,需要调用pypto.set_matrix_size接口设置输入到matmul的原始Shape的m,k,n值。
调用示例#
a1 = pypto.tensor([16, 32], pypto.DT_BF16, "tensor_a")
b1 = pypto.tensor([32, 64], pypto.DT_BF16, "tensor_b")
out1 = pypto.matmul(a1, b1, pypto.DT_BF16)
a2 = pypto.tensor((2, 16, 32), pypto.DT_FP16, "tensor_a")
b2 = pypto.tensor((2, 32, 16), pypto.DT_FP16, "tensor_b")
out2 = pypto.matmul(a2, b2, pypto.DT_FP16)
a3 = pypto.tensor((1, 32, 64), pypto.DT_FP32, "tensor_a")
b3 = pypto.tensor((3, 64, 16), pypto.DT_FP32, "tensor_b")
out3 = pypto.matmul(a3, b3, pypto.DT_FP32)
a = pypto.tensor((16, 32), pypto.DT_FP16, "tensor_a")
b = pypto.tensor((32, 64), pypto.DT_FP16, "tensor_b")
bias = pypto.tensor((1, 64), pypto.DT_FP16, "tensor_bias")
extend_params = {'bias_tensor': bias}
pypto.matmul(a, b, pypto.DT_FP32, a_trans=False, b_trans=False, c_matrix_nz=False, extend_params=extend_params)
a = pypto.tensor((16, 32), pypto.DT_INT8, "tensor_a")
b = pypto.tensor((32, 64), pypto.DT_INT8, "tensor_b")
extend_params = {'scale': 0.2}
pypto.matmul(a, b, pypto.DT_BF16, a_trans=False, b_trans=False, c_matrix_nz=False, extend_params=extend_params)
a = pypto.tensor((16, 32), pypto.DT_INT8, "tensor_a")
b = pypto.tensor((32, 64), pypto.DT_INT8, "tensor_b")
extend_params = {'scale': 0.2, 'relu_type': pypto.ReLuType.RELU}
pypto.matmul(a, b, pypto.DT_BF16, a_trans=False, b_trans=False, c_matrix_nz=False, extend_params=extend_params)
a = pypto.tensor((16, 32), pypto.DT_INT8, "tensor_a")
b = pypto.tensor((32, 64), pypto.DT_INT8, "tensor_b")
scale_tensor = pypto.tensor((1, 64), pypto.DT_UINT64, "tensor_scale")
extend_params = {'scale_tensor': scale_tensor, 'relu_type': pypto.ReLuType.RELU}
pypto.matmul(a, b, pypto.DT_BF16, a_trans=False, b_trans=False, c_matrix_nz=False, extend_params=extend_params)