本文解释了MLX量化模型在Qwen3.5等混合架构上表现不佳的原因,即均匀量化无法有效处理不同张量的敏感度差异。文章提出了基于Unsloth imatrix数据的混合精度量化方案,为不同张量分配最佳比特位宽,从而显著提升模型性能。
如果你从社区下载了一个 MLX 量化模型,并注意到它在工具调用方面表现不佳,产生不连贯的长输出,或者比 GGUF 版本更容易出现幻觉——你并没有看错。
根本原因是统一量化。大多数 MLX 量化工具对模型中的每个权重张量应用相同的位宽。对于标准 Transformer 架构来说,这工作得很好。但 Qwen3.5 是一个混合模型——它在全自注意力层和 GatedDeltaNet(线性注意力/SSM)层之间交替。
Unsloth 对 150 多个 KL 散度基准测试的研究揭示了其损害:
| 张量 | 4比特下的KLD | 敏感度 |
|---|---|---|
lm_head |
$\sim 0.05$ | 几乎无损 |
embed_tokens |
$\sim 0.15$ | 非常安全 |
self_attn.q/k/v_proj |
$\sim 1.5\text{–}2.9$ | 中等——需要注意 |
self_attn.o_proj |
$\sim 1.5$ | 高——无可用AWQ修复 |
linear_attn.out_proj |
$\mathbf{\sim 6.0}$ | 灾难性 |
linear_attn.out_proj 张量——GatedDeltaNet 层独有——比 lm_head 敏感 120 倍。将其量化为 4 位,就像将 JPEG 最关键的部分压缩到 1% 的质量,而将背景保留在 95% 的质量一样。
统一量化在不需要的张量上浪费比特,并破坏无法承受精度损失的张量。
解决方案是逐张量混合比特量化——根据每个权重张量的实际敏感度分配其精度级别。这就是 Unsloth 的 Dynamic 2.0 配方为 GGUF 所做的,也是我们移植到 MLX 的方法。
在默认的 3 位基准下,分配如下:
| 组件 | 比特 | 原因 |
|---|---|---|
| MLP gate/up 投影 | 3 | 对量化噪声鲁棒 |
| MLP down 投影 | 4 | 稍微更敏感 |
| 注意力 Q/K/V 投影 | 5 + AWQ | AWQ预缩放恢复质量 |
| Embedding | 5 | 安全,且小于模型大小的1% |
| LM head | 6 | 整个模型中最安全的张量 |
| 输出投影 | bf16 | AWQ无前置归一化层 |
| 归一化层、偏置、路由门 | bf16 | 必须保持全精度 |
关键的洞察是:o_proj 和 out_proj 没有前置的归一化层,因此 AWQ 无法纠正它们。在 Unsloth 的 GGUF 管道中,这些张量仍然使用 imatrix 重要性加权量化为 Q5_K——这是一种不需要前置归一化层的技术。但 MLX 的没有 AWQ 纠正的仿射量化会产生比带有 imatrix 的 GGUF k-quants 更差的结果,因此安全的备用方案是将其保持在 bf16。这会增加额外的磁盘空间,但可以防止导致朴素量化无法用于工具调用和结构化输出的质量损失。
整个配方取决于知道每个张量中哪些通道最重要。这来自于 Unsloth 的开源 imatrix 数据——通过 121 种量化配置的 150 多个 KLD 基准计算出的逐通道重要性分数。
importance[channel] = sum_of_squared_activations[channel] / calibration_token_count
Unsloth 的 imatrix 之所以特别,是因为其校准数据集:高质量的对话、编码和工具调用示例——显著优于大多数社区量化器使用的基于维基百科的校准。这很重要,因为重要性分数的好坏取决于其校准数据。一个经过维基百科校准的 imatrix 会低估对代码生成和工具调用至关重要的通道。
imatrix 有两个目的:
我将 imatrix 应用于我们量化的 Qwen 模型。
我们使用 ToolCall-15 进行了测试,这是一个开源基准,用于评估 LLM 在 5 个类别中 15 个确定性场景下的工具调用能力:
所有测试都在温度为 0 且工具输出被模拟的情况下运行,使得结果完全可重现。
我们所有量化模型的表现与 Unsloth UD-Q3_K_XL 模型相同。
- 原文链接: x.com/brooooook_lyn/stat...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!