昇腾社区首页
中文
注册

LinearOperation

功能

将A、B两个矩阵进行矩阵乘运算,同时可以选择对矩阵乘的运算结果添加偏置、InplaceAdd融合或反量化操作。

算子本质上是接收x和weight两个输入tensor作为A矩阵和B矩阵进行矩阵乘运算,可通过参数“transposeA”“transposeB”控制做矩阵乘前是否需要对A矩阵和B矩阵进行行列转置,根据参数转置后的A矩阵和B矩阵需满足矩阵乘维度关系,例如,当“transposeA”为false,“transposeB”为true时,x和weight的shape可以分别为[m, k]和[n, k]。

该算子支持浮点和量化场景,当参数“outDataType”值为ACL_DT_UNDEFINED时为浮点场景,否则为量化场景。

图1 LinearOperation

计算公式

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

    • 叠加偏置的场景下,偏置矩阵为bias:

    • 做InplaceAdd融合场景下,做原地累加:

  • 反量化场景
    • 矩阵乘输入两个张量A(x)和B(weight),反量化步长为deqScale,输出张量为C,dequant为反量化处理函数:

    • 叠加偏置的场景下,偏置矩阵为bias:

  • 补充说明
    1. 若参数transposeA为true,A需进行转置,即计算公式中A替换为
    2. 同理,若参数transposeB为true,B需进行转置,即计算公式中B替换为

定义

struct LinearParam {
    bool transposeA = false;                   
    bool transposeB = true;                   
    bool hasBias = true;                       
    aclDataType outDataType = ACL_DT_UNDEFINED; 
    bool enAccum = false;                      
};

参数列表

成员名称

类型

默认值

描述

transposeA

bool

false

是否转置A矩阵, 默认值为false,不转置。

在量化场景下,非 Atlas 800I A2 推理产品 / Atlas A2 训练系列产品 仅支持配置为false。

transposeB

bool

true

是否转置B矩阵, 默认值为true,转置。

在量化场景下,非 Atlas 800I A2 推理产品 / Atlas A2 训练系列产品 仅支持配置为true。

hasBias

bool

true

是否叠加偏置,默认值为true,叠加偏置。

在量化场景下,非 Atlas 800I A2 推理产品 / Atlas A2 训练系列产品 仅支持配置为true。

“enAccum”为true时,仅支持配置为false。

outDataType

aclDataType

ACL_DT_UNDEFINED

输出数据类型,默认值为ACL_DT_UNDEFINED。

  • 浮点场景下:支持配置为ACL_DT_UNDEFINED。
  • 量化场景下: Atlas 800I A2 推理产品 / Atlas A2 训练系列产品 支持配置为ACL_FLOAT16/ACL_BF16,否则,仅支持配置为ACL_FLOAT16。

enAccum

bool

false

是否使能累加,默认值为false,不使能累加。

仅在 Atlas 800I A2 推理产品 / Atlas A2 训练系列产品 支持配置为true。

“hasBias”为true时,仅支持配置为false。

量化场景下,仅支持配置为false。

输入输出

  • 浮点场景
    • 场景说明

      当参数outDataType值为ACL_DT_UNDEFINED,参数enAccum值为false时,触发该场景,该场景下输入输出均为浮点类型。

    • 输入

      参数

      维度

      数据类型

      格式

      描述

      x

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

      float16/bf16

      ND

      输入tensor。矩阵乘的A矩阵。

      weight

      [k, n]/[batch, k, n]

      float16/bf16

      ND/NZ

      输入tensor。矩阵乘的B矩阵,权重。

      • 数据类型与x的数据类型相同。
      • 数据格式为NZ时,可扩展支持4维shape,对应支持的shape为[batch, n / 16, k, 16],这种情况下,n和k的值均为16的整数倍。
      • shape为3维时,x的shape必须为3维。
      • 当transposeA为true时,batch值与x的batch值相同。

      bias

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

      float16/bf16/float

      ND

      输入tensor。叠加的偏置矩阵。

      • hasBias为true时输入。
      • 当数据类型为float16/bf16时,数据类型与x的数据类型相同;当数据类型为float时,触发matmul+add融合场景,仅 Atlas 800I A2 推理产品 / Atlas A2 训练系列产品 支持该场景,weight数据格式必须为ND。
      • batch值与weight的batch值相同。
    • 输出

      参数

      维度

      数据类型

      格式

      描述

      output

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

      float16/bf16

      ND

      输出tensor。维度数与x一致。数据类型与x的数据类型相同。

    • 规格约束
      1. x/weight为2维时,对应的batch值为1;bias为1维时,对应的batch为1。
      2. 当参数transposeB为true时,weight支持对应的4维shape[batch, k / 16, n, 16]。
  • matmul+inplaceAdd融合算子场景
    • 场景说明

      当参数“outDataType”值为ACL_DT_UNDEFINED,参数“enAccum”值为true时,触发该场景。

      该场景不支持 Atlas 推理系列产品 推理产品。

    • 输入

      参数

      维度

      数据类型

      格式

      描述

      x

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

      float16/bf16

      ND

      输入tensor。矩阵乘的A矩阵。

      weight

      [k, n]/[batch, k, n]

      float16/bf16

      ND

      输入tensor。矩阵乘的B矩阵,权重。

      • 数据类型与x的数据类型相同。
      • shape为3维时,x的shape必须为3维。
      • 当transposeA为true时,batch值与x的batch值相同。

      accum

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

      float

      ND

      输入tensor。累加矩阵,与matmul的结果做原地加。维度数与x的维度数相同。batch值与x的batch值相同。

    • 输出

      参数

      维度

      数据类型

      格式

      描述

      output

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

      float

      ND

      输出tensor。与accum为同一个Tensor,即二者数据类型、数据格式和地址等所有属性均相同。

    • 规格约束

      x/weight/accum为2维时,对应的batch值为1。

  • 反量化场景
    • 场景说明

      当参数“outDataType”值不为ACL_DT_UNDEFINED时,触发该场景。

    • 输入

      参数

      维度

      数据类型

      格式

      描述

      x

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

      int8

      ND

      矩阵乘的A矩阵。

      weight

      [k, n]/[batch, k, n]

      int8

      ND/NZ

      矩阵乘的B矩阵,权重。

      • Atlas 800I A2 推理产品 / Atlas A2 训练系列产品 仅支持数据格式为ND。
      • 数据格式为NZ时,可扩展支持4维shape,对应的shape为[batch, n / 32, k, 32],这种情况下,k为16的整数倍,n为32的整数倍。
      • shape为3维时,x的shape为3维。
      • 当transposeA为true时,batch值与x的batch值相同。

      bias

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

      int32

      ND

      叠加的偏置矩阵。hasBias为true时输入。batch值与weight的batch值相同。

      deqScale

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

      int64/uint64/float

      ND

      反量化的scale。

      • batch值与weight的batch值相同。
      • 当output数据类型为float16时,数据类型为int64/uint64;当output数据类型为bf16时,数据类型为float。
    • 输出

      参数

      维度

      数据类型

      格式

      描述

      output

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

      float16/bf16

      ND

      数据类型与参数outDataType值相同。维度数与x的维度数相同。

    • 规格约束
      1. x/weight为2维时,对应的batch值为1;bias/deqScale为1维时,对应的batch为1。
      2. 当参数transposeB为true时,weight支持对应的4维shape[batch, k / 32, n, 32],这种情况下,k为32的整数倍,n为16的整数倍。