Skip to content

随路量化

特性说明

矩阵计算的搬出过程中支持随路cast能力,cast mode为CAST_RINT模式。当L0C Buffer为float数据类型,输出为half/bfloat16数据类型,可以通过设置Fixpipe搬运参数结构体中的quantPre参数开启,或设置DataCopyCO12DstParams结构体参数中的quantPre参数开启,无需配置额外寄存器。使用cast输出half需配置为QuantMode_t::F322F16,使用cast输出bfloat16_t需配置为QuantMode_t::F322BF16。

同时矩阵计算的搬出过程中支持随路quant能力,当前支持两种模式的随路带参数的量化能力:

  • 同一系数(Scalar)的量化模式:整个C矩阵对应一个量化参数,量化参数的shape为[1]。可以通过设置quantPre参数,配置为对应的量化类型,若使用DataCopy实现矩阵搬出需要调用SetFixpipePreQuantFlag接口来设置scalar量化参数,其中scalar量化参数QUANT_PRE为uint64_t类型,低32位表示的是float类型的量化系数(硬件以(1, 8, 10)的格式进行计算,即1个符号位、8个指数位和10个尾数位,4B),量化参数QUANT_PRE具体含义参见表1
  • 向量(Tensor/Vector)的量化模式:C矩阵的shape为[m, n],每个channel维度即C矩阵的每一列,对应一个量化参数,量化参数的shape为[n]。可以通过设置quantPre参数,配置为对应的量化类型,若使用DataCopy实现矩阵搬出需要调用SetFixPipeConfig来设置tensor量化参数地址Quant_PRE_ADDR,其中tensor量化参数需要通过DataCopy从L1 Buffer搬运至Fixpipe Buffer。其中每个量化参数Quant_PRE_ADDR[i]为uint64_t类型(i为列索引),低32位表示的是float类型的量化系数(硬件以(1, 8, 10)的格式进行计算,即1个符号位、8个指数位和10个尾数位,4B)。量化参数Quant_PRE_ADDR[i]具体含义参见表1

当前支持的量化模式及其功能描述如下:

Text
DEQF16,                // DeQuant_Float16:int32_t反量化成half,scalar量化
VDEQF16,               // Vector_DeQuant_Float16:int32_t反量化成half,tensor量化
QF322B8_PRE,           // Quant_Float32_2_B8:float量化成int8_t/uint8_t,scalar量化
VQF322B8_PRE,          // Vector_Quant_Float32_2_B8:float量化成int8_t/uint8_t,tensor量化
REQ8,                  // ReQuant_int8:int32_t重量化成int8_t/uint8_t,scalar量化
VREQ8,                 // Vector_ReQuant_int8:int32_t重量化成int8_t/uint8_t,tensor量化

除上述量化模式外,Ascend 950PR/Ascend 950DT产品还额外支持以下量化模式:

Text
QF322FP8_PRE,          // Quant_Float32_2_FP8: float量化成fp8_e4m3fn_t,scalar量化
VQF322FP8_PRE,         // Vector_Quant_Float32_2_FP8: float量化成fp8_e4m3fn_t,tensor量化
QF322HIF8_PRE,         // Quant_Float32_2_HIF8: float量化成hifloat8_t(Half to Away Round),scalar量化
VQF322HIF8_PRE,        // Vector_Quant_Float32_2_HIF8: float量化成hifloat8_t(Half to Away Round),tensor量化
QF322HIF8_PRE_HYBRID,  // Quant_Float32_2_HIF8_Hybrid: float量化成hifloat8_t(Hybrid Round),scalar量化
VQF322HIF8_PRE_HYBRID, // Vector_Quant_Float32_2_HIF8_Hybrid: float量化成hifloat8_t(Hybrid Round),tensor量化
QS322BF16_PRE,         // Quant_Int32_2_BFloat16: int32_t量化成bfloat16_t,scalar量化
VQS322BF16_PRE,        // Vector_Quant_Int32_2_BFloat16: int32_t量化成bfloat16_t,tensor量化
QF322F16_PRE,          // Quant_Float32_2_Float16: float量化成half,scalar量化
VQF322F16_PRE,         // Vector_Quant_Float32_2_Float16: float量化成half,tensor量化
QF322BF16_PRE,         // Quant_Float32_2_BFloat16: float量化成bfloat16_t,scalar量化
VQF322BF16_PRE,        // Vector_Quant_Float32_2_BFloat16: float量化成bfloat16_t,tensor量化
QF322F32_PRE,          // Quant_Float32_2_Float32: float量化成float,scalar量化,精度可以达到双千分之一,无法达到双万分之一
VQF322F32_PRE,         // Vector_Quant_Float32_2_Float32: float量化成float,tensor量化,精度可以达到双千分之一,无法达到双万分之一

不同量化模式的量化算法详细介绍参见随路量化与随路ReLU场景组合

量化参数比特位含义见下表:

表1 量化参数QUANT_PRE比特位含义映射表(NPU架构版本2201

模式比特位数变量名作用介绍
•(V)REQ8
•(V)QF322B8_PRE
•(V)DEQF16
0~31M132位数视为float,硬件以(1, 8, 10)的格式,即1个符号位、8个指数位和10个尾数位作为量化计算所需要乘的值。其中31位为符号位,23~30位为指数位,13~22位为尾数位。
•(V)REQ8
•(V)QF322B8_PRE
•(V)DEQF16
32~35N4位比特位,表示范围为[1, 16](b'0000对应表示1,b'1111对应表示16)。
当模式为(V)REQ8时,MCB标志位置为1时,将输入的值进行右移N比特位。当模式为(V)QF322B8_PRE,N为无效变量。
•(V)REQ8
•(V)QF322B8_PRE
•(V)DEQF16
36MCB标志位Mode Control Bit。如果置为0,输入的int32_t会被直接转换为float,N为无效值。如果置为1,输入的int32_t会先右移N比特位,转变成int16_t,然后转换为float。当模式为(V)QF322B8_PRE时,此标志位为无效比特。
•(V)REQ8
•(V)QF322B8_PRE
•(V)DEQF16
37~45Offset9bit的整型数据,源数据乘以量化系数或者随路系数的计算结果,可以与Offset表示的整数值进行相加。若不使用offset,请置为0。
当模式为(V)DEQF16时,此变量为无效变量。
•(V)REQ8
•(V)QF322B8_PRE
•(V)DEQF16
46Sign标志位如果置为1,表明量化结果是signed(int8);如果置为0,表明量化结果是unsigned(uint8)。仅在(V)REQ8、(V)QF322B8_PRE中会用到。
•(V)REQ8
•(V)QF322B8_PRE
•(V)DEQF16
47~63-无效比特位,用户无需关注。

表2 量化参数QUANT_PRE比特位含义映射表(NPU架构版本3510

模式比特位数变量名作用介绍
•(V)REQ8
•(V)QF322B8_PRE
•(V)DEQF16
•(V)QF322FP8_PRE
•(V)QF322HIF8_PRE
•(V)QF322HIF8_PRE_HYBRID
•(V)QS322BF16_PRE
•(V)QF322F16_PRE
•(V)QF322BF16_PRE
•(V)QF322F32_PRE
0~12-无效比特位,用户无需关注。
同第一行13~31M1数据类型视为float,硬件以(1, 8, 10)的格式,即1个符号位、8个指数位和10个尾数位作为量化计算所需要乘的值。其中31位为符号位,23~30位为指数位,13~22位为尾数位。其值不能为inf/nan。
同第一行32~36-无效比特位,用户无需关注。
同第一行37~45Offset9bit整形数据,源数据乘以量化系数或者随路系数的计算结果,可以与Offset表示的整数值进行相加。若不使用offset,请置为0。当模式为(V)REQ8、(V)QF322B8_PRE时该变量生效。
同第一行46Sign标志位如果置为1,表明量化结果是signed(int8);如果为置为0,表明量化结果是unsigned(uint8)。仅在(V)REQ8、(V)QF322B8_PRE中会用到。
同第一行47~63-无效比特位,用户无需关注。

使用示例

完整样例请参考fixpipe_l0c2gm样例

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区