量化概述¶
量化是一个降低计算精度并减少模型内存占用的过程。要了解更多信息,请访问ExecuTorch 概念页面。这对于包括可穿戴设备、嵌入式设备和微控制器在内的边缘设备尤其有用,这些设备通常具有有限的资源,如处理能力、内存和电池寿命。通过使用量化,我们可以使我们的模型更高效,并使它们能够在这些设备上有效地运行。
就流程而言,量化发生在 ExecuTorch 堆栈的早期阶段
更详细的工作流程可以在ExecuTorch 教程中找到。
量化通常与实现了量化运算符的执行后端相关联。因此,每个后端都对其模型应如何量化持有己见,这在后端特定的 Quantizer
类中表达。Quantizer
提供了 API,用于对用户希望如何量化其模型进行建模,并将用户意图传递给量化工作流程。
后端开发者将需要实现他们自己的 Quantizer
,以表达不同的运算符或运算符模式如何在他们的后端中量化。这通过量化工作流程提供的 Annotation API 完成。由于 Quantizer
也是面向用户的,它将公开特定的 API,用于对用户配置他们希望如何量化模型进行建模。每个后端都应为其 Quantizer
提供自己的 API 文档。
建模用户将使用特定于其目标后端的 Quantizer
来量化他们的模型,例如 XNNPACKQuantizer
。
有关使用 XNPACKQuantizer
的量化流程示例、更多文档和教程,请参阅执行量化
部分的ExecuTorch 教程。
源量化:Int8DynActInt4WeightQuantizer¶
除了基于导出的量化(如上所述)之外,ExecuTorch 还想强调通过 torchao 完成的基于源的量化。与基于导出的量化不同,基于源的量化直接在导出之前修改模型。一个具体的例子是 Int8DynActInt4WeightQuantizer
。
此方案表示 4 位权重量化和推理期间激活的 8 位动态量化。
通过 from torchao.quantization.quant_api import Int8DynActInt4WeightQuantizer
导入,此类使用使用指定的 dtype 精度和 groupsize 构建的量化实例,来修改提供的 nn.Module
。
# Source Quant
from torchao.quantization.quant_api import Int8DynActInt4WeightQuantizer
model = Int8DynActInt4WeightQuantizer(precision=torch_dtype, groupsize=group_size).quantize(model)
# Export to ExecuTorch
from executorch.exir import to_edge
from torch.export import export
exported_model = export(model, ...)
et_program = to_edge(exported_model, ...).to_executorch(...)