开发者
资源
[object Object][object Object]

对于,Matmul支持将计算结果从CO1搬出到Global Memory时,对输出C矩阵元素执行数据量化或反量化操作。

  • Matmul量化场景:Matmul计算时左矩阵A、右矩阵B为half或bfloat16_t数据类型,输出C矩阵为int8_t数据类型。该场景下,C矩阵的数据从CO1搬出到Global Memory时,会执行量化操作,将最终结果量化为int8_t类型,如下图所示。

    图 1 Matmul量化场景示意图[object Object][object Object]

  • Matmul反量化场景:Matmul计算时左矩阵A、右矩阵B为int8_t或int4b_t数据类型,输出C矩阵为half数据类型,或者左矩阵A、右矩阵B为int8_t数据类型,输出C矩阵为int8_t数据类型。该场景下,C矩阵的数据从CO1搬出到Global Memory时,会执行反量化操作,将最终结果反量化为对应的half类型或int8_t类型,如下图所示。

    图 2 Matmul反量化场景示意图[object Object][object Object]

Matmul量化/反量化包含两种模式:同一系数的量化/反量化模式、向量的量化/反量化模式,开发者在算子Tiling侧调用接口设置量化或反量化模式,这两种模式的具体区别为:

  • 同一系数的量化/反量化模式(PER_TENSOR模式):整个C矩阵对应一个量化参数,量化参数的shape为[1]。开发者在算子Kernel侧调用接口设置量化参数。
  • 向量的量化/反量化模式(PER_CHANNEL模式):C矩阵的shape为[m, n],每个channel维度即C矩阵的每一列,对应一个量化参数,量化参数的shape为[n]。开发者在算子Kernel侧调用接口设置量化参数。

表 1 量化/反量化模式对应的接口配置

[object Object][object Object]

[object Object][object Object]

需要对矩阵计算结果进行量化/反量化操作的场景,当前该场景下,Matmul输入输出矩阵支持的数据类型如下表所示。

表 2 Matmul量化/反量化支持的数据类型

[object Object][object Object]

[object Object][object Object]
  • 接口必须在或者接口前调用。

  • 在Kernel侧与Tiling侧设置的量化/反量化模式需要保持一致:

    • Kernel侧调用SetQuantScalar接口设置同一系数的量化/反量化模式,对应Tiling侧调用SetDequantType接口配置模式为DequantType::SCALAR。
    • Kernel侧调用SetQuantVector接口设置向量的量化/反量化模式,对应Tiling侧调用SetDequantType接口配置模式为DequantType::TENSOR。
  • 当A、B矩阵为int8_t或int4b_t类型,C矩阵为half时,本节特性的输出结果不支持INF_NAN模式。若结果需要以INF_NAN输出,建议在调用Matmul API时将结果输出到TPosition::VECIN,同时将输出的数据类型设置为int32_t,再基于AIV核使用高阶API 将该结果反量化为half类型。

[object Object]

完整的算子样例请参考

  • Tiling实现

    调用接口设置量化或反量化模式,其他实现内容与基础场景相同。

    [object Object]
  • Kernel实现

    根据具体量化模式场景,调用接口设置量化参数。其他实现内容与基础场景相同。

    • 同一系数的量化/反量化模式

      [object Object]
    • 向量的量化/反量化模式

      [object Object]