昇腾社区首页
中文
注册

aclnnWeightQuantBatchMatmulV3

产品支持情况

  • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]
  • [object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]

功能说明

  • 算子功能:完成一个输入为伪量化场景的矩阵乘计算,并可以实现对于输出的量化计算。相较于aclnnWeightQuantBatchMatmulV2接口,此接口变化点为:

    新增innerPrecise参数,用于支持高精度或者高性能计算模式选择。A16W4 per_group场景在batchSize<=16的场景下可设置为1, 提升性能。

  • 计算公式

    y=x@ANTIQUANT(weight)+biasy = x @ ANTIQUANT(weight) + bias

    公式中的weightweight为伪量化场景的输入,其反量化公式ANTIQUANT(weight)ANTIQUANT(weight)

    ANTIQUANT(weight)=(weight+antiquantOffset)antiquantScaleANTIQUANT(weight) = (weight + antiquantOffset) * antiquantScale

    当客户配置quantScaleOptional输入时, 会对输出进行量化处理, 其量化公式为

    y=QUANT(x@ANTIQUANT(weight)+bias)=(x@ANTIQUANT(weight)+bias)quantScale+quantOffset\begin{aligned} y &= QUANT(x @ ANTIQUANT(weight) + bias) \\ &= (x @ ANTIQUANT(weight) + bias) * quantScale + quantOffset \\ \end{aligned}

    当客户配置quantScaleOptional输入为nullptr, 则直接输出:

    y=x@ANTIQUANT(weight)+biasy = x @ ANTIQUANT(weight) + bias

函数原型

每个算子分为undefined,必须先调用“aclnnWeightQuantBatchMatmulV3GetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnWeightQuantBatchMatmulV3”接口执行计算。

  • aclnnStatus aclnnWeightQuantBatchMatmulV3GetWorkspaceSize(const aclTensor *x, const aclTensor *weight, const aclTensor *antiquantScale, const aclTensor *antiquantOffsetOptional, const aclTensor *quantScaleOptional, const aclTensor *quantOffsetOptional, const aclTensor *biasOptional, int antiquantGroupSize, int innerPrecise, const aclTensor *y, uint64_t *workspaceSize, aclOpExecutor **executor)
  • aclnnStatus aclnnWeightQuantBatchMatmulV3(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)

aclnnWeightQuantBatchMatmulV3GetWorkspaceSize

  • 参数说明

    • x(aclTensor*, 计算输入):公式中的输入x,数据类型支持FLOAT16、BFLOAT16,undefined支持ND。undefined仅支持transpose场景。维度支持2维,shape支持(m, k),其中Reduce维度k需要与weight的Reduce维度k大小相等。

    • weight(aclTensor*,计算输入):公式中的输入weight,数据类型支持INT8、INT4、INT32(当weight数据格式为FRACTAL_NZ且数据类型为INT4/INT32时,或者当weight数据格式为ND且数据类型为INT32时,仅在INT4Pack场景支持,需要配合aclnnConvertWeightToINT4Pack接口完成从INT32到INT4Pack的转换,以及从ND到FRACTAL_NZ的转换,undefined),若数据类型为INT4,则weight的内轴应为偶数。undefined仅支持transpose场景。shape支持(k, n)。 对于不同伪量化算法模式,weight的数据格式为FRACTAL_NZ仅在如下场景下支持:

      • per_channel模式:
        • weight的数据类型为INT8,y的数据类型为非INT8。
        • weight的数据类型为INT4/INT32,weight转置,y的数据类型为非INT8。
      • per_group模式:weight的数据类型为INT4/INT32,weight非转置,x非转置,antiquantGroupSize为64或128,k为antiquantGroupSize对齐,n为64对齐,y的数据类型为非INT8。
    • antiquantScale(aclTensor*, 计算输入):实现输入反量化计算的反量化scale参数,反量化公式中的输入antiquantScale,数据类型支持FLOAT16、BFLOAT16、UINT64、INT64。当数据类型为FLOAT16、BFLOAT16时,要求和输入x的数据类型保持一致。当数据类型为UINT64、INT64时,x仅支持FLOAT16,不转置,weight仅支持int8,ND转置,模式仅支持per_channel,quantScaleOptional和quantOffsetOptional必须为空,m仅支持[1, 96],k和n要求64对齐,需要首先配合aclnnCast接口完成FLOAT16到FLOAT32的转换,undefined,再配合aclnnTransQuantParamV2接口完成FLOAT32到UINT64的转换,undefinedundefined支持ND。undefined仅支持transpose场景。 对于不同伪量化算法模式,antiquantScale支持的shape如下:

      • per_tensor模式:输入shape为(1,)或(1, 1)。
      • per_channel模式:输入shape为(1, n)或(n,)。
      • per_group模式:输入shape为(ceil(k, group_size), n)。
    • antiquantOffsetOptional(aclTensor*, 计算输入):实现输入反量化计算的反量化offset参数,反量化公式中的输入antiquantOffset,数据类型支持FLOAT16、BFLOAT16、INT32。当数据类型为FLOAT16、BFLOAT16时,要求和输入x的数据类型保持一致。当数据类型为INT32时,数据范围限制为[-128, 127],x仅支持FLOAT16,weight仅支持int8,antiquantScale仅支持UINT64/INT64。可选输入,当不需要时为空指针;存在时shape要求与antiquantScale一致。undefined支持ND。undefined仅支持transpose场景。

    • quantScaleOptional(aclTensor*, 计算输入):实现输出量化计算的量化参数,由量化公式中的quantScale和quantOffset的数据通过aclnnTransQuantParam接口转化得到。数据类型支持UINT64,undefined支持ND。不支持undefined。可选输入,当不需要时为空指针;对于不同的伪量化算法模式,支持的shape如下:

      • per_tensor模式:输入shape为(1,)或(1, 1)。
      • per_channel模式:输入shape为(1, n)或(n,)。
    • quantOffsetOptional(aclTensor*, 计算输入):实现输出量化计算的量化offset参数,量化公式中的输入quantOffset,数据类型支持FLOAT,undefined支持ND。可选输入,当不需要时为空指针;存在时shape要求与quantScaleOptional一致。不支持undefined

    • biasOptional(aclTensor*, 计算输入):偏置输入,公式中的输入bias。当输入x的数据类型为BFLOAT16时,数据类型要求为FLOAT;当输入x的数据类型为FLOAT16时,数据类型要求为FLOAT16。可选输入,当不需要时为空指针;存在输入时支持1维或2维,shape支持(n,)或(1, n)。支持ND。不支持undefined

    • antiquantGroupSize(int, 计算输入):表示伪量化per_group算法模式下,对输入weight进行反量化计算的groupSize输入,描述一组反量化参数对应的待反量化数据量在Reduce方向的大小。当伪量化算法模式不为per_group时传入0;当伪量化算法模式为per_group时传入值的范围为[32, k-1]且值要求是32的倍数。

    • innerPrecise (int, 计算输入):表示伪量化是高精度还是高性能计算模式(仅支持传入0或1)。A16W4 per_group场景在batchSize<=16的场景下可设置为1,并且weight数据格式设为FRACTAL_NZ,来提升性能。其他场景不建议使用,建议传入0。

      • 0:代表高精度模式。
      • 1:代表高性能模式。
    • y(aclTensor*, 计算输出):计算输出,公式中的y。当quantScaleOptional存在时,数据类型为INT8;当quantScaleOptional不存在时,数据类型支持FLOAT16、BFLOAT16,且与输入x的数据类型一致。维度支持2维,shape支持(m, n)。undefined支持ND。不支持undefined

    • workspaceSize(uint64_t*, 出参):返回需要在Device侧申请的workspace大小。

    • executor(aclOpExecutor**, 出参):返回op执行器,包含了算子计算流程。

  • 返回值:

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

    [object Object]

aclnnWeightQuantBatchMatmulV3

  • 参数说明

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

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

约束说明

  • per_channel模式:为提高性能,推荐使用transpose后的weight输入。m范围为[65, 96]时,推荐使用数据类型为UINT64/INT64的antiquantScale。

  • per_group模式:在A16W4,batchSize<=16的场景下可设置innerPrecise参数为1,并且weight数据格式设为FRACTAL_NZ,来提升性能,但会存在一定的精度下降。

调用示例

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

[object Object]