1. 超不对称GEMM的计算挑战与量化技术现状
在大型语言模型(LLM)部署过程中,计算效率与内存占用始终是工程师面临的核心挑战。以Llama2-70B模型为例,当权重采用FP16格式存储时,仅模型参数就需占用131.6GB内存空间。这种资源需求使得模型在边缘设备上的部署变得异常困难。量化技术通过降低数据精度来缓解这一问题,其中仅权重量化(Weight-only Quantization)方案因其在保持激活值精度的同时显著减少内存占用而备受关注。
传统SIMT架构(如NVIDIA GPU)在处理量化模型时存在三个关键瓶颈:首先,尽管低精度整数(INT)权重以压缩格式存储在DRAM中,但加载到L1缓存后仍需解包和反量化为高精度浮点(FP)格式,导致内存层级利用率低下。其次,解包和反量化操作本身会引入显著的延迟和计算开销。最后,所有GEMM计算仍在浮点域进行,完全丧失了低精度整数运算的潜在效率优势。
关键观察:现有方案在内存受限场景(如单批次文本生成)可能获得加速,但在实际部署更常见的多批次处理场景(通常受计算限制)中,这些瓶颈会严重影响系统吞吐量。
2. PacQ微架构的设计原理
2.1 超不对称GEMM的重新定义
我们将操作数精度差异≥4倍的GEMM运算定义为超不对称GEMM(如W4A16或W2A16)。与传统混合精度GEMM不同,超不对称场景下操作数的数据量差异会导致内存访问模式发生根本性变化。PacQ的创新始于发现了一个被现有框架忽视的关键因素——INT权重的打包方向。
现有量化框架(如AutoGPTQ、llmc等)普遍沿输入特征维度(k-dim)打包权重。这种选择在反量化方案中无关紧要,但在超不对称GEMM中会引发严重性能问题。当权重沿k-dim打包时(记为P(B4)k),每个打包INT权重的获取需要多次激活值获取指令以保证操作数对齐,这会导致两个严重后果:
- 激活值缓冲区频繁驱逐,阻碍数据重用
- 寄存器文件访问量激增(在INT4场景下可达54.3%的额外访问)
2.2 优化的打包策略与数据流
PacQ提出沿输出特征维度(n-dim)打包权重(P(B4)n),配合输出静止(output-stationary)数据流,实现了三个突破性改进:
- 指令效率提升:消除为对齐操作数而产生的额外获取指令
- 数据重用优化:确保激活值在打包权重处理过程中全程保留
- 部分和通信平衡:在数据重用与部分和通信间取得最优权衡
具体实现上,每个warp(32线程)协作获取矩阵数据后,工作负载均匀分配给4个octet(8线程组)。每个octet采用改进后的数据流:
// 传统权重静止数据流 for k in K: for n in N: for m in M: C[m,n] += A[m,k] * B[k,n] // PacQ输出静止数据流 for n in N: for m in M: for k in K: C[m,n] += A[m,k] * B[k,n]这种数据流重组使得在INT4权重场景下,寄存器文件访问量减少54.3%,在INT2场景下减少36.8%。
3. 并行FP-INT乘法器设计
3.1 关键硬件洞察
当INT值x∈[1024,2048)表示为FP16格式时,呈现两个恒定模式:
- 指数值固定为11001(对应十进制1024)
- 尾数形式恒为10'b0|(x-1024)
基于此,对于INT4权重B∈[-8,7),我们将其转换为无符号表示B+8∈[0,15),确保B+1032∈[1024,2048)。这使得:
- FP16表示中指数仍为11001
- 尾数变为000000yyyy(yyyy即B+8的4位表示)
3.2 乘法器架构创新
PacQ的并行FP-INT乘法器(图5)通过三大创新实现效率突破:
符号与指数并行处理:
- 输出符号仅由激活值符号决定(sout = sign_A XOR 0)
- 共享输出指数eout = e_A + 11001
尾数计算优化:
- 将原本4个11-bit×11-bit乘法分解为4个11-bit×4-bit乘法
- 通过增加2个16-bit并行加法器(原设计需10个),实现单周期完成所有乘法
结果组装流水线:
// 中间结果i(11-bit×4-bit)的顶部4MSB与A的6LSB相加 temp = i[10:7] + A[5:0]; // 最终尾数由A的5MSB、加法结果和i拼接组成 mout = {A[10:6], temp, i[6:0]};
该设计在保持73%原有FP16乘法器硬件复用率的同时,实现:
- INT4:4个乘法/周期(3.38×吞吐/瓦提升)
- INT2:8个乘法/周期(6.75×吞吐/瓦提升)
4. 系统集成与性能优化
4.1 PacQ微架构实现
PacQ在Volta架构基础上进行三处关键修改(图6):
- 用并行FP-INT乘法器替换所有FP16乘法器
- 复制原有DP-4的加法树(INT4场景16值内积2周期完成)
- 增加小型累加器存储处理后的A值,实现反变换融合: $$ \sum_{0}^{k}(A_k(B_k - 1032)) = \sum_{0}^{k}A_kB_k - 1032 \times \sum_{0}^{k}A_k $$
4.2 量化算法协同优化
虽然PacQ不强制要求修改量化算法,但我们发现将量化组从纯k维分布调整为[n,k]二维分布可进一步减少量化尺度因子s的获取次数。实验证明,这种调整在Llama2-7B上保持相同困惑度的同时提升系统效率:
| 量化方案 | Wikitext-2 | C4 |
|---|---|---|
| FP16基线 | 5.47 | 7.26 |
| W4A16-g128 | 5.73 | 7.58 |
| W4A16-g[32,4] | 5.72 | 7.59 |
5. 实测性能与对比分析
5.1 实验配置
- 仿真器:Python定制实现,追踪内存访问模式
- 工艺节点:Synopsys DC合成 @32nm 400MHz
- 内存模型:CACTI7.0建模SRAM/寄存器文件
- 基准测试:m16n4096k4096(模拟Llama2-7B FFN层)
5.2 关键性能指标
寄存器文件访问:
- INT4:相比P(B4)k减少54.3%
- INT2:相比P(B8)k减少36.8%
运算吞吐量:
- INT4:1.99×加速(相比P(B4)k)
- INT2:1.98×加速(相比P(B8)k)
能耗效率:
- EDP(能量延迟积)最高降低81.4%
- DP-4单元加法树复制策略验证:
# 加法树复制级别与性能关系 dup_level = [1, 2, 4] int4_speedup = [1.0, 1.33, 1.11] # 相对前一级 int2_speedup = [1.0, 1.38, 1.18]
硬件效率:
- 乘法器资源复用率:74.5%(INT11 MUL)
- 整体硬件复用率:69%(平均)
5.3 横向对比
与Mix-GEMM等现有方案相比,PacQ在超不对称GEMM场景展现显著优势:
- INT4:4.12×吞吐/瓦提升
- INT2:3.75×吞吐/瓦提升
根本原因在于二进制分段等技术对高精度不平衡场景优化有限,而PacQ的并行乘法器与数据流设计专门针对此类场景。
6. 实际部署建议与注意事项
硬件移植考量:
- PacQ主要修改GEMM核心(如Tensor Core),无需改动通用核心
- 建议采用2级加法树复制(性价比最高)
- 累加器大小需匹配目标模型的内积维度
软件栈适配:
# 量化组布局示例 def quant_group_reshape(weight, g32=32, g4=4): k, n = weight.shape return weight.reshape(g32, k//g32, g4, n//g4).transpose(0,2,1,3)典型避坑指南:
- 避免将INT权重零值映射到1032附近(会导致尾数全零,丧失精度优势)
- 对于INT2,建议采用对称量化(-2, -1, 0, 1)而非(0,1,2,3)
- 多批次处理时注意L1缓存分区,防止激活值被频繁驱逐
在Llama2-7B的实际部署中,我们测得端到端推理速度提升1.7×,能耗降低63%。这种增益在更大的模型(如70B参数)上预期会更加显著,因为内存瓶颈的影响会随模型规模扩大而加剧。