量化概述¶
量化是一种将模型计算和存储权重中使用的数字精度降低的技术——通常从 32 位浮点数降至 8 位整数。这可以减少模型的内存占用,加快推理速度,并降低功耗,通常只带来微小的精度损失。
量化对于在穿戴设备、嵌入式系统和微控制器等边缘设备上部署模型尤其重要,这些设备通常计算能力、内存和电池容量有限。通过量化模型,我们可以使其效率更高,更适合这些资源受限的环境。
ExecuTorch 中的量化¶
ExecuTorch 使用 torchao 作为其量化库。这种集成允许 ExecuTorch 利用 PyTorch 原生的工具来准备、校准和转换量化模型。
ExecuTorch 中的量化是特定于后端的。每个后端都根据其硬件功能定义了模型应如何量化。大多数 ExecuTorch 后端使用 torchao 的 PT2E 量化流程,该流程适用于使用 torch.export 导出的模型,并为每个后端量身定制量化。
PT2E 量化工作流程包含三个主要步骤
配置特定于后端的量化器。
在 PyTorch 中准备、校准、转换和评估量化模型
将模型降低到目标后端
1. 配置特定于后端的量化器¶
每个后端都提供自己的量化器(例如,XNNPACKQuantizer、CoreMLQuantizer),它定义了如何以与目标硬件兼容的方式将量化应用于模型。这些量化器通常支持配置,允许用户指定量化选项,例如:
精度(例如,8 位或 4 位)
量化类型(例如,动态、静态或仅权重量化)
粒度(例如,每个张量、每个通道)
并非所有后端都支持所有量化选项。请参阅特定于后端的指南,了解支持的量化模式和配置,以及如何初始化特定于后端的 PT2E 量化器。
2. 量化并评估模型¶
定义了特定于后端的量化器后,PT2E 量化流程对于所有后端都相同。下面提供了一个通用示例,但特定示例在后端文档中给出。
from torchao.quantization.pt2e.quantize_pt2e import convert_pt2e, prepare_pt2e
training_gm = torch.export.export(model, sample_inputs).module()
# Prepare the model for quantization using the backend-specific quantizer instance
prepared_model = prepare_pt2e(training_gm, quantizer)
# Calibrate the model on representative data
for sample in calibration_data:
prepared_model(sample)
# Convert the calibrated model to a quantized model
quantized_model = convert_pt2e(prepared_model)
quantized_model 是一个标准的 PyTorch 模型,可以在不同任务上进行精度评估。任务特定的基准测试是评估量化模型的推荐方法,但作为粗略的替代方法,您可以使用 SQNR 等通用错误指标与原始模型的输出来比较。
from torchao.quantization.utils import compute_error
out_reference = model(sample)
out_quantized = quantized_model(sample)
sqnr = compute_error(out_reference, out_quantized) # SQNR error
请注意,即使对于未量化的模型,设备上的数值也可能与 PyTorch 中的数值不同,并且精度评估也可以使用 pybindings 或在设备上进行。