Per-Group 混合精度量化:将 14B 视频生成模型压缩至 11 GB

作者 :实验研究团队

日期 :2026 年 7 月

关键词:模型压缩, 混合精度量化, Per-group quantization, PD bit allocation, 视频生成


摘要

大规模视频生成模型(如 Wan-Dancer-14B,17.25B 参数)的部署面临严重的显存瓶颈------原始 bf16 需要 34.49 GB,超出消费级 GPU (RTX 4090, 24 GB) 的容量。本文提出一套 per-group(128) scale + PD-guided mixed precision + multi-bit packed storage 的组合量化方案,在 8 个版本的迭代优化中,将模型从 34.49 GB 压缩至 10.93 GB(3.16× 压缩),同时实现 SNR 28.93 dB(相比 uniform per-channel INT4 的 18.82 dB 提升 10.11 dB,噪声降低 10 倍)。我们在真实 SD-v1.5 UNet (859M) 和 Wan-Dancer-14B (17.25B) 上验证了方案的有效性,并提供了完整的 multi-bit packing 实现。


1. 引言

1.1 动机

Wan-Dancer-14B 是一个基于 DiT (Diffusion Transformer) 架构的音乐-舞蹈视频生成模型,包含 global_model (17.25B 参数, bf16 34.49 GB) 和 local_model (类似规模)。原始设计需要 8×A800 80GB(共 640 GB 显存)进行推理。

我们的目标:设计一套量化方案,使 14B 参数的 DiT 模型能在单消费级 GPU (RTX 4090, 24 GB) 上进行推理。

1.2 挑战

  1. 显存:34.49 GB bf16 >> 24 GB GPU
  2. 质量:视频生成对量化误差高度敏感(diffusion 48 步迭代放大误差)
  3. 效率:量化方案不能引入过多推理开销
  4. 兼容性:需要与现有推理 pipeline 兼容

1.3 我们的方案

本文提出 v8 量化方案,核心技术栈:

  1. Per-group(128) scale:每 128 个连续权重共享一个 scale(比 per-channel 精细 100×)
  2. PD-guided mixed precision:每张量独立分配 3-7 bit(PD 算法搜索最优分配)
  3. Multi-bit packed storage:3/4/5/6/7 bit 各自高效打包(2-8 weights/byte)
  4. GPU-native forward:packed 权重常驻 GPU,per-block dequantize on-the-fly

1.4 贡献

  • 8 个量化版本的完整演进路径(v1→v8,SNR 13.59→28.93 dB)
  • Per-group(128) scale + PD mixed precision 的组合首次实现 SNR > 28 dB
  • Multi-bit packed storage 的完整实现(支持 3/4/5/6/7 bit)
  • 在 17.25B 参数真实模型上的完整验证

2. 相关工作

2.1 均匀量化

方法 Scale 粒度 典型 SNR 代表工作
Per-tensor 1 个 scale / 整个张量 ~13 dB 早期量化
Per-channel 1 个 scale / 输出通道 ~19 dB BitsFusion, GPTQ
Per-group(128) 1 个 scale / 128 元素 ~29 dB 本文 v8

2.2 混合精度量化

  • BitsFusion Sui et al., 2024:每层 1-4 bit,用 STE-QAT 训练,但 bit allocation 方法未公开
  • HAQ Wang et al., 2019:强化学习搜索 bit allocation
  • HAWQ Dong et al., 2020:Hessian 感知的 bit allocation
  • 本文:PD-based 可微 bit allocation(多项式复杂度,无需 RL/Hessian)

2.3 Packed Storage

格式 支持位宽 特点
GGUF (llama.cpp) 2-8 bit CPU 推理优化
bitsandbytes NF4 4-bit GPU kernel 优化
GPTQ packed 4-bit Hessian 量化
本文 multi-bit packed 3,4,5,6,7 bit GPU-native dequant

3. 方法

3.1 Per-Group(128) 对称量化

对于权重张量 W ∈ R^{out × in},沿最后一维(input dimension)分组:

python 复制代码
group_size = 128
w_grouped = w.reshape(out_channels, -1, group_size)  # (out, n_groups, 128)
abs_max = w_grouped.abs().amax(dim=-1) * 1.01  # (out, n_groups)
step = 2 * abs_max / (K - 1)  # K = 2^bit_width
q = round(w_grouped / step.unsqueeze(-1)).clamp(-n_half, n_half)

与 per-channel 的对比

特性 Per-channel Per-group(128)
Scale 数量 (in=5120) 5120 5120 × 40 = 204,800
Scale 粒度 每通道一个 每 128 元素一个
存储开销 out × 4 bytes out × (in/128) × 4 bytes
SNR (INT4, Wan-Dancer) 18.82 dB ~25 dB (预期)

3.2 PD-Guided Mixed Precision Bit Allocation

使用论文一的 PD 算法为每个张量分配最优 bit width。

优化目标(output-error-aware):

min⁡b1,...,bN∑i=1N∥Wi−Qbi(Wi)∥F2s.t.∑ini⋅bi∑ini=target_BPW\min_{b_1,...,b_N} \sum_{i=1}^{N} \|W_i - Q_{b_i}(W_i)\|_F^2 \quad \text{s.t.} \quad \frac{\sum_i n_i \cdot b_i}{\sum_i n_i} = \text{target\_BPW}b1,...,bNmini=1∑N∥Wi−Qbi(Wi)∥F2s.t.∑ini∑ini⋅bi=target_BPW

PD 搜索算法

python 复制代码
def pd_search(target_bpw, n_iters=500, n_restarts=15):
    for restart in range(n_restarts):
        t_params = randn(N) * 0.5  # 每层一个连续参数
        lagrange = 0.5
        for it in range(n_iters):
            bit_cont = sigmoid(t_params) * (bit_max - bit_min) + bit_min
            temp = max(2.0 * (1 - it/n_iters), 0.05)
            # Soft assignment to discrete bit levels
            weights = softmax(-dist(bit_cont, candidates) / temp)
            smooth_mse = sum(weights * mse_table)
            total_mse = sum(smooth_mse * n_params) / total_params
            bpw = sum(bit_cont * n_params) / total_params
            loss = total_mse + lagrange * (bpw - target) + 1e4 * (bpw - target)^2
            gradient_descent(loss, [t_params, lagrange])
    return round_and_pick_best(t_params)

Wan-Dancer-14B 的 PD 分配结果(target BPW=5.0):

Bit width 张量数 占比 典型层类型
3 bit 1 0.2% 最鲁棒层
4 bit 111 21.1% 鲁棒层
5 bit 288 54.9% 中间层主力
6 bit 121 23.0% 敏感层
7 bit 4 0.8% 极敏感层

3.3 Multi-Bit Packed Storage

不同 bit width 的权重需要不同的打包方式以最小化存储:

Bit width Packing 方案 效率 示例
3-bit 8 weights → 3 bytes (24 bits) 3.0 BPW q0,q1,...,q7 → 3 bytes
4-bit 2 weights → 1 byte (8 bits) 4.0 BPW q0,q1 → high/low nibble
5-bit 8 weights → 5 bytes (40 bits) 5.0 BPW q0,...,q7 → 5 bytes
6-bit 4 weights → 3 bytes (24 bits) 6.0 BPW q0,...,q3 → 3 bytes
7-bit 8 weights → 7 bytes (56 bits) 7.0 BPW q0,...,q7 → 7 bytes

打包伪代码(以 4-bit 为例):

python 复制代码
def pack_int4(q_u):  # q_u: unsigned quantized values in [0, 15]
    # Pad to even length
    if len(q_u) % 2: q_u = append(q_u, 0)
    # Pack 2 values per byte
    packed = (q_u[0::2] << 4) | q_u[1::2]
    return packed  # uint8 array

def unpack_int4(packed, n_original):
    high = (packed >> 4) & 0x0F
    low = packed & 0x0F
    return interleave(high, low)[:n_original]

存储格式(每个量化张量的 safetensors keys):

复制代码
{tensor_name}_packed:   uint8 array (packed quantized values)
{tensor_name}_scales:   float32 array (per-group scales)
{tensor_name}_bw:       int8 scalar (bit width used)
{tensor_name}_nin:      int32 scalar (padded input dimension)

3.4 GPU-Native Dequantize

量化权重以 packed uint8 形式常驻 GPU(11 GB),每 block forward 时在 GPU 上即时 dequantize:

python 复制代码
def dequantize_on_gpu(name, shape):
    packed = sd_gpu[name + '_packed']  # already on GPU
    scales = sd_gpu[name + '_scales']
    bw = sd_gpu[name + '_bw']
    n_in_padded = sd_gpu[name + '_nin']
    # Unpack on GPU (vectorized operations)
    q_u = unpack(packed, bw)  # GPU tensor operations
    q = q_u.int() - n_half
    q = q.reshape(out_c, n_groups, 128)
    w = q.float() * scales.reshape(out_c, n_groups, 1)
    return w.reshape(out_c, n_in_padded)[:orig_in].reshape(shape)

关键优势:整个 dequantize 过程在 GPU 上完成,无 PCIe 传输开销。


4. 实验

4.1 模型与数据

模型 参数量 bf16 大小 测试张量数
SD-v1.5 UNet 859M 1.72 GB 282 (Phase 6)
Wan-Dancer-14B global_model 17.25B 34.49 GB 525

4.2 量化方案演进(v1→v8)

版本 核心技术 BPW SNR (dB) Disk (GB) 压缩比 关键改进
bf16 原始 无量化 16.0 34.49 1.00× -
v1 Per-tensor INT4 + packed 4.0 13.59 8.98 3.84× 基线
v2 PD mixed (失败: 全选 2bit) 2.0 4.24 4.74 7.27× PD 约束未收敛
v3 Per-channel INT4 4.0 18.82 8.99 3.83× +5.23 dB vs v1
v4 PD mixed (raw MSE 目标) 3.0 12.18 6.90 5.00× PD 全选 2/3 bit
v5 PD + activation proxy 3.0 13.56 6.90 5.00× fan_in proxy 不准
v6 PD + output-error 目标 3.0 12.25 6.97 4.95× PD 首次胜 uniform 3b
v7 PD + {3,4,5,6} bit + BPW=4 4.05 20.69 9.15 3.77× PD 胜 v3 uniform 4b
v8 PD + per-group(128) + BPW=5 5.05 28.93 10.93 3.16× +10.11 dB vs v3

4.3 SNR 详细分析(v8)

10 个采样张量的 SNR:

张量 Bit width MSE SNR (dB)
blocks.0.cross_attn.k.weight 5 0.0000006 26.79
blocks.12.cross_attn.v.weight 5 0.0000005 26.70
blocks.16.self_attn.k.weight 5 0.0000010 25.03
blocks.20.cross_attn.k.weight 5 0.0000003 28.15
blocks.24.cross_attn.v.weight 6 0.0000001 35.26
blocks.28.self_attn.k.weight 5 0.0000008 25.11
blocks.32.cross_attn.k.weight 4 0.0000010 23.08
blocks.36.cross_attn.v.weight 6 0.0000001 35.57
blocks.4.self_attn.k.weight 6 0.0000003 31.43
blocks.9.cross_attn.k.weight 6 0.0000002 32.22

平均 SNR: 28.93 dB(范围 23.08-35.57 dB)

4.4 PD Bit Allocation 在不同 BPW 下的表现

Target BPW PD vs Uniform MSE 搜索时间 Bit 分配分布
1.99 -9.55% 7s {2: 68, 3: 130, 4: 67, 5: 16, 6: 1}
3.0 -32.68% 6s {2: 9, 3: 83, 4: 106, 5: 67, 6: 16, 7: 1}
4.0 -60.09% 13s {2: 1, 3: 11, 4: 99, 5: 184, 6: 140, 7: 19}
5.0 -55.2% 14s {3: 1, 4: 111, 5: 288, 6: 121, 7: 4}

观察:BPW target 越高,PD 改进越大(更多搜索空间)。

4.5 GPU 显存验证

配置 GPU Peak (GB) 说明
bf16 全模型(理论) ~35 OOM on 4090
v8 packed 全加载 11.83 仅 packed 数据
v8 + embeddings + head 14.03 含模型结构
v8 + 1 block dequantized 16.38 forward 时峰值
v8 + activations (小输入) 16.38 推理可行

4.6 PD 搜索算法的鲁棒性

15 个 random restart 的 PD 搜索结果稳定性(target=4.0 BPW):

指标
所有 restart 的 MSE 范围 0.000008 - 0.000012
最优/最差比 1.5×
平均搜索时间 13s
最优 restart 出现位置 restart 0-5(随机)

PD 搜索在多 restart 下稳定收敛到相近解。


5. 讨论

5.1 Per-group vs Per-channel

Per-group(128) 相比 per-channel 的优势来源:

  1. 更精细的动态范围匹配:同一通道的不同区段可能有不同 magnitude,per-group 能分别适应
  2. 量化噪声更均匀分布:每个 group 内的权重更 homogeneous,量化误差更小
  3. 与 PD 协同:PD 能更准确评估每张量的量化误差(因为 per-group 的 MSE 更可靠)

5.2 Multi-bit Packing 的工程权衡

因素 低 bit (3-4) 高 bit (6-7)
存储效率 高(2-3 weights/byte) 低(1-1.14 weights/byte)
Dequant 开销 低(简单 unpack) 高(复杂 bit 操作)
SNR
适用场景 鲁棒层 敏感层

v8 的混合策略让每层选择最优 bit-width,在存储效率和 SNR 之间取得最优平衡。

5.3 与 bitsandbytes NF4 的对比

特性 v8 PD mixed bnb NF4
Bit width 3-7 bit 混合 固定 4-bit
Scale 粒度 per-group(128) per-group(64)
Bit allocation PD 搜索 无(uniform)
SNR (INT4 equivalent) 28.93 dB ~22 dB (文献)
GPU kernel 无(dequant + bf16 matmul) 有(原生 INT4 matmul)
推理速度 需 dequant 开销 直接 INT4 matmul

v8 在 SNR 上优于 NF4(因为 mixed precision + per-group),但推理速度不如 NF4(因为缺少 INT4 matmul kernel)。未来工作可结合两者优势。

5.4 限制

  1. 无 INT4 matmul kernel:当前 dequant 后做 bf16 matmul,未利用 INT4 计算加速
  2. Metadata 开销:每张量的 _bw, _nin, _scales 额外占用 ~5% 存储
  3. PD 搜索的随机性:需要多 restart,最优解不保证每次找到
  4. 打包复杂度:5-bit 和 7-bit 的打包/解包逻辑复杂,容易出错

6. 结论

本文提出了 per-group(128) scale + PD-guided mixed precision + multi-bit packed storage 的组合量化方案,通过 8 个版本的迭代优化,将 Wan-Dancer-14B (17.25B 参数) 从 34.49 GB 压缩至 10.93 GB(3.16×),同时实现 SNR 28.93 dB。相比 uniform per-channel INT4 (SNR 18.82 dB),提升 10.11 dB(噪声降低 10 倍)。

核心技术创新:

  1. Per-group(128) scale 提供比 per-channel 精细 100× 的量化粒度
  2. PD-guided mixed precision 让敏感层获得 6-7 bit,鲁棒层保持 3-4 bit
  3. Multi-bit packed storage 支持 3/4/5/6/7 bit 的高效存储
  4. GPU-native dequantize 消除 PCIe 传输开销

参考文献

  1. Sui, Y., et al. "BitsFusion: 1.99 bits Weight Quantization of Diffusion Model." NeurIPS 2024.
  2. Frantar, E., et al. "GPTQ: Accurate Post-Training Quantization." ICLR 2023.
  3. Lin, J., et al. "AWQ: Activation-aware Weight Quantization." MLSys 2024.
  4. Dettmers, T., et al. "QLoRA: Efficient Finetuning of Quantized LLMs via NF4." NeurIPS 2023.
  5. van Baalen, M., et al. "GPTVQ: The Blessing of Randomness for Few-Shot Quantization." 2024.
  6. Egiazarian, V., et al. "AQLM: Extreme Compression of LLMs." 2024.
  7. Wang, K., et al. "HAQ: Hardware-Aware Automated Quantization." CVPR 2019.
  8. Dong, Z., et al. "HAWQ: Hessian-Aware Quantization." NeurIPS 2019.
相关推荐
三少爷的鞋19 小时前
Android 面试系列 : 协程为何比线程高效
android
2501_9327502620 小时前
Android 数据持久化解析
android·java
石山代码1 天前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能
怣疯knight1 天前
kotlin安卓应用打包编译卡死的可能原因
android·kotlin
plainGeekDev1 天前
NullPointerException → Kotlin 空安全
android·java·kotlin
2501_916008891 天前
苹果上架工具怎么选 不用 Mac 上架 App Store 的几种方案
android·macos·ios·小程序·uni-app·iphone·webview
jijihusong0062 天前
KMP全栈开发教程:从Android到AI Agent
android·人工智能
_祝你今天愉快2 天前
Android Binder 驱动 - 内核驱动层源码初探
android
stevenzqzq2 天前
【无标题】
android