Hugging Face Transformers GGUF 支持
Hugging Face 已将对 GGUF (GPT-Generated Unified Format) 模型的支持集成到 transformers 库中,允许用户使用熟悉的 PyTorch 和 Transformers API 加载并运行最初为 llama.cpp 设计的量化检查点。此次集成通过利用底层的 ggml 内核,在 Apple Silicon 上实现了高效的本地推理,使其性能接近专用的本地推理引擎。
GGUF 格式与量化
GGUF 是由 llama.cpp 团队开发的一种文件格式,它将模型权重、分词器信息以及可选的聊天模板打包成单个文件。其主要优势在于支持多种量化级别,允许用户通过牺牲少量精度来减少模型的内存占用。
例如,使用 Unsloth 的 Qwen3.5-4B 模型,内存需求会随量化变体而变化:
| GGUF 变体 | 文件大小 | 权衡 |
|---|---|---|
BF16 |
8.42 GB | 未量化参考 |
Q6_K |
3.53 GB | 高精度 |
Q5_K_M |
3.14 GB | 大小与精度平衡 |
Q4_K_M |
2.74 GB | 本地推理的实用起点 |
技术实现:ggml 内核与生成循环
为了达到与 llama.cpp 相当的性能水平,Hugging Face 实施了两项主要的技术优化:重用 ggml 内核和精简 generate 循环。
集成 ggml Metal 内核
transformers 现在不再用单独的运行时替换模型,而是使用 kernels 库直接从 PyTorch 调用兼容的 ggml Metal 内核。这使得模型可以保留在 Python 中,同时由专门的 GPU 程序处理繁重的计算:
ggml-quantization:读取打包的量化权重以进行矩阵运算,避免了在每次解码操作前展开权重矩阵的需要。ggml-norm:融合了归一化操作,包括 Qwen3.5 和 Qwen3.8 中使用的零中心 RMSNorm。ggml-attn:为提示词处理和 Token 解码实现了ggml的 Metal Flash Attention。ggml-gated-delta-net:加速了 Qwen3.5 和 Qwen3.8 混合架构中的线性注意力层。topk:一种自定义的 Metal 实现,用于优化混合专家 (MoE) 模型中的专家选择。
生成循环优化
Hugging Face 减少了 generate 函数中 CPU-GPU 的同步开销,以确保 GPU 保持满载。引入了两个关键更改:
- 注意力掩码优化:对于没有填充的仅解码器输入,在生成开始时移除全 1 填充掩码,防止注意力代码重复检查掩码。
- 延迟停止检查:停止决策被异步复制,允许 CPU 在 GPU 执行当前步骤时继续调度工作。
性能与基准测试
在 MacBook Pro M2 Max(32 GB 统一内存)上进行的基准测试显示,transformers 在小型密集模型、大型密集模型和 MoE 模型上的吞吐量均接近 llama.cpp。值得注意的是,transformers 的测量结果包含了预填充 (prefill) 阶段,而 llama-bench 对 llama.cpp 的结果则侧重于仅解码的吞吐量。
使用与部署
加载 GGUF 模型
用户可以使用 from_pretrained 中的 gguf_file 参数从 Hugging Face Hub 加载 GGUF 模型:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "unsloth/Qwen3.5-4B-GGUF"
filename = "Qwen3.5-4B-Q4_K_M.gguf"
tokenizer = AutoTokenizer.from_pretrained(model_id, gguf_file=filename)
model = AutoModelForCausalLM.from_pretrained(model_id, gguf_file=filename)
通过 OpenAI 兼容 API 提供服务
可以使用 transformers serve CLI 提供模型服务,该 CLI 公开了一个与 OpenAI 兼容的 API,以便与 Jan 或 Pi 等客户端集成:
pip install -U "transformers[serving] @ git+https://github.com/huggingface/transformers.git" kernels
transformers serve "unsloth/Qwen3.5-4B-GGUF:Qwen3.5-4B-Q4_K_M.gguf"
战略意义与局限性
虽然 llama.cpp 仍然是纯本地推理效率的首选引擎,但此次集成允许开发者在 PyTorch 生态系统中使用 GGUF 检查点,用于以下任务:
- 原型设计:使用钩子 (hooks) 检查中间激活值或修改前向传播。
- 评估:使用现有的
transformers工作流来衡量量化模型的质量。 - 验证:将原始检查点与 GGUF 转换版本进行比较,以检查量化误差。
- 微调:通过
GgufConfig(dequantize=True)对权重进行反量化,以继续标准训练工作流。
当前局限性
- 硬件:打包推理路径目前仅限于 MPS (Apple Silicon)。
- 批处理:填充后的批处理目前性能较低;针对 MPS 上
generate_batch的优化正在进行中。 - 架构:初步支持仅限于 Qwen3.5 密集模型和 MoE 架构(包括 Qwen3.8)。
未来展望
Hugging Face 旨在将 ggml 的性能带到目前 llama.cpp 尚未支持的架构中。通过将 ggml 内核集成到 PyTorch 中,transformers 可以在无需为每个新架构实现完整 llama.cpp 的情况下,加速新的研究模型和自定义变体。