昇腾社区首页
中文
注册

aclnnAddLayerNormQuant

产品支持情况

产品 是否支持
[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object] ×
[object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object] ×
[object Object]Atlas 200I/500 A2 推理产品[object Object] ×
[object Object]Atlas 推理系列产品 [object Object] ×
[object Object]Atlas 训练系列产品[object Object] ×

功能说明

  • 算子功能:LayerNorm算子是大模型常用的归一化操作。AddLayerNormQuant算子将LayerNorm前的Add算子和LayerNorm归一化输出给到的1个或2个下游的量化算子融合起来,减少搬入搬出操作。LayerNorm下游的量化算子可以是Quantize、AscendQuantV2或是 DynamicQuant算子, 具体的量化算子类型由attr入参divMode和quantMode决定。当下游有2个量化算子时,2个量化算子的算子类型、输入输出dtype组合和可选输入的组合需要完全一致。
  • 计算公式x=x1+x2+biasOptionalx = x1 + x2 + biasOptional y=xE(x)Var(x)+epsilongamma+betay = {{x-E(x)}\over\sqrt {Var(x)+epsilon}} * gamma + beta
    • 当quantMode输入为"static"时,输出outScales1Out和outScales2Out无实际意义。 取决于divMode的输入, 融合的量化算子可能是Quantize或是AscenduantV2:

      • 当divMode输入为true时,融合的量化算子为Quantize,计算公式如下所示:

        y1Out=round(y/scales1Optional+zeroPoints1Optional)y1Out = round(y / scales1Optional + zeroPoints1Optional) y2Out=round(y/scales2Optional+zeroPoints2Optional),当且仅当scales2Optional存在y2Out = round(y / scales2Optional + zeroPoints2Optional), \quad \text{当且仅当scales2Optional存在}
      • 当divMode输入为false时,融合的量化算子为AscendQuantV2,计算公式如下所示:

        y1Out=round(yscales1Optional+zeroPoints1Optional)y1Out = round(y * scales1Optional + zeroPoints1Optional) y2Out=round(yscales2Optional+zeroPoints2Optional),当且仅当scales2Optional存在y2Out = round(y * scales2Optional + zeroPoints2Optional), \quad \text{当且仅当scales2Optional存在}
    • 当quantMode输入为"dynamic"时,输入zeroPoints1Optional和zeroPoints2Optional无实际意义。融合的量化算子是 DynamicQuant,此时divMode无效:

      • 若scales1Optional和scales2Optional均无输入, 则y2Out和scale2Out输出无实际意义。计算公式如下所示:

        outScales1Out=row_max(abs(y))/127outScales1Out = row\_max(abs(y))/127 y1Out=round(y/outScales1Out)y1Out = round(y / outScales1Out)
      • 若仅输入scales1Optional, 则y2Out和scale2Out输出无实际意义。计算公式如下所示:

        tmp1=yscales1Optionaltmp1 = y * scales1Optional outScales1Out=row_max(abs(tmp1))/127outScales1Out = row\_max(abs(tmp1))/127 y1Out=round(y/outScales1Out)y1Out = round(y / outScales1Out)
      • 若scales1Optional和scales2Optional均存在 , 则y2Out和scale2Out输出有效。计算公式如下所示:

        tmp1=yscales1Optional,tmp2=yscales2Optionaltmp1 = y * scales1Optional, \quad tmp2 = y * scales2Optional outScales1Out=row_max(abs(tmp1))/127,outScales2Out=row_max(abs(tmp2))/127outScales1Out = row\_max(abs(tmp1))/127, \quad outScales2Out = row\_max(abs(tmp2))/127 y1Out=round(y/outScales1Out),y2Out=round(y/outScales2Out)y1Out = round(y / outScales1Out),\quad y2Out = round(y / outScales2Out)

        其中row_max代表对每行求最大值

函数原型

每个算子分为undefined,必须先调用aclnnAddLayerNormQuantGetWorkspaceSize接口获取入参并根据计算流程所需workspace大小,再调用aclnnAddLayerNormQuant接口执行计算。

  • aclnnStatus aclnnAddLayerNormQuantGetWorkspaceSize(const aclTensor *x1, const aclTensor *x2, const aclTensor *gamma, const aclTensor *beta, const aclTensor *biasOptional, const aclTensor *scales1Optional, const aclTensor *scales2Optional, const aclTensor *zeroPoints1Optional, const aclTensor *zeroPoints2Optional, const char *quantMode, double epsilon, bool additionalOutput, bool divMode, aclTensor *y1Out, aclTensor *y2Out, aclTensor *xOut, aclTensor *outScales1Out, aclTensor *outScales2Out, uint64_t *workspaceSize, aclOpExecutor **executor)
  • aclnnStatus aclnnAddLayerNormQuant(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)

aclnnAddLayerNormQuantGetWorkspaceSize

  • 参数说明:

    • x1(aclTensor *,计算输入):表示AddLayerNorm中加法计算的输入,将会在算子内做x1 + x2 + biasOptional的计算并对计算结果做层归一化。是Device侧的aclTensor。当quantMode = "static"时,shape支持1-8维度, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, shape支持2-8维度,数据类型支持FLOAT16、BFLOAT16。undefined支持ND。
    • x2(aclTensor *,计算输入):表示AddLayerNorm中加法计算的输入,将会在算子内做x1 + x2 + biasOptional的计算并对计算结果做层归一化。是Device侧的aclTensor。shape和x1一致。当quantMode = "static"时, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, 数据类型支持FLOAT16、BFLOAT16。undefined支持ND。
    • gamma(aclTensor *,计算输入):对应LayerNorm计算公式中的gamma,表示层归一化中的gamma参数;是Device侧的aclTensor,当quantMode = "static"时, shape支持1-8维度,数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, shape支持1维度,数据类型支持FLOAT16、BFLOAT16。undefined支持ND,数据维度需要和x1/x2的最后几维相同。
    • beta(aclTensor *,计算输入):对应LayerNorm计算公式中的beta,表示层归一化中的beta参数;是Device侧的aclTensor,shape和gamma一致。当quantMode = "static"时, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, 数据类型支持FLOAT16、BFLOAT16。undefined支持ND。
    • biasOptional(aclTensor *,计算输入):可选输入参数,可以传入满足下述约束的aclTensor,或是使用nullptr占为表示该可选输入不存在。表示AddLayerNorm中加法计算的输入,将会在算子内做x1 + x2 + biasOptional的计算并对计算结果做层归一化;shape可以和gamma/beta或是和x1/x2一致,是Device侧的aclTensor。当quantMode = "static"时, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, 数据类型支持FLOAT16、BFLOAT16。undefined支持ND。
    • scales1Optional(aclTensor *,计算输入):可选输入参数,表示第一个被融合的量化计算子中的scale/smooth输入,具体的计算处理见以上公式;shape和gamma一致,是Device侧的aclTensor。当quantMode = "static"时, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, 数据类型支持FLOAT16、BFLOAT16。undefined支持ND。该可选输入参数传入时,取值约束参见undefined
    • scales2Optional(aclTensor *,计算输入):可选输入参数,表示第二个被融合的量化计算子中的scale/smooth输入,具体的计算处理见以上公式;shape和gamma一致,是Device侧的aclTensor。当quantMode = "static"时, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, 数据类型支持FLOAT16、BFLOAT16。undefined支持ND。该可选输入参数传入时,取值约束参见undefined
    • zeroPoints1Optional(aclTensor *,计算输入):可选输入参数,表示第一个被融合的量化计算子中的zeroPoints输入,仅在quantMode = "static"时有效,具体的计算处理见以上公式;shape和gamma一致,是Device侧的aclTensor。当quantMode = "static"时, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, 数据类型支持FLOAT16、BFLOAT16。undefined支持ND。该可选输入参数传入时,取值约束参见undefined
    • zeroPoints2Optional(aclTensor *,计算输入):可选输入参数,表示第二个被融合的量化计算子中的zeroPoints输入,仅在quantMode = "static"时有效,具体的计算处理见以上公式;shape和gamma一致,是Device侧的aclTensor。当quantMode = "static"时, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, 数据类型支持FLOAT16、BFLOAT16。undefined支持ND。该可选输入参数传入时,取值约束参见undefined
    • quantMode(char*,计算输入):量化模式,用于确定融合算子融的是静态还是动态量化算子,数据类型为string, 取值可以是 "static"或是 "dynamic"。
    • epsilon(double,计算输入):表对应LayerNorm中的epsilon,添加到分母中的值,以确保数值稳定;host侧的aclScalar,数据类型为double。
    • additionalOutput(bool,计算输入):表示是否开启x=x1+x2+biasOptional的输出,host侧的aclScalar,数据类型为bool。
    • divMode(bool,计算输入):仅在quantMode = "static"时有效。表示静态量化处理scale的方法是乘法或是除法,当传入true时,算子量化计算中会对scale作除法计算。host侧的aclScalar,数据类型为bool。
    • y1Out(aclTensor *,计算输出):表示LayerNorm的结果输出y被第一路量化算子量化后的结果,Device侧的aclTensor,shape需要与输入x1/x2一致,数据类型支持INT8。undefined支持ND。
    • y2Out(aclTensor *,计算输出):表示LayerNorm的结果输出y被第二路量化算子量化后的结果,Device侧的aclTensor,shape需要与输入x1/x2一致,数据类型支持INT8。undefined支持ND。
    • xOut(aclTensor *,计算输出):表示Add的结果输出x,Device侧的aclTensor,shape需要与输入x1/x2一致,当quantMode = "static"时, 数据类型支持FLOAT32、FLOAT16、BFLOAT16; 当quantMode = "dynamic"时, 数据类型支持FLOAT16、BFLOAT16。undefined支持ND。
    • outScales1Out(aclTensor *,计算输出):表示第一路动态量化计算的outScale结果输出,仅在quantMode = "dynamic"时有效,数据类型支持FLOAT32。Device侧的aclTensor,shape为输入x1的shape剔除掉最后一维,undefined支持ND。
    • outScales2Out(aclTensor *,计算输出):表示第二路动态量化计算的outScale结果输出,仅在quantMode = "dynamic"时有效,数据类型支持FLOAT32。Device侧的aclTensor,shape为输入x1的shape剔除掉最后一维,undefined支持ND。
    • workspaceSize(uint64_t *,出参):返回需要在Device侧申请的workspace大小。
    • executor(aclOpExecutor **,出参):返回op执行器,包含了算子计算流程。
  • 返回值:

    aclnnStatus:返回状态码。(参见undefined

    [object Object]

aclnnAddLayerNormQuant

  • 参数说明:

    • workspace(void *,入参):在Device侧申请的workspace内存返回需要在Device侧。
    • workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口aclnnAddLayerNormQuantGetWorkspaceSize获取。
    • executor(aclOpExecutor *,入参):op执行器,包含了算子计算流程。
    • stream(aclrtStream,入参):指定执行任务的Stream。
  • 返回值:

    aclnnStatus:返回状态码。(具体参见undefined

约束说明

  • 功能维度

    • 可选输入(scales1Optional,scales2Optional,zeroPoints1Optional,zeroPoints2Optional)支持的可选输入组合如下所示:
      scales1Optional scales2Optional zeroPoints1Optional zeroPoints2Optional quantMode 是否合法
      T T T T "static" T
      T T T F "static" F
      T T F T "static" F
      T T F F "static" T
      T F T T "static" F
      T F T F "static" T
      T F F T "static" F
      T F F F "static" T
      F X X X "static" F
      T T F F "dynamic" T
      T F F F "dynamic" T
      F T F F "dynamic" F
      F F F F "dynamic" T
      X X T X "dynamic" F
      X X X T "dynamic" F
      其中 T 代表可选输入存在 / 情形合法, F 代表可选输入不存在 / 情形不合法;X代表任意情况均可。
  • 各产品支持数据类型说明

    • 当 quantMode 为 "static" 时

      x1 数据类型 x2 数据类型 gamma 数据类型 beta 数据类型 bias 数据类型 scale1 数据类型 scale2 数据类型 zeroPoints1 数据类型 zeroPoints2 数据类型 y1 数据类型 y2 数据类型 x 数据类型 outScale1 数据类型 outScale2 数据类型
      float16 float16 float16 float16 float16 float16 float16 float16 float16 int8 int8 float16 float32 float32
      bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 int8 int8 bfloat16 float32 float32
      float32 float32 float32 float32 float32 float32 float32 float32 float32 int8 int8 float32 float32 float32
      float16 float16 float16 float16 float16 float32 float32 float32 float32 int8 int8 float16 float32 float32
      bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 float32 float32 float32 float32 int8 int8 bfloat16 float32 float32
    • 当 quantMode 为 "dynamic" 时

      x1 数据类型 x2 数据类型 gamma 数据类型 beta 数据类型 bias 数据类型 scale1 数据类型 scale2 数据类型 zeroPoints1 数据类型 zeroPoints2 数据类型 y1 数据类型 y2 数据类型 x 数据类型 outScale1 数据类型 outScale2 数据类型
      float16 float16 float16 float16 float16 float16 float16 float16 float16 int8 int8 float16 float32 float32
      bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 bfloat16 int8 int8 bfloat16 float32 float32

调用示例

示例代码如下,仅供参考,具体编译和执行过程请参考undefined

[object Object]