趋近智
对模型进行优化,使其最终用于推理,是AI基础设施中的一个主要考虑因素。将大型的32位浮点数(FP32)模型直接部署到生产环境中可能会效率不高。此类模型占用大量内存,导致推理延迟较高,并增加运营成本,尤其是在处理数百万次请求时。对于智能手机或嵌入式系统等边缘设备上的应用,由于严格的功耗和存储限制,大型FP32模型通常不是一个可行的选择。
模型量化是一种直接解决这些问题的有效技术。它是将模型的权重,有时包括激活值,从像FP32这样的高精度表示转换为低精度表示(最常见的是8位整数(INT8))的过程。这种转换显著减少了模型的占用空间,并可在兼容硬件上大幅加速计算。
主要优势来自两个方面:
量化将一系列浮点数映射到范围小得多的整数。最常见的方法是仿射映射,它使用比例因子和零点来关联这两个域。
它们之间的关系由以下公式定义:
真实值≈(量化值−零点)×比例这个过程包括找到您想要量化的浮点张量中的最小值 (rmin) 和最大值 (rmax),并将它们映射到整数范围,例如 INT8 的 [qmin,qmax]。
将浮点值映射到其对应的8位整数表示。
这种转换本质上是信息有损的,类似于将高分辨率图像压缩为JPEG格式。重要的是要智能地执行这种映射,以使模型准确性潜在的下降最小化,并保持在应用程序可接受的范围内。
应用量化主要有两种方法,每种方法在实现简易性和最终模型准确性之间都有不同的权衡。
训练后量化是最直接的方法。您可以获取一个经过完全训练的FP32模型,并在不进行任何再训练的情况下将其转换为低精度格式。这是一种很有吸引力的选择,因为它速度快,并且不需要访问原始训练流程或数据集。
PTQ主要有两种变体:
当PTQ导致模型准确性下降到不可接受的程度时,量化感知训练是推荐的解决方案。QAT在训练或微调过程中模拟低精度推理的效果。它在模型图中插入“假”量化和反量化操作。
这使得模型能够使其权重适应精度损失,从而有效地学习如何抵御量化带来的影响。尽管训练的前向和后向传播仍使用浮点数,但模型针对最终作为纯整数模型的部署进行了优化。QAT需要更多精力,因为它涉及一个训练循环,但它几乎总是能恢复PTQ所损失的准确性,有时甚至可以在原始FP32基线上略有提高。
选择量化策略的决策流程。从更简单的PTQ方法开始,仅当未达到准确性要求时才转向QAT。
大多数现代深度学习框架都提供内置工具,以简化量化过程。例如,PyTorch为PTQ和QAT提供了全面的API。以下代码片段说明了在PyTorch中应用静态PTQ的一般步骤:
import torch
import torch.quantization
# 假设 `model_fp32` 是您已训练的FP32模型
# 并且 `calibration_loader` 提供代表性数据
model_fp32.eval()
# 步骤1:融合Conv-BN-ReLU等模块以提高准确性和性能
# 此步骤将经常一起执行的层组合起来
torch.quantization.fuse_modules(model_fp32, [['conv', 'relu']], inplace=True)
# 步骤2:准备模型进行静态量化
# 这将插入观察者模块以收集激活统计信息
model_fp32.qconfig = torch.quantization.get_default_qconfig('fbgemm')
model_quantized_prepared = torch.quantization.prepare(model_fp32)
# 步骤3:通过数据运行模型进行校准
with torch.no_grad():
for data, _ in calibration_loader:
model_quantized_prepared(data)
# 步骤4:将模型转换为最终量化形式
model_quantized = torch.quantization.convert(model_quantized_prepared)
# 得到的 `model_quantized` 已准备好部署
得到的 model_quantized 对象现在包含INT8权重,并配置为使用整数运算执行计算,从而带来如下所示的性能优势。
典型视觉模型的性能对比。INT8量化版本在推理时尺寸减小近4倍,速度提升超过3倍。
最终,模型量化是部署高效AI服务的一个重要优化步骤。通过减小模型尺寸和加速计算,它使得在资源受限的环境中运行复杂模型以及在云端以更低成本提供模型服务成为可能。务必在独立的测试集上验证量化模型的准确性,以确保它持续满足您的应用需求。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造