Hugging Face Transformers 量化概览
Hugging Face 在 Transformers 库中原生支持两种主要的量化方案:bitsandbytes 和 auto-gptq。这些集成使用户能够在更小的硬件上运行大型模型,并使用适配器进行参数高效的微调(PEFT)。
比较 bitsandbytes 和 auto-gptq
在 bitsandbytes 和 auto-gptq 之间的选择取决于主要目标是设置和微调的易用性还是文本生成的最大推理速度。
bitsandbytes: 易用性和微调
Bitsandbytes 旨在提供可访问性和灵活性,提供几个关键优势:
- 零样本量化:它不需要校准数据集,这意味着任何包含
torch.nn.Linear模块的模型在加载时可以直接进行量化。 - 跨模态互操作性:由于它针对线性层,因此可以在不同模态之间工作,支持如 Whisper、ViT 和 Blip2 等模型。
- 适配器集成:在量化基础模型上训练的适配器可以合并回基础模型或去量化模型,以便在部署时不损失推理性能。 限制:bitsandbytes 4-bit 模型在文本生成过程中比 GPTQ 慢,并且目前不支持 4-bit 权重序列化。
auto-gptq: 优化的推理
Auto-gptq 针对部署和高吞吐量文本生成进行了优化:
- 生成速度:GPTQ 量化模型在文本生成方面比 bitsandbytes 模型快得多。
- N-bit 支持:该算法支持低至 2 位的量化,尽管 4 位是质量的推荐折中方案。
- 序列化:GPTQ 模型支持任意位数的序列化,从而可以轻松加载预量化模型(例如来自 TheBloke 的模型)。
- 硬件支持:在 AMD GPUs 上,集成开箱即用工作。 限制:GPTQ 需要一个校准数据集进行量化,这可能需要几个小时(例如,对于 175B 参数模型需要 4 GPU 小时)。此外,当前的 API 专门针对语言模型设计,并且不原生支持多模态模型。
性能和速度基准测试
Hugging Face 在 NVIDIA A100、T4 和 Titan RTX GPUs 上使用 meta-llama/Llama-2-7b-hf 和 meta-llama/Llama-2-13b-hf 进行了基准测试。
推理和生成速度
- 前向传递(预填充):在预填充步骤中,bitsandbytes 和 GPTQ 表现相似,尽管在较大的批次大小下 GPTQ 稍快一些。
- 文本生成:在不同硬件(A100、T4、Titan RTX)和生成长度上,GPTQ 始终比 bitsandbytes 快。当使用注意力缓存(
use_cache=True)且批次大小为 4 时,GPTQ 的速度可以是 bitsandbytes 的两倍。
适配器微调速度
使用低秩适配器(LoRA)微调适配器时,bitsandbytes 的速度快于 GPTQ。请注意,对于 GPTQ 微调,必须禁用 exllama 内核,因为它们不支持训练。
模型质量下降
来自 Open-LLM 排行榜的基准测试表明,量化导致的性能下降最小,并且这种下降在较大的模型中不那么明显。
Llama-2-7b 性能(平均得分):
- FP16: 54.32
- bnb-4bit: 53.4
- GPTQ: 53.23
Llama-2-13b 性能(平均得分):
- FP16: 58.66
- GPTQ (actorder_True): 58.03
- GPTQ: 57.56
- bnb-4bit: 56.9
推荐的优化模型工作流程
为了实现微调灵活性和部署性能之间的最佳平衡,Hugging Face 建议以下流程:
- 量化 基础模型使用 bitsandbytes 进行零样本量化。
- 微调 在量化基础模型之上的适配器。
- 合并 训练好的适配器到基础模型或去量化模型。
- 量化 合并后的模型使用 GPTQ 以最大化生成速度进行最终部署。