Transformers 文档

贡献新的量化方法

Hugging Face's logo
加入 Hugging Face 社区

并获得增强版文档体验

开始使用

贡献新的量化方法

Transformers 支持并集成了许多量化方法,例如 QLoRA、GPTQ、LLM.int8 和 AWQ。但是,还有一些其他尚未集成的量化方法。为了使添加和使用这些量化方法与 Transformers 模型更容易,您应该使用 HfQuantizer 类。HfQuantizer 被设计为添加量化方法的内部辅助类,而不是您应用于每个 PyTorch 模块的东西。

本指南将向您展示如何将新的量化方法与 HfQuantizer 类集成。

要求

在将新的量化方法集成到 Transformers 之前,请确保您要添加的方法满足以下先决条件。目前仅支持可以使用 PyTorch 模块运行的量化方法。

  • 量化方法可以通过一个 Python 包获得,该包可供任何人通过 pip 安装(如果您只能从源代码安装该包,也可以)。理想情况下,预编译的内核包含在 pip 包中。
  • 该方法可以在常用硬件(CPU、GPU 等)上运行。
  • 该方法封装在 nn.Module 中(例如,Linear8bitLtLinear4bit),并且量化线性层应具有以下定义
class Linear4bit(nn.Module):
    def __init__(self, ...):
        ...
    
    def forward(self, x):
        return my_4bit_kernel(x, self.weight, self.bias)

这样,Transformers 模型可以通过用目标类替换 nn.Linear 的某些实例来轻松量化。

  • 量化方法应该是可序列化的。您可以将量化的权重本地保存或推送到 Hub。
  • 确保包含量化内核/原语的包是稳定的(没有频繁的重大更改)。

对于某些量化方法,它们可能需要通过数据校准(例如,AWQ)“预量化”模型。在这种情况下,我们更倾向于只在 Transformers 中支持推理,并让 ML 社区维护的第三方库处理模型量化本身。

构建新的 HFQuantizer 类

  1. src/transformers/utils/quantization_config.py 中创建一个新的量化配置类,并确保通过将其添加到 _import_structure 对象中,在 Transformers 主要 init 中公开新的量化配置 src/transformers/init.py

  2. src/transformers/quantizers/ 中创建一个新文件,名为 quantizer_your_method.py,并使其继承自 src/transformers/quantizers/base.py::HfQuantizer。确保在 src/transformers/quantizers/auto.py 中的量化自动映射中添加新的量化器和量化配置。

  3. 为您的量化方法定义以下类属性/属性方法

  • requires_calibration:量化方法是否需要数据校准过程。如果设置为 True,您只能支持推理(使用量化权重),而不能支持推理和量化。
  • required_packages:使用量化权重所需包的字符串列表。您可能需要在 transformers/src/utils/import_utils.py 中定义一些新的实用程序方法,例如 is_auto_awq_available
  • requires_parameters_quantization:仅在您的量化方法需要对底层 nn.Parameter 对象格外注意时才需要。例如,bitsandbytes 使用 Params4bitInt8Param,在量化模型时需要格外注意。大多数最近的量化方法将 int2/int4 权重打包到 torch.uint8 权重中,因此这个标志实际上并不需要(默认情况下设置为 False)。
  • is_serializable:一个属性方法,用于确定该方法是否可序列化。
  • is_trainable:一个属性方法,用于确定您是否可以在量化方法之上微调模型(使用或不使用 PEFT 方法)。
  1. 编写 validate_environmentupdate_torch_dtype 方法。这些方法在创建量化模型之前被调用,以确保用户使用正确的配置。您可以看看其他量化器是如何实现的。

  2. 编写 _process_model_before_weight_loading 方法。在 Transformers 中,量化模型首先在 "meta" 设备上初始化,然后再加载权重。这意味着 _process_model_before_weight_loading 方法负责操作模型骨架以用目标模块(量化模块)替换某些模块(例如,nn.Linear)。您可以通过在 transformers/src/integrations/ 中创建一个新文件并公开该文件夹的 __init__.py 文件中的相关方法来定义模块替换逻辑或任何其他实用程序方法。最好的起点是查看其他量化方法,例如 quantizer_awq.py

  3. 编写 _process_model_after_weight_loading 方法。此方法支持实现加载权重后需要操作模型的额外功能。

  4. 记录所有内容!通过在 docs/source/en/quantization 下添加一个新文件并在 docs/source/en/quantization/overview.md 中的表格中添加新行来确保您的量化方法已记录。

  5. 添加测试!您应该通过首先在 docker/transformers-quantization-latest-gpu 中的 nightly Dockerfile 中添加包,然后在 tests/quantization/xxx 中添加一个新的测试文件来添加测试。请随时查看其他量化方法是如何实现的。

< > 在 GitHub 上更新