解题思路
本题实现一种常见的线性层 INT8 量化推理流程:对输入矩阵 X 做 per-token(按行)量化,对权重矩阵 W 做 per-channel(按列)量化,然后在 INT32 累加域中完成矩阵乘法,最后用缩放因子反量化回 FP32 输出。
核心算法分为 4 步:
-
计算缩放因子(scale)
题目内容
在深度学习模型部署中,为降低内存占用与计算延迟,常采用量化技术将FP32参数转换为低精度格式(如INT8)。本题要求实现一种INT8量化策略,对输入矩阵X与权重矩阵W分别进行per−token(按行)和per−channel(按列)量化,计算量化后矩阵相乘(带scales)的结果并输出。
原始矩阵:
量化参数:
- sX(i):第i个Token的缩放因子(per−token)
- sW(j):第j个Channel的缩放因子(per−channel)
2. 量化公式
(1) Per-Token 量化(输入矩阵 X)
-
缩放因子计算:
sX(i)=127maxk∈[1,K]∣Xi,k∣,∀i∈[1,M]
-
量化公式:
QX(i,k)=clip(round(sX(i)Xi,k),−127,127)
-
反量化恢复:
X^i,k=QX(i,k)⋅sX(i)
注意:
- round:四舍五入取整函数【按Python round()函数处理逻辑,奇进偶弃舍入法。即非0.5的情况:遵循常规的四舍五入规则。0.5情况:舍入到最接近的偶数。】
- clip(x,−127,127):将超过区间的值截断到[−127,127]范围内,超过127则为127,小于−127同理。
(2) Per−Channel 量化(权重矩阵 W)
sW(j)=127maxk∈[1,K]∣Wk,j∣,∀j∈[1,N]
QW(k,j)=clip(round(sW(j)Wk,j),−127,127)
W^k,j=QW(k,j)⋅sW(j)
3.量化矩阵乘法
(1) INT8 矩阵乘法(量化后计算)
Yint32(i,j)=∑k=1KQX(i,k)⋅QW(k,j)
(2) 反量化到 FP32
Yfp32(i,j)=Yint32(i,j)⋅sX(i)⋅sW(j)
- 组合缩放因子:每个元素的缩放因子为 sX(i)⋅sW(j)。
输入描述
输入为矩阵
X∈RM×K 输入矩阵
W∈RK×N 权重矩阵
其中
0<M,K,N<=128
−1000000.0<= 矩阵元素值 <=1000000.0
标准输入方式读入,按照X、W顺序读入,前两个数字为矩阵大小。
输出描述
输出量化后矩阵相乘结果(带scale计算),并四舍五入到小数点后两位小数【建议使用Python format(num, '.2f')处理】。注意:每行结果以单个空格间隔,头尾不要有多余空格。
样例1
输入
2 2
1.0 0.5
-0.5 2.0
2 2
0.8 -0.3
1.2 1.5
输出
1.41 0.46
2.00 3.15
说明
样例2
输入
2 3
1.2 -2.3 3.4
-4.5 5.6 -6.7
3 2
0.8 -1.9
2.0 -2.1
3.2 3.3
输出
7.27 13.78
-13.92 -25.37
说明
以上输入对应如下矩阵内容:
输入矩阵 X(2∗3,M=2 Tokens)
X=[1.2−4.5−2.35.63.4−6.7]
权重矩阵 W(3∗2,N=2 Channels)
W=0.82.03.2−1.9−2.13.3
对应如下矩阵结果:
outfp32=[7.27−13.9213.78−25.37]