transformers 现可直接运行 llama.cpp 的量化 GGUF 模型
核心概要
这篇 Hugging Face 文章介绍 transformers 现在可用 from_pretrained 的 gguf_file 参数直接加载 GGUF 量化检查点:在 Apple Silicon 上经 kernels 库复用 ggml 的 Metal 内核(打包量化权重矩阵乘、融合归一化、flash attention、gated delta net,以及自研 topk 用于 MoE 路由),并在 generate 中提前去掉多余 attention mask、异步推迟停止判断;作者在 MacBook Pro M2 Max 上对小型稠密、较大稠密与 MoE 三个检查点测得生成速度接近 llama.cpp,同时给出 Q4_K_M、Q5_K_M、Q6_K 的文件大小权衡,
深度剖析
GGUF 检查点成为 transformers 的一等加载对象:只需把 Hub 的 model_id 与文件名作为 gguf_file 传给 from_pretrained,之后全部沿用标准 API(apply_chat_template、generate,或 transformers serve 暴露 OpenAI 兼容接口)。 以往 GGUF 属于独立推理运行时的格式,现在同一份量化检查点可以在 PyTorch 进程里加载与生成;权重保持打包状态时 transformers 自动加载 ggml/Metal 内核并以 ggml-org/ggml-attn 作为注意力实现,取不到内核时回退 "sdpa" 并告警,也可显式指定。 以官方加载示例与配置说明为主,属于实现与用法层面的描述,文中未给出对照实验。
内核复用加上 generate 循环的两处改动,使本地生成速度接近 llama.cpp。 内核侧覆盖量化权重读取(避免每次解码前展开整张权重矩阵)、融合归一化、Metal flash attention、gated delta net,以及针对 MoE 路由的 topk;循环侧通过 #48814 在无 padding 的 decoder-only 输入上提前移除全 1 padding mask,通过 #47975 把停止判断异步化并在下一步消费,两项改动对所有 transformers 模型生效而非仅限 GGUF。 在 MacBook Pro M2 Max(32 GB 统一内存、macOS 26.6、PyTorch 2.12.1、kernels 0.17.0)上对三个检查点测量;llama.cpp 侧用 llama-bench 的 tg128(128 个解码 token、三次重复平均、不含提示处理),transformers 侧为同样 128 token、三次预热运行取最佳且包含 prefill,条件并不等同。文中据此说明“Transformers is close to llama.cpp across all three checkpoints”。
量化档位的选择有明确的空间—精度参照:Unsloth 的 Qwen3.5-4B 从 BF16 的 8.42 GB 降到 Q4_K_M 的 2.74 GB(Q6_K 3.53 GB、Q5_K_M 3.14 GB)。 Q4_K_M 这类变体混合张量精度,主体为 4 位权重而敏感张量保持更高精度,文章建议先从 Q4_K_M 起步,内存充裕再试 Q5_K_M 或 Q6_K。 文件大小为可核对的格式事实;质量权衡被明确为取决于具体模型与任务,需要在目标工作上自行评估。
该集成把 GGUF 检查点接入 PyTorch 开发工作流,并给出向更多架构与模态扩展的路径:可查看中间激活、改造 forward、评估量化检查点质量、校验 GGUF 转换、使用自定义 logits 处理器与停止条件,或用 GgufConfig(dequantize=True) 反量化后继续标准训练流程。 内核只作用于张量,并不要求整个模型来自 GGUF 文件,因此同一批注意力、归一化与矩阵乘内核被描述为可进入其他 transformers 模型与加载流程,并可能被视觉、音频与多模态模型复用;对尚无专用 llama.cpp 实现的新架构与研究模型尤其有用。 属于设计与路线说明,文章明确表示每个架构仍需集成与验证,当前示例只覆盖文本生成。
启示与展望
这项工作面向 Apple Silicon 上的单轮交互式对话场景:打包推理路径目前仅限 MPS,反量化导入则是另一条独立选项,支持文件格式不等于各设备都有打包内核;架构覆盖为 Qwen3.5 稠密与 MoE(含兼容的 Qwen3.8)。它使写 Python 与 PyTorch 的开发者能在熟悉的工具里加载、调试、评估量化检查点并验证转换,也为把 ggml 内核带入 transformers 已实现的架构(乃至视觉、音频、多模态算子复用)打开入口;对追求极致本地推理效率的用户,文章仍建议使用 llama.cpp。
正文只以文字描述速度对比,未给出图表中的具体数值,读者若要横向核实需回到原文图形;两侧口径不同(一侧含 prefill、一侧为 tg128 三次平均)意味着“接近”应理解为同一台机器上的总体印象。基准脚本中“back-to-back runs decay by 10% or more”的提示说明测量对热状态敏感,换设备或换散热条件需重新评估。量化档位的质量损失取决于模型与任务,文章建议在目标工作上评估,具体任务上的差异仍待使用者自测;padding 与 batching 路径、MPS 上的 generate_batch 被列为后续工作,属范围说明。此外,本次解析从“from_pretrained, and start generating on your own machine.”处开始,原文开头部分未包含,因此对目标读者与前置条件的完整表述可能略有缺失。
