昇腾社区首页
中文
注册

aclnnAddRmsNormDynamicQuant

产品支持情况

产品 是否支持
[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] ×

功能说明

  • 算子功能:RmsNorm算子是大模型常用的归一化操作,相比LayerNorm算子,其去掉了减去均值的部分。DynamicQuant算子则是为输入张量进行对称动态量化的算子。AddRmsNormDynamicQuant算子将RmsNorm前的Add算子和RmsNorm归一化输出给到的1个或2个DynamicQuant算子融合起来,减少搬入搬出操作。

  • 计算公式:

    x=x1+x2x=x_{1}+x_{2} y=RmsNorm(x)=xRms(x)gamma, where Rms(x)=1ni=1nxi2+epsilony = \operatorname{RmsNorm}(x)=\frac{x}{\operatorname{Rms}(\mathbf{x})}\cdot gamma, \quad \text { where } \operatorname{Rms}(\mathbf{x})=\sqrt{\frac{1}{n} \sum_{i=1}^n x_i^2+epsilon}
    • 若smoothScale1Optional和smoothScale2Optional均不输入,则y2Out和scale2Out输出无实际意义。计算过程如下所示:
    scale1Out=row_max(abs(y))/127scale1Out=row\_max(abs(y))/127 y1Out=round(y/scale1Out)y1Out=round(y/scale1Out)
    • 若仅输入smoothScale1Optional,则y2Out和scale2Out输出无实际意义。计算过程如下所示:input=ysmoothScale1Optionalinput = y\cdot smoothScale1Optional scale1Out=row_max(abs(input))/127scale1Out=row\_max(abs(input))/127
    y1Out=round(input/scale1Out)y1Out=round(input/scale1Out)
    • 若smoothScale1Optional和smoothScale2Optional均输入,则算子的五个输出均为有效输出。计算过程如下所示:input1=ysmoothScale1Optionalinput1 = y\cdot smoothScale1Optional input2=ysmoothScale2Optionalinput2 = y\cdot smoothScale2Optional scale1Out=row_max(abs(input1))/127scale1Out=row\_max(abs(input1))/127 scale2Out=row_max(abs(input2))/127scale2Out=row\_max(abs(input2))/127 y1Out=round(input1/scale1Out)y1Out=round(input1/scale1Out) y2Out=round(input2/scale2Out)y2Out=round(input2/scale2Out)

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

函数原型

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

  • aclnnStatus aclnnAddRmsNormDynamicQuantGetWorkspaceSize( const aclTensor *x1, const aclTensor *x2, const aclTensor *gamma, const aclTensor *smoothScale1Optional, const aclTensor *smoothScale2Optional, double epsilon, const aclTensor *y1Out, const aclTensor *y2Out, const aclTensor *xOut, const aclTensor *scale1Out, const aclTensor *scale2Out, uint64_t *workspaceSize, aclOpExecutor **executor)
  • aclnnStatus aclnnAddRmsNormDynamicQuant(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)

aclnnAddRmsNormDynamicQuantGetWorkspaceSize

  • 参数说明:

    • x1(aclTensor*,计算输入):表示标准化过程中的源数据张量,公式中的x1,Device侧的aclTensor。shape支持2-8维,数据类型支持FLOAT16、BFLOAT16。undefined支持ND,支持undefined
    • x2(aclTensor*,计算输入):表示标准化过程中的源数据张量,公式中的x2,Device侧的aclTensor。shape和数据类型需要与x1保持一致。undefined支持ND,支持undefined
    • gamma(aclTensor*,计算输入):表示标准化过程中的权重张量,公式中的gamma,Device侧的aclTensor。shape支持1维,shape需要与x1最后一维一致,数据类型需要与x1保持一致。undefined支持ND,支持undefined
    • smoothScale1Optional(aclTensor*,计算输入):表示量化过程中得到y1使用的smoothScale张量,公式中的smoothScale1Optional,Device侧的aclTensor。可选参数,支持传入空指针。shape和数据类型需要与gamma保持一致。undefined支持ND,支持undefined
    • smoothScale2Optional(aclTensor*,计算输入):表示量化过程中得到y2使用的smoothScale张量,公式中的smoothScale2Optional,Device侧的aclTensor。可选参数,支持传入空指针。必须与smoothScale1Optional配套使用。shape和数据类型需要与gamma保持一致。undefined支持ND,支持undefined
    • epsilon(double,计算输入):用于防止除0错误,公式中的epsilon,数据类型为double,建议传入较小正数,如1e-6。
    • y1Out(aclTensor*,计算输出):表示量化输出Tensor,公式中的y1Out,Device侧的aclTensor。shape需要与输入x1/x2一致,或者是二维并且第一维等于x1除最后一维的维度乘积,第二维等于x1的最后一维,数据类型支持INT8,undefined支持ND,支持undefined
    • y2Out(aclTensor*,计算输出):表示量化输出Tensor,公式中的y2Out,Device侧的aclTensor。当smoothScale2Optional不存在时,此输出无意义。shape需要与y1Out一致,数据类型支持INT8,undefined支持ND,支持undefined
    • xOut(aclTensor*,计算输出):表示x1和x2的和,公式中的x,Device侧的aclTensor。shape和数据类型需要与输入x1/x2一致,undefined支持ND,支持undefined
    • scale1Out(aclTensor*,计算输出):第一路量化的输出,公式中的scale1Out,Device侧的aclTensor。shape需要与输入x1除最后一维后的shape一致,或者与x1除最后一维的乘积一致,数据类型支持FLOAT32。undefined支持ND,支持undefined
    • scale2Out(aclTensor*,计算输出):第二路量化的输出,公式中的scale2Out,Device侧的aclTensor。当smoothScale2Optional不存在时,此输出无意义。shape需要与scale1Out一致,数据类型支持FLOAT32。undefined支持ND,支持undefined
    • workspaceSize(uint64_t*,出参):返回需要在Device侧申请的workspace大小。
    • executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
  • 返回值:

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

    [object Object]

aclnnAddRmsNormDynamicQuant

  • 参数说明:

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

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

约束说明

  • 支持类型说明

    是否支持空tensor:支持空进空出。

  • 数据格式说明

    所有输入输出Tensor的数据格式推荐使用ND格式,其他数据格式会由框架默认转换成ND格式进行处理。

  • 各产品型号支持数据类型说明

    x1数据类型 x2数据类型 gamma数据类型 smoothScale1Optional数据类型 smoothScale2Optional数据类型 y1Out数据类型 y2Out数据类型 xOut数据类型 scale1Out数据类型 scale2Out数据类型
    FLOAT16 FLOAT16 FLOAT16 FLOAT16 FLOAT16 INT8 INT8 FLOAT16 FLOAT32 FLOAT32
    BFLOAT16 BFLOAT16 BFLOAT16 BFLOAT16 BFLOAT16 INT8 INT8 BFLOAT16 FLOAT32 FLOAT32

调用示例

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

[object Object]