随路量化
特性说明
矩阵计算的搬出过程中支持随路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~31 | M1 | 32位数视为float,硬件以(1, 8, 10)的格式,即1个符号位、8个指数位和10个尾数位作为量化计算所需要乘的值。其中31位为符号位,23~30位为指数位,13~22位为尾数位。 |
| •(V)REQ8 •(V)QF322B8_PRE •(V)DEQF16 | 32~35 | N | 4位比特位,表示范围为[1, 16](b'0000对应表示1,b'1111对应表示16)。 当模式为(V)REQ8时,MCB标志位置为1时,将输入的值进行右移N比特位。当模式为(V)QF322B8_PRE,N为无效变量。 |
| •(V)REQ8 •(V)QF322B8_PRE •(V)DEQF16 | 36 | MCB标志位 | 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~45 | Offset | 9bit的整型数据,源数据乘以量化系数或者随路系数的计算结果,可以与Offset表示的整数值进行相加。若不使用offset,请置为0。 当模式为(V)DEQF16时,此变量为无效变量。 |
| •(V)REQ8 •(V)QF322B8_PRE •(V)DEQF16 | 46 | Sign标志位 | 如果置为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~31 | M1 | 数据类型视为float,硬件以(1, 8, 10)的格式,即1个符号位、8个指数位和10个尾数位作为量化计算所需要乘的值。其中31位为符号位,23~30位为指数位,13~22位为尾数位。其值不能为inf/nan。 |
| 同第一行 | 32~36 | - | 无效比特位,用户无需关注。 |
| 同第一行 | 37~45 | Offset | 9bit整形数据,源数据乘以量化系数或者随路系数的计算结果,可以与Offset表示的整数值进行相加。若不使用offset,请置为0。当模式为(V)REQ8、(V)QF322B8_PRE时该变量生效。 |
| 同第一行 | 46 | Sign标志位 | 如果置为1,表明量化结果是signed(int8);如果为置为0,表明量化结果是unsigned(uint8)。仅在(V)REQ8、(V)QF322B8_PRE中会用到。 |
| 同第一行 | 47~63 | - | 无效比特位,用户无需关注。 |
使用示例
完整样例请参考fixpipe_l0c2gm样例。