Quanto:Optimum 的 PyTorch 量化后端

Hugging Face 已发布 Quanto,这是一款用于 Optimum 库的 PyTorch 量化后端。Quanto 提供了一种简化且多功能的量化方法,使开发者能够通过将权重和激活表示为低精度数据类型(例如 8 位整数(int8)而非 32 位浮点数(float32))来降低内存占用和计算成本。

关键特性与能力

Quanto 旨在实现简洁与多样性,超越许多近期量化库仅针对大语言模型(LLM)的局限,提供可适配任何模型模态的线性和分组量化原语。

其核心技术能力包括:

  • 设备无关性:量化模型可以部署在任何设备上,包括 CUDA、CPU 和 MPS(Apple Silicon)。
  • 即时模式支持:所有特性均可在即时模式下使用,确保与不可追踪的模型兼容。
  • 广泛的精度支持:它支持权重使用 int2、int4、int8 和 float8,激活使用 int8 和 float8。
  • 自动化集成:后端会自动插入量化/反量化桩、量化函数操作以及量化模块。
  • 性能优化:它在 CUDA 设备上为多种组合提供加速的矩阵乘法,包括 int8-int8、fp16-int4、bf16-int8 和 bf16-int4。
  • 序列化:兼容 PyTorch weight_only 和 Hugging Face Safetensors,以实现高效的模型保存和加载。

量化工作流

Quanto 实现了一套结构化工作流,将模型从浮点精度转换为冻结的量化状态:

  1. 量化:将标准的 float 模型转换为动态量化模型。
  2. 校准(可选):如果激活被量化,校准模式会使用代表性样本记录激活范围。
  3. 微调(可选):支持量化感知训练(Quantization-Aware-Training,QAT),通过少量训练周期恢复性能损失。
  4. 冻结:将 float 权重替换为量化权重。
  5. 序列化:将量化权重保存到 state_dict,并将量化映射保存为 JSON 文件。
  6. 重新加载:使用 requantize 辅助函数实例化空模型,并重新加载序列化的权重和映射。

与 Hugging Face Transformers 的集成

Quanto 已直接集成到 transformers 库中。用户可以通过向 from_pretrained 方法传入 QuantoConfig 来量化模型。

技术约束与优化包括:

  • 硬件要求:虽然设备无关,但 float8 需要兼容的硬件;否则,Quanto 会在矩阵乘法时静默提升为 float32float16。当前 float8 在 MPS 设备上会报错。
  • 编译:Quanto 对 torch.compile 友好。但为了更快的生成,用户应在 QuantoConfig 中保持 activations=None,以避免动态量化(如 QAT 或量化激活)带来的问题。
  • 跨模态使用:该集成支持多种模态,示例为能够对 openai/whisper-large-v3 等模型进行 int8 量化。

性能基准

meta-llama/Meta-Llama-3.1-8B 的评估表明,Quanto 为降低延迟和内存使用提供了一条可行路径。每 token 延迟在 NVIDIA A10 GPU 上测量。所提供的结果未使用诸如 AWQ 或 HQQ 等后训练优化算法。

Sources