第 5 环 · 激活 INT4 量化
同一个圆心:一台开机只有一个 AI 的手机。上一环把权重压成了 4bit,这一环把激活值也压成 4bit——权重、激活都 INT4,内存带宽再省一半。
大模型推理的两大数据流——权重和激活——都往 4bit 压。带宽优先这个核心思路,在权重之后,轮到激活。
给 min_bus.sv 的激活路径也加了 INT4 反量化(和权重同一套逻辑):
NPU_A_IN 32bit = 8 个 INT4 激活(每个 4bit) a4_0 = data[3:0] → 符号扩展 → a8_0 a4_1 = data[7:4] → 符号扩展 → a8_1 a4_2 = data[11:8] → 符号扩展 → a8_2 a4_3 = data[15:12] → 符号扩展 → a8_3 → 喂给 4×4 脉动阵列
现在权重、激活在内存里都是 4bit,喂进 NPU 时才变回 8bit——两条数据流都省一半带宽。
调试小插曲:一开始激活误写成全 3(0x33333333),结果 4×6=24——这反而证明 4 路激活都正确反量化、都参与了计算;改成单行 3 后,结果精确回到 6。
本环走完一整圈:目标 → 带宽瓶颈 → 激活 INT4 落地 → 仿真跑通 → 回到目标(权重+激活都 INT4,内存占用降到 1/4,离「手机装下大模型」又实一步)。
第 6 环:NPU.STORE——把 NPU 的完整输出(4 列结果)都读回,而不是只读第 0 列,让推理结果能完整流出。