矩阵 A 已经完成了按行量化,每一行都给出了:
因此只需要对矩阵 B 做同样的 8 bit 量化,然后直接计算整数点积。
在模型量化中,通常需要将高精度数据类型(如 float)转换为低精度整数类型(如 int8)。一种常见的线性量化方式如下。
量化公式:
q=round(sr)反量化公式:
r=s×q其中,r 表示原始浮点数,q 表示量化后的整数,s 表示缩放因子。对于 n bit 量化,缩放因子可以计算为:
s=2n−1−1max(∣rmin∣,∣rmax∣)利用上述方法,可以按行或按列将浮点矩阵量化为整数矩阵,同时为每一行或每一列额外保存一个缩放因子。
为了进一步避免在计算过程中使用浮点数,还可以将缩放因子 s 表示为两个整数 a 和 b:
s=2ba这样,缩放因子之间的乘法和加法就可以转化为整数运算、移位和加法操作。
例如:
f1=2b1a1,f2=2b2a2对于乘法:
f1×f2=2b1+b2a1a2对于加法,可以先将两个数对齐到相同的指数:
f1+f2=2max(b1,b2)(a1≪(max(b1,b2)−b1))+(a2≪(max(b1,b2)−b2))现在需要根据以上规则,完成矩阵的全整型量化与乘法计算。
给定已经完成全整型量化的矩阵 A,以及尚未量化的浮点矩阵 B,请计算矩阵乘积 C=A×B,并以全整型量化的形式输出结果矩阵 C。
第一行输入三个整数:
m k n
表示矩阵 A 的大小为 m×k,矩阵 B 的大小为 k×n。
接下来输入 m 行,每行包含 k+2 个整数:
[-127,127];其中:
[0,127];[0,30]。接下来输入矩阵 B。
为了便于按列进行量化,输入按照 BT 的形式给出,即接下来输入 n 行,每行包含 k 个浮点数,其中第 i 行表示矩阵 B 的第 i 列。
输出全整型量化后的结果矩阵 C。
矩阵 C 的大小为 m×n,每个元素使用三个整数表示,依次为:
量化值 scale的a scale的b
其中对应的缩放因子为:
scale=2ba矩阵 B 在量化时采用 8 bit 量化,即量化后的整数范围为 [-127,127]。
需要注意,结果矩阵中的“量化值”是两个整数量化向量的点积,因此不需要再次限制在 [-127,127] 范围内。
结果的缩放因子也无需进行约分。
2 2 2
64 127 65 12
95 127 65 11
1.0 3.0
2.0 4.0
18817 6305 24 20225 4225 23
20119 6305 23 22209 4225 22
输出共有 2 行,每行包含 2 个结果元素。
每个结果元素均使用三个整数表示,分别对应量化值以及缩放因子的 a、b。
2 2 1
64 127 65 12
95 127 65 11
1.0 3.0
18817 6305 24
20119 6305 23
矩阵 A 的大小为 2×2,矩阵 B 的大小为 2×1,因此结果矩阵 C 的大小为 2×1。
矩阵 A 的第一行原始数据为 [1,2],量化后为 [64,127],对应缩放因子为:
矩阵 A 的第二行原始数据为 [3,4],量化后为 [95,127],对应缩放因子为:
矩阵 B 的第一列为 [1.0,3.0]。
使用 8 bit 量化后得到:
[42,127]
对应的缩放因子表示为:
scaleB=21297计算 A 的第一行与 B 的第一列的整数点积:
64×42+127×127=18817对应的缩放因子为:
21265×21297=2246305因此第一个结果元素输出为:
18817 6305 24
同理,第二个结果元素为:
20119 6305 23
量化后每个整数的取值范围为 [-127,127]。
缩放因子中,a 的取值范围为 [0,127],b 的取值范围为 [0,30]。
输出结果无需约简。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册