昇腾社区首页
中文
注册
开发者
下载

aclnnAddRmsNormDynamicQuantV2

产品支持情况

产品 是否支持
[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算子融合起来,减少搬入搬出操作。AddRmsNormDynamicQuantV2算子相较于AddRmsNormDynamicQuant在RmsNorm计算过程中增加了偏置项betaOptional参数,即计算公式中的beta,以及新增输出配置项outputMaskOptional参数,用于配置是否输出对应位置的量化结果 。

  • 计算公式:

    x=x1+x2x=x_{1}+x_{2} y=RmsNorm(x)=xRms(x)gamma+beta, where Rms(x)=1ni=1nxi2+epsilony = \operatorname{RmsNorm}(x)=\frac{x}{\operatorname{Rms}(\mathbf{x})}\cdot gamma+beta, \quad \text { where } \operatorname{Rms}(\mathbf{x})=\sqrt{\frac{1}{n} \sum_{i=1}^n x_i^2+epsilon} input1={ysmoothScale1Optional  smoothScale1Optionaly! smoothScale1Optionalinput1 =\begin{cases} y\cdot smoothScale1Optional & \ \ smoothScale1Optional \\ y & !\ smoothScale1Optional \end{cases} input2={ysmoothScale2Optional  smoothScale2Optionaly! smoothScale2Optionalinput2 =\begin{cases} y\cdot smoothScale2Optional & \ \ smoothScale2Optional \\ y & !\ smoothScale2Optional \end{cases} scale1Out={row_max(abs(input1))/127outputMask[0]=True  !outputMask无效输出outputMask[0]=Falsescale1Out=\begin{cases} row\_max(abs(input1))/127 & outputMask[0]=True\ ||\ !outputMask \\ 无效输出 & outputMask[0]=False \end{cases} y1Out={round(input1/scale1Out)outputMask[0]=True  !outputMask无效输出outputMask[0]=Falsey1Out=\begin{cases} round(input1/scale1Out) & outputMask[0]=True\ ||\ !outputMask \\ 无效输出 & outputMask[0]=False \end{cases} scale2Out={row_max(abs(input2))/127outputMask[1]=True  (!outputMask & smoothScale1Optional & smoothScale2Optional)无效输出outputMask[1]=False  (!outputMask & smoothScale1Optional & !smoothScale2Optional)scale2Out=\begin{cases} row\_max(abs(input2))/127 & outputMask[1]=True\ ||\ (!outputMask\ \&\ smoothScale1Optional\ \&\ smoothScale2Optional) \\ 无效输出 & outputMask[1]=False\ ||\ (!outputMask\ \&\ smoothScale1Optional\ \&\ !smoothScale2Optional) \end{cases} y2Out={round(input2/scale2Out)outputMask[1]=True  (!outputMask & smoothScale1Optional & smoothScale2Optional)无效输出outputMask[1]=False  (!outputMask & smoothScale1Optional & !smoothScale2Optional)y2Out=\begin{cases} round(input2/scale2Out) & outputMask[1]=True\ ||\ (!outputMask\ \&\ smoothScale1Optional\ \&\ smoothScale2Optional)\\ 无效输出 & outputMask[1]=False\ ||\ (!outputMask\ \&\ smoothScale1Optional\ \&\ !smoothScale2Optional) \end{cases}

    公式中的row_max代表每行求最大值。

函数原型

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

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

aclnnAddRmsNormDynamicQuantV2GetWorkspaceSize

  • 参数说明:

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

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

    [object Object]

aclnnAddRmsNormDynamicQuantV2

  • 参数说明:

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

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

约束说明

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

  • 当outputMaskOptional不为空时,参数smoothScale1Optional有值时,则outputMaskOptional[0]必须为True。参数smoothScale2Optional有值时,则outputMaskOptional[1]必须为True。

  • 当outputMaskOptional不为空时,outputMaskOptional[0]与outputMaskOptional[1]不能同时为False。

  • 当outputMaskOptional为空时,参数smoothScale2Optional有值时,参数smoothScale1Optional也必须有值。

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

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

调用示例

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

[object Object]