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 实现了一套结构化工作流,将模型从浮点精度转换为冻结的量化状态:
- 量化:将标准的 float 模型转换为动态量化模型。
- 校准(可选):如果激活被量化,校准模式会使用代表性样本记录激活范围。
- 微调(可选):支持量化感知训练(Quantization-Aware-Training,QAT),通过少量训练周期恢复性能损失。
- 冻结:将 float 权重替换为量化权重。
- 序列化:将量化权重保存到
state_dict,并将量化映射保存为 JSON 文件。 - 重新加载:使用
requantize辅助函数实例化空模型,并重新加载序列化的权重和映射。
与 Hugging Face Transformers 的集成
Quanto 已直接集成到 transformers 库中。用户可以通过向 from_pretrained 方法传入 QuantoConfig 来量化模型。
技术约束与优化包括:
- 硬件要求:虽然设备无关,但
float8需要兼容的硬件;否则,Quanto 会在矩阵乘法时静默提升为float32或float16。当前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 等后训练优化算法。