对大型语言模型进行量化不只在于应用某个算法;它还需要实用的工具,才能有效保存、加载和运行这些优化后的模型。尽管GGUF等格式以及GPTQ/AWQ模型的特定约定处理了存储,但Hugging Face生态系统提供了强大的库,即transformers和optimum,以使量化处理和运行由此产生的模型更加高效。Hugging Face transformers 核心库本身提供了一些直接的集成,用于加载仅权重量化的模型,这主要是在其内部使用了bitsandbytes库。您可能在from_pretrained方法中遇到过load_in_8bit=True或load_in_4bit=True这样的参数。这些标志提供了一种方便的方式,能将模型直接加载到GPU等硬件上,使用降低精度后的权重,大幅减少推理时的内存占用。# 使用 transformers 原生 bitsandbytes 集成的示例 from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "mistralai/Mistral-7B-v0.1" # 示例模型 # 加载已启用4位量化的模型 model = AutoModelForCausalLM.from_pretrained( model_id, load_in_4bit=True, device_map="auto" # 自动将层映射到可用设备(CPU/GPU) ) tokenizer = AutoTokenizer.from_pretrained(model_id) # 现在 'model' 使用4位权重进行推理 # ... 使用模型和分词器继续生成这种直接方法非常适合快速部署和节省内存,尤其是在消费级GPU上。然而,它主要侧重于通过bitsandbytes进行推理时的权重量化。对于更多元的量化方案,包括权重和激活的静态量化、与不同硬件加速器的兼容性以及标准化的导出格式,我们会转向Hugging Face Optimum。认识 Hugging Face OptimumOptimum是transformers的一个扩展,其专门用于连接transformers模型与各种硬件加速技术及优化方法,这包括量化。可以把它看作是一个工具集,它提供了一个标准化的接口,用于应用如训练后量化(PTQ)这样的优化,并将模型导出到ONNX(开放神经网络交换)等有效率的运行时格式。Optimum 的主要目标包括:统一API: 提供一致的方法,以便在不同后端(如ONNX Runtime、PyTorch XLA、Intel OpenVINO等)应用优化。硬件加速: 使使用专用硬件功能变得更简单,以实现更快的推理(例如,CPU/GPU上的INT8支持)。性能优化: 实施诸如图融合和优化内核使用等技术,这些通常由所选后端提供支持。Optimum 的量化工作流程Optimum 主要通过与各种优化后端的集成来支持训练后量化(PTQ)。使用Optimum进行PTQ的典型工作流程包括以下步骤:加载基础模型: 从一个标准的transformers模型开始。定义量化配置: 指定所需的量化参数,例如目标精度(如INT8),是量化激活(静态)还是仅量化权重(动态),校准数据集以及目标后端。Optimum 为此提供了配置类(例如QuantizationConfig、AutoQuantizationConfig)。实例化量化器: 从Optimum创建一个量化器对象,并将模型和配置关联起来(例如OptimumORTOptimizer、OptimumIntelQuantizer)。运行量化: 执行量化过程。如果执行静态量化,这通常涉及使用提供的GSE数据集校准模型,以确定最佳量化范围(缩放因子、零点)。保存量化模型: 导出优化后的模型,通常以与所选后端兼容的格式(例如,带有量化算子的ONNX图)。让我们演示如何使用 Optimum 与 ONNX Runtime 后端进行静态 INT8 量化:from optimum.onnxruntime import ORTQuantizer, ORTModelForSequenceClassification from optimum.onnxruntime.configuration import QuantizationConfig, AutoQuantizationConfig from transformers import AutoTokenizer, AutoModelForSequenceClassification # 假设“calibration_dataset”已准备好(例如,训练数据的子集) model_id = "distilbert-base-uncased-finetuned-sst-2-english" onnx_output_dir = "./quantized_onnx_model" # 1. 加载基础模型和分词器 tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForSequenceClassification.from_pretrained(model_id) # 2. 定义量化配置(AVX512 CPU 的静态 INT8) # 针对 AVX512 CPU 静态量化的示例 qconfig = AutoQuantizationConfig.avx512_vnni(is_static=True, per_channel=False) # 3. 实例化量化器 quantizer = ORTQuantizer.from_pretrained(model_id, feature=model.config.task_specific_params.get("feature", "sequence-classification")) # 4. 运行量化(校准在此进行) quantizer.quantize( save_dir=onnx_output_dir, quantization_config=qconfig, calibration_dataset=calibration_dataset # 提供校准数据 ) # 5. 量化后的 ONNX 模型保存在 'onnx_output_dir' 中 print(f"Quantized ONNX model saved to: {onnx_output_dir}") # 通过 Optimum 的 ORTModel 类加载并使用量化模型 quantized_model = ORTModelForSequenceClassification.from_pretrained(onnx_output_dir) # 现在您可以使用“quantized_model”和“tokenizer”进行推理这个代码片段演示了使用 Optimum 和 ONNX Runtime 的典型 PTQ 流程。实际操作需要以预期格式准备一个calibration_dataset。Optimum 可以屏蔽底层后端(例如 ONNX Runtime 的量化工具或 Intel 的 Neural Compressor)的许多细节。它提供了一个更高级别的接口,使这个过程更易于使用。加载并运行 Optimum 量化模型一旦模型使用Optimum进行量化并导出(通常为ONNX格式),您通常会使用Optimum的专用模型类来加载和运行它。这些类(如ORTModelForCausalLM、ORTModelForSequenceClassification)旨在与特定的运行时后端(例如ONNX Runtime)配合使用。from optimum.onnxruntime import ORTModelForCausalLM from transformers import AutoTokenizer quantized_model_dir = "./quantized_onnx_model" # 量化模型保存的路径 tokenizer = AutoTokenizer.from_pretrained(quantized_model_dir) # 也加载分词器 # 加载为 ONNX Runtime 优化的量化模型 ort_model = ORTModelForCausalLM.from_pretrained(quantized_model_dir, use_io_binding=True) # IO 绑定可以提升性能 # 使用优化后的模型进行推理 # API 通常与 transformers API 相似 inputs = tokenizer("Generate text with the quantized model:", return_tensors="pt") outputs = ort_model.generate(**inputs) print(tokenizer.decode(outputs[0], skip_special_tokens=True))使用这些Optimum类可确保模型使用预期的加速运行时执行,并发挥了先前进行的量化作用。支持的后端和硬件Optimum 的一个重要优势在于它支持多种执行后端,让您可以针对不同的硬件目标优化模型:ONNX Runtime: 优秀的跨平台支持(CPU、通过CUDA/TensorRT的GPU、ARM)。通常是默认或用途最广的选择。支持静态/动态量化。Intel OpenVINO: 为Intel硬件(CPU、集成显卡、VPU)优化。提供强大的PTQ能力。TensorRT: NVIDIA GPU 的高性能推理优化器和运行时。Optimum 可以协助导出与TensorRT兼容的模型。其他: 对IPEX(PyTorch的Intel扩展)、TensorFlow Lite等后端的支持也属于Optimum生态系统的一部分,具体取决于任务和模型。量化技术以及由此产生的性能提升会因所选后端和目标硬件的能力(例如原生INT8支持)而有所不同。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#adb5bd", fillcolor="#e9ecef", style="filled,rounded"]; edge [fontname="sans-serif", color="#495057"]; subgraph cluster_hf { label = "Hugging Face 生态系统"; bgcolor="#f8f9fa"; color="#ced4da"; hf_model [label="Transformers 模型 (FP32)"]; } subgraph cluster_optimum { label = "Optimum 优化"; bgcolor="#e7f5ff"; color="#a5d8ff"; optimum_quantize [label="Optimum 量化器\n(例如,ORTQuantizer)", shape=cylinder, fillcolor="#bac8ff"]; q_config [label="量化配置\n(INT8,静态,后端)", shape=note, fillcolor="#dee2e6"]; calibration [label="校准数据", shape=folder, fillcolor="#ffec99"]; } subgraph cluster_runtime { label = "加速运行时"; bgcolor="#e3fafc"; color="#99e9f2"; quant_model [label="量化模型\n(例如,ONNX INT8)"]; optimum_runtime [label="Optimum 运行时类\n(例如,ORTModel)", shape=cylinder, fillcolor="#96f2d7"]; inference [label="优化推理\n(CPU/GPU)", shape=cds, fillcolor="#d8f5a2"]; } hf_model -> optimum_quantize; q_config -> optimum_quantize; calibration -> optimum_quantize [label="用于校准"]; optimum_quantize -> quant_model [label="导出"]; quant_model -> optimum_runtime [label="加载"]; optimum_runtime -> inference; }使用 Hugging Face Optimum 进行训练后量化(PTQ)、导出为 ONNX 格式并使用 Optimum 运行时类运行的典型工作流程。总而言之,Hugging Face Transformers 提供了量化的基本途径,主要通过 bitsandbytes 进行推理时的权重优化。Hugging Face Optimum 大幅扩展了这些能力,提供了一个标准化的框架,用于应用各种训练后量化技术,针对 ONNX Runtime 和 OpenVINO 等多个硬件后端,并管理优化后的模型以实现高效部署。对于希望系统地应用和部署量化transformers模型到不同硬件平台的开发者而言,它是一个必要的工具。