趋近智
大语言模型通常包含数十亿参数,并以32位浮点(FP32)格式表示,在推理过程中对内存和计算资源提出较大要求。量化提供一套有效方法来应对这些挑战,通过使用较低精度的数值格式(通常是8位整数(INT8)或甚至4位整数(INT4))来表示模型权重,有时也表示激活值。这种精度降低能带来更小的模型占用空间、降低内存带宽需求、更快的推理速度(尤其是在支持低精度运算的专用硬件上)以及更低的能耗。
然而,量化并非没有代价。降低数值精度可能影响模型精度。主要任务是有效地应用量化方法,最大限度减少精度下降,同时最大限度提升性能。
本质上,量化将浮点值从一个连续范围映射到一组离散的较低精度整数值。例如,将FP32值(范围大约从到)映射到INT8值(范围从-128到127)。
这种映射需要两个重要参数:
真实值 及其量化整数表示 之间的关系可以表示为:
量化过程(将浮点数映射到整数)是:
难点在于为模型的不同部分(例如,每个张量、每个通道)确定最佳的比例因子和零点值,以最小化此映射引入的信息损失。
在LLMOps工作流中实现量化主要有两种策略:训练后量化(PTQ)和量化感知训练(QAT)。
PTQ是一种更简单的方法,在模型已训练完成后应用。它涉及获取一个预训练的FP32模型,并将其权重(以及可能的激活值)转换为较低精度格式。
工作流程:
优点:
缺点:
示例(使用Hugging Face Optimum):
from optimum.onnxruntime import ORTQuantizer
from optimum.onnxruntime.configuration import AutoQuantizationConfig
# 假设'model_checkpoint'指向一个标准的Transformer模型
# 假设'onnx_model_path'是导出ONNX模型的路径
# 1. 为ONNX模型创建一个量化器
quantizer = ORTQuantizer.from_pretrained(model_checkpoint, feature='sequence-classification')
# 2. 定义量化配置(例如,权重和激活的INT8静态量化)
qconfig = AutoQuantizationConfig.avx512_vnni(is_static=True, per_channel=False) # 示例配置
# 3. 定义校准数据集(需要一个真实的数集加载器)
def preprocess_fn(examples):
# 根据模型的tokenizer对输入进行分词
return quantizer.tokenizer(examples['text'], padding='max_length', truncation=True)
calibration_dataset = load_dataset("glue", "sst2", split="validation[:100]") # 小样本
calibration_dataset = calibration_dataset.map(preprocess_fn, batched=True)
# 4. 运行量化
quantizer.quantize(
save_dir='./quantized_model',
quantization_config=qconfig,
dataset=calibration_dataset,
batch_size=8
)
QAT在微调或训练过程中引入了量化效果的模拟。它允许模型使其权重适应降低的精度,通常能恢复PTQ中损失的大部分精度。
工作流程:
优点:
缺点:
QAT集成(PyTorch):
import torch
import torch.quantization as quant
# 假设'model'是你的FP32 PyTorch模型
model.eval() # 设置为评估模式以准备QAT
# 指定QAT配置
model.qconfig = quant.get_default_qat_qconfig('fbgemm') # 示例后端
# 准备模型进行QAT:插入观察器和fake_quant模块
model_prepared = quant.prepare_qat(model)
# --- 训练循环 ---
# model_prepared.train() # 设置为训练模式
# for epoch in range(num_epochs):
# for batch in dataloader:
# inputs, labels = batch
# optimizer.zero_grad()
# outputs = model_prepared(inputs) # 前向传播模拟量化
# loss = criterion(outputs, labels)
# loss.backward() # 后向传播调整权重
# optimizer.step()
# --- 训练循环结束 ---
# 将QAT训练后的模型转换为真正量化后的模型
model_prepared.eval()
model_quantized = quant.convert(model_prepared)
# 现在'model_quantized'包含INT8权重,可用于推理
各种量化格式相对于原始FP32表示所实现的模型尺寸缩减。
有几个库和框架有助于实现LLM的量化:
torch.quantization.quantize_dynamic, torch.quantization.prepare, torch.quantization.convert) 和QAT (torch.quantization.prepare_qat) 的内置模块。量化是一种核心技术,用于使大语言模型实现实用部署。通过审慎选择正确的方法(PTQ或QAT)和格式(INT8, INT4, FP8),并通过严格评估将其系统地整合到你的LLMOps流程中,你可以显著降低资源消耗并提升推理延迟,同时平衡模型精度之间的权衡。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造