对称INT8量化方案
题目分析
实现神经网络推理中的对称 INT8 量化方案:对激活矩阵 A 和参数矩阵 B 分别量化,在整数域完成矩阵乘法后还原为浮点结果。
量化规则:
- 矩阵 A:按行(per-sample)量化,每行的缩放因子
- 矩阵 B:按列(per-channel)量化,每列的缩放因子
- 量化值:
- 还原:
思路
本题是一道模拟题,按照量化流程逐步实现即可。
- 量化矩阵 A:遍历每一行,计算该行绝对值最大值,求缩放因子,对每个元素做
round+clip得到 INT8 值。 - 量化矩阵 B:遍历每一列,计算该列绝对值最大值,求缩放因子,对每个元素做
round+clip得到 INT8 值。 - 整数矩阵乘法:
,结果为 INT32。
- 还原浮点:结果矩阵的第
行第
列乘以
,输出保留两位小数。
注意 Python 的 round() 采用银行家舍入(四舍六入五取偶),题目明确要求使用此规则。
代码
import sys
input = sys.stdin.readline
def solve():
# 读取矩阵 A
ra, ca = map(int, input().split())
A = []
for _ in range(ra):
A.append(list(map(float, input().split())))
# 读取矩阵 B
rb, cb = map(int, input().split())
B = []
for _ in range(rb):
B.append(list(map(float, input().split())))
# 量化 A:按行量化
sa = []
Qa = []
for i in range(ra):
max_abs = max(abs(x) for x in A[i])
if max_abs == 0:
sa.append(0.0)
Qa.append([0] * ca)
else:
s = max_abs / 127.0
sa.append(s)
row = []
for j in range(ca):
q = round(A[i][j] / s)
q = max(-127, min(127, q))
row.append(q)
Qa.append(row)
# 量化 B:按列量化
sb = []
Qb = [[0] * cb for _ in range(rb)]
for j in range(cb):
max_abs = max(abs(B[i][j]) for i in range(rb))
if max_abs == 0:
sb.append(0.0)
else:
s = max_abs / 127.0
sb.append(s)
for i in range(rb):
q = round(B[i][j] / s)
q = max(-127, min(127, q))
Qb[i][j] = q
# 整数矩阵乘法 + 还原
result = []
for i in range(ra):
row = []
for j in range(cb):
val = 0
for k in range(ca):
val += Qa[i][k] * Qb[k][j]
y = val * sa[i] * sb[j]
row.append(format(y, '.2f'))
result.append(' '.join(row))
print('\n'.join(result))
solve()
复杂度分析
- 时间复杂度:
,分别对应量化 A、量化 B、矩阵乘法的开销。
- 空间复杂度:
,存储量化后的矩阵。

京公网安备 11010502036488号