昇腾社区首页
中文
注册

常规matmul与叠加偏置

产品支持情况

硬件型号

是否支持

特殊说明

Atlas A3 推理系列产品 / Atlas A3 训练系列产品

-

Atlas A2 训练系列产品 / Atlas 800I A2 推理产品

-

Atlas 训练系列产品

x

-

Atlas 推理系列产品

-

Atlas 200I/500 A2 推理产品

不支持输入输出tensor数据类型为bf16的场景。

功能说明

常规矩阵乘matmul的功能,且可通过hasBias参数控制是否叠加偏置。

计算公式

矩阵乘输入两个张量A(x)和B(weight),输出张量为C:

叠加偏置,偏置矩阵为bias:

参数配置

成员名称

取值范围

特殊说明

transposeA

false/true

取值为true时,不支持部分场景,详见规格说明。float只支持false。

transposeB

false/true

float只支持true。

hasBias

false/true

float只支持false。

outDataType

ACL_DT_UNDEFINED

-

enAccum

false

-

matmulType

MATMUL_UNDEFINED

-

quantMode

QUANT_UNDEFINED

-

输入

参数

维度

数据类型

格式

描述

x

[m, k]/[batch, m, k]

float16/bf16/float

ND

矩阵乘的A矩阵。float只支持维度为[m, k]。

weight

[k, n]/[batch, k, n]/[1, n / 16, k, 16]/[batch, n / 16, k, 16]

float16/bf16/float

ND/NZ

矩阵乘的B矩阵,权重。float只支持维度[k, n],ND格式。

bias

[1, n]/[n]/[batch, n]

float16/bf16/float

ND

叠加的偏置矩阵。当hasBias取值为true时输入。

输出

参数

维度

数据类型

格式

描述

output

[m, n]/[batch, m, n]

float16/bf16/float

ND

矩阵乘计算结果。float只支持维度为[m, n]。

规格说明

由于输入输出的排列组合约束较复杂,下图列举了所有输入输出属性的组合,图中没有的组合即不支持:

图1 输入输出属性排列组合
  • Atlas 推理系列产品 不支持组合7-13。
  • “transposeA”取值为true时,不支持组合2、5、8、11。
  • 所有输入输出tensor的数据类型均相同。
  • 当weight维度为4维时,k和n的值均为16的整数倍。
  • 组合13仅保证如下shape的性能:m=1~256,k=7168, n=256,其他shape功能支持,性能可能会有下降。

OP使用与典型场景

OP使用时,可参考算子使用指导中的使用流程部分,其中,单算子构造Operation参数的构造方法参考下列各场景的参数构造部分。

  • 场景一
    // 参数构造
    atb::infer::LinearParam param;
    param.transposeA = false;
    param.transposeB = false;
    param.hasBias = false;
    param.outDataType = ACL_DT_UNDEFINED;
    param.enAccum = false;
    param.matmulType = MATMUL_UNDEFINED;
    param.quantMode = QUANT_UNDEFINED;
    # 计算示例
    >>> x
    tensor([[1, 2],
            [3, 4]])
    >>> weight
    tensor([[1, 2, 3],
            [4, 5, 6]])
    >>> output
    tensor([[9, 12, 15],
            [19, 26, 33]])
    # 9  = 1 * 1 + 2 * 4
    # 12 = 1 * 2 + 2 * 5
    # 15 = 1 * 3 + 2 * 6
    # 19 = 3 * 1 + 4 * 4
    # 26 = 3 * 2 + 4 * 5
    # 33 = 3 * 3 + 4 * 6
  • 场景二
    // 参数构造
    atb::infer::LinearParam param;
    param.transposeA = true;
    param.transposeB = true;
    param.hasBias = false;
    param.outDataType = ACL_DT_UNDEFINED;
    param.enAccum = false;
    param.matmulType = MATMUL_UNDEFINED;
    param.quantMode = QUANT_UNDEFINED;
    # 根据行列转置情况,该示例和前一示例计算相同。
    >>> x
    tensor([[1, 3],
            [2, 4]])
    >>> weight
    tensor([[1, 4],
            [2, 5],
            [3, 6]])
    >>> output
    tensor([[9, 12, 15],
            [19, 26, 33]])
  • 场景三
    // 参数构造
    atb::infer::LinearParam param;
    param.transposeA = false;
    param.transposeB = false;
    param.hasBias = true;
    param.outDataType = ACL_DT_UNDEFINED;
    param.enAccum = false;
    param.matmulType = MATMUL_UNDEFINED;
    param.quantMode = QUANT_UNDEFINED;
    # 计算示例
    >>> x
    tensor([[1, 2],
            [3, 4]])
    >>> weight
    tensor([[1, 2, 3],
            [4, 5, 6]])
    >>> bias
    tensor([1, 2, 3])
    >>> output
    tensor([[10, 14, 18],
            [20, 28, 36]])
    # 10 = 1 * 1 + 2 * 4 + 1
    # 14 = 1 * 2 + 2 * 5 + 2
    # 18 = 1 * 3 + 2 * 6 + 3
    # 20 = 3 * 1 + 4 * 4 + 1
    # 28 = 3 * 2 + 4 * 5 + 2
    # 36 = 3 * 3 + 4 * 6 + 3

功能约束

  • “transposeA”为true时不支持部分场景。
  • “outDataType”为ACL_DT_UNDEFINED。
  • “enAccum”为false。