int8 矩阵乘法

本文主要讲述 quantized 版本的矩阵乘法的计算流程,矩阵乘如下:
C = A × B C=A\times B C=A×B
其中 A A A 为 uint8 类型, B B B 为 int8 类型,C为 uint8 类型。其详细计算流程为u8s8->s32. s32 需要 dequantize 成 fp32 类型, 然后再经过quantize 才能变成 uint8 类型。在 affine 量化中,s32 类型的 zero_point 为 0.
A 矩阵采用 per tensor 量化, B 矩阵采用 per_channel 量化
A i i n t 8 = A i f p 32 s c a l e A + z e r o A A_i^{int8} = \frac{A_i^{fp32}}{scale_{A}} + zero_A Aiint8=scaleAAifp32+zeroA

B i i n t 8 = B i f p 32 s c a l e B c o l j + z e r o B c o l j B_i^{int8} = \frac{B_i^{fp32}}{scale_{B_{col_j}}} + zero_{B_{col_j}} Biint8=scaleBcoljBifp32+zeroBcolj
A i i n t 8 × B i i n t 8 = ( A i f p 32 s c a l e A + z e r o A ) × ( B i f p 32 s c a l e B c o l j + z e r o B c o l j ) = ( A i f p 32 × B i f p 32 s c a l e A × s c a l e B c o l j ) + z e r o A × B i i n t 8 +       A i i n t 8 × z e r o B c o l j − z e r o A × z e r o B c o l j = A i f p 32 × B i f p 32 + z e r o A × B i i n t 8 +       A i i n t 8 × z e r o B c o l j − z e r o A × z e r o B c o l j \begin{aligned} A_i^{int8} \times B_i^{int8} &= (\frac{A_i^{fp32}}{scale_{A}} + zero_A) \times (\frac{B_i^{fp32}}{scale_{B_{col_j}}} + zero_{B_{col_j}})\\ &=(\frac{A_i^{fp32} \times B_i^{fp32}}{scale_{A} \times scale_{B_{col_j}}} ) + zero_A \times B_i^{int8}+ \\ & \space \space \space \space \space A_i^{int8} \times zero_{B_{col_j}} - zero_A \times zero_{B_{col_j}}\\ &=A_i^{fp32} \times B_i^{fp32} + zero_A \times B_i^{int8}+ \\ & \space \space \space \space \space A_i^{int8} \times zero_{B_{col_j}} - zero_A \times zero_{B_{col_j}} \\ \end{aligned} Aiint8×Biint8=(scaleAAifp32+zeroA)×(scaleBcoljBifp32+zeroBcolj)=(scaleA×scaleBcoljAifp32×Bifp32)+zeroA×Biint8+     Aiint8×zeroBcoljzeroA×zeroBcolj=Aifp32×Bifp32+zeroA×Biint8+     Aiint8×zeroBcoljzeroA×zeroBcolj

∑ i = 0 k − 1 A i i n t 8 × B i i n t 8 = ∑ i = 0 k − 1 A i f p 32 × B i f p 32 + z e r o A × ∑ i = 0 k − 1 B i i n t 8 +       z e r o B c o l j × ∑ i = 0 k − 1 A i i n t 8 − z e r o A × ∑ i = 0 k − 1 B c o l j = ∑ i = 0 k − 1 A i f p 32 × B i f p 32 + z e r o A × ( ∑ i = 0 k − 1 B i i n t 8 − ∑ i = 0 k − 1 B c o l j ) +       z e r o B c o l j × ∑ i = 0 k − 1 A i i n t 8 \begin{aligned} \sum _{i=0}^{k-1}{A_i^{int8}\times B_i^{int8} } &=\sum _{i=0}^{k-1}{A_i^{fp32}\times B_i^{fp32} } + zero_A\times \sum _{i=0}^{k-1}{B_i^{int8}} + \\ & \space \space \space \space \space zero_{B_{col_j}}\times \sum _{i=0}^{k-1}{A_i^{int8}} - zero_A \times \sum _{i=0}^{k-1} B_{col_j}\\ &=\sum _{i=0}^{k-1}{A_i^{fp32}\times B_i^{fp32} } +zero_A \times(\sum _{i=0}^{k-1}{B_i^{int8}} - \sum _{i=0}^{k-1} B_{col_j} ) + \\ &\space \space \space \space \space zero_{B_{col_j}}\times \sum _{i=0}^{k-1}{A_i^{int8}} \end{aligned} i=0k1Aiint8×Biint8=i=0k1Aifp32×Bifp32+zeroA×i=0k1Biint8+     zeroBcolj×i=0k1Aiint8zeroA×i=0k1Bcolj=i=0k1Aifp32×Bifp32+zeroA×(i=0k1Biint8i=0k1Bcolj)+     zeroBcolj×i=0k1Aiint8

所以:
∑ i = 0 k − 1 A i f p 32 × B i f p 32 = ∑ i = 0 k − 1 A i i n t 8 × B i i n t 8 − z e r o B c o l j × ∑ i = 0 k − 1 A i i n t 8 −       z e r o A × ( ∑ i = 0 k − 1 B i i n t 8 − ∑ i = 0 k − 1 B c o l j ) \begin{aligned} \sum _{i=0}^{k-1}{A_i^{fp32}\times B_i^{fp32} } &=\sum _{i=0}^{k-1}{A_i^{int8}\times B_i^{int8} } - zero_{B_{col_j}}\times \sum _{i=0}^{k-1}{A_i^{int8}} - \\ & \space \space \space \space \space zero_A \times(\sum _{i=0}^{k-1}{B_i^{int8}} - \sum _{i=0}^{k-1} B_{col_j} ) \end{aligned} i=0k1Aifp32×Bifp32=i=0k1Aiint8×Biint8zeroBcolj×i=0k1Aiint8     zeroA×(i=0k1Biint8i=0k1Bcolj)
其中 ( ∑ i = 0 k − 1 B i i n t 8 − ∑ i = 0 k − 1 B c o l j ) (\sum _{i=0}^{k-1}{B_i^{int8}} - \sum _{i=0}^{k-1} B_{col_j} ) (i=0k1Biint8i=0k1Bcolj) 为第 i i i 列的col_offset, ∑ i = 0 k − 1 A i i n t 8 \sum _{i=0}^{k-1}{A_i^{int8}} i=0k1Aiint8 为 A 矩阵第 i i i 行的 row_offset

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值