对于,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]需要对矩阵计算结果进行量化/反量化操作的场景,当前该场景下,Matmul输入输出矩阵支持的数据类型如下表所示。
表 2 Matmul量化/反量化支持的数据类型
[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类型。