对称INT8量化方案

题目分析

实现神经网络推理中的对称 INT8 量化方案:对激活矩阵 A 和参数矩阵 B 分别量化,在整数域完成矩阵乘法后还原为浮点结果。

量化规则:

  • 矩阵 A:按行(per-sample)量化,每行的缩放因子
  • 矩阵 B:按列(per-channel)量化,每列的缩放因子
  • 量化值:
  • 还原:

思路

本题是一道模拟题,按照量化流程逐步实现即可。

  1. 量化矩阵 A:遍历每一行,计算该行绝对值最大值,求缩放因子,对每个元素做 round + clip 得到 INT8 值。
  2. 量化矩阵 B:遍历每一列,计算该列绝对值最大值,求缩放因子,对每个元素做 round + clip 得到 INT8 值。
  3. 整数矩阵乘法,结果为 INT32。
  4. 还原浮点:结果矩阵的第 行第 列乘以 ,输出保留两位小数。

注意 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、矩阵乘法的开销。
  • 空间复杂度: ,存储量化后的矩阵。