Unweight:如何在保证质量的前提下将大型语言模型压缩22%
Cloudflare 开发了 Unweight,一种无损推理时压缩系统,可将模型权重减少高达22%,同时保持位精确输出。该系统通过利用 BF16 指数字节的冗余性,使用霍夫曼编码压缩多层感知器(MLP)权重,并设计了一种重构矩阵乘法,在快速片上内存中解压权重并直接馈送到张量核心,从而减少 GPU 内存带宽瓶颈。在 Llama 3.1 8B 上,推理时模型尺寸减少约13%,分发时减少约22%,但当前吞吐量有30-40%的开销。
Cloudflare 致力于在全球95%的互联网用户附近提供低延迟推理,这意味着必须高效利用 GPU 内存。继去年推出基于 Rust 的推理引擎 Infire 和模型调度平台 Omni 后,现在他们着手解决下一个瓶颈:模型权重。
大型语言模型生成单个令牌需要从 GPU 内存中读取每一个权重。在 NVIDIA H100 GPU 上,张量核心处理数据的速度比内存提供数据的速度快近600倍,因此瓶颈在于内存带宽,而非计算。Unweight 正是为此而生:一种无损压缩系统,可将模型权重缩小15-22%,同时保持位精确输出,且不依赖特殊硬件。其核心突破在于在快速片上内存中解压权重并直接馈送给张量核心,避免了通过慢速主内存的额外往返。
压缩为什么比听起来更难
常见的量化技术是有损压缩,会不可预测地影响模型质量。Unweight 追求无损,保留精确模型行为。现有系统如 ZipNN、Huff-LLM 和 ZipServ 各有侧重,但都不适合 Cloudflare 的需求:在 Hopper GPU 上进行推理时无损解压,并集成到他们的 Rust 推理引擎中。核心挑战不在于压缩本身——BF16 权重中的指数字节高度冗余,熵编码效果良好——而在于解压速度要足够快,不拖慢推理。
如何有效压缩模型权重
每个 AI 模型中的数字以16位“脑浮点”(BF16)存储,包含符号位、指数位和尾数位。符号和尾数变化不可预测,但指数具有规律性:在训练好的 LLM 中,前16个最常见指数值覆盖了超过99%的权重,理论上只需约2.6位表示。Unweight 利用这一冗余,保留符号和尾数,仅对指数字节应用霍夫曼编码,实现约30%的指数压缩。该技术选择性应用于 MLP 权重矩阵(门、上、下投影),这些矩阵约占模型参数的三分之二,在令牌生成期间主导内存流量。注意力权重、嵌入和层归一化则不压缩。
GPU 内存瓶颈与四种执行流水线
NVIDIA H100 GPU 有两种相关内存:高带宽内存(HBM)和共享内存(SMEM)。推理时,每个令牌需要从 HBM 读取完整权重矩阵,内存总线是性能瓶颈。Unweight 提供了四种压缩执行流水线:
- 完全解码:完全重构原始 BF16 权重,交给 NVIDIA cuBLAS 库进行标准矩阵乘法。简单但写回主内存的数据最多,适合小批次。
- 仅指数解码:仅解码指数字节,将预处理流量减半,使用重构矩阵乘法。
- 调色板转码:运行时将权重转码为紧凑的4位索引格式,预处理流量减至四分之一。
- 直接调色板:跳过预处理,权重在加载时预转码为4位格式,矩阵乘法核实时重构 BF16 值。
没有单一流水线始终最优。Unweight 通过自动调优器测量端到端吞吐量,为每个权重矩阵和批次大小选择最佳流水线。
重构矩阵乘法的工作原理
三种流水线使用自定义矩阵乘法核,融合解压与计算。该核从 HBM 加载压缩数据,在共享内存中重构 BF16 值,然后直接馈入张量核心,重构权重从不驻留主内存。GPU 线程组分为生产者(使用TMA加载数据)和消费者(重构并计算),通过循环缓冲区实现流水线。
自动调优与结果
自动调优器遍历候选配置(流水线、矩阵乘法变体、SM分配),为每个投影和批次大小确定最优方案。在 Llama 3.1 8B 上,Unweight 实现推理时模型尺寸减少约13%(仅压缩门/上投影),分发时减少约22%(压缩所有 MLP 投影),均为100%位精确无损。当前吞吐量开销约30-40%,主要来自小批次固定成本、冗余权重瓦片重构和未压缩的下投影,这些正在优化中。
未来方向
Cloudflare 计划压缩下投影(约占可压缩权重的三分之一),优化内核,并将 Unweight 扩展到更大模型及混合专家模型。Unweight 已开源,旨在为 GPU 效率和压缩研究做出贡献。