Transformers 文档

贡献

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

贡献

Transformers 支持多种量化方法,例如 QLoRA、GPTQ、LLM.int8 和 AWQ。然而,仍有许多量化方法尚未集成。为了更轻松地在 Transformers 中添加和使用这些量化方法,请使用 HfQuantizer 类。HfQuantizer 被设计为用于添加量化方法的内部辅助类,而不是应用于每个 PyTorch 模块的东西。

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

要求

在将新的量化方法集成到 Transformers 之前,请确保该方法满足以下要求。仅支持可以使用 PyTorch 模块运行的量化方法。

  • 量化方法可通过可 pip 安装的 Python 包获得(如果您只能从源代码安装该包也可以)。理想情况下,预编译的内核包含在 pip 包中。

  • 该方法可以在常用硬件(CPU、GPU 等)上运行。

  • 该方法封装在 nn.Module (~bitsandbytes.nn.Linear8bitLt, ~bitsandbytes.nn.Linear4bit) 中,并且量化的线性层应具有以下定义。

    class Linear4bit(nn.Module):
        def __init__(self, ...):
            ...
        
        def forward(self, x):
            return my_4bit_kernel(x, self.weight, self.bias)

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

  • 量化方法应该是可序列化的。您可以将量化的权重保存在本地或将其推送到 Hub。

  • 确保包含量化内核/原语的包是稳定的(没有频繁的重大更改)。

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

创建新的 HFQuantizer 类

  1. src/transformers/utils/quantization_config.py 中创建一个新的量化配置类。将新的量化配置添加到 Transformers src/transformers/init.py 文件中的 _import_structure 中。

  2. src/transformers/quantizers/ 中创建一个名为 quantizer_your_method.py 的新文件,并使其继承自 [`~quantizers.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 使用 ~bitsandbytes.nn.Params4bit~bitsandbytes.nn.Int8Params,这在量化模型时需要格外注意。大多数最新的量化方法将 int2 和 int4 权重打包在 torch.uint8 权重中,因此此标志实际上不是必需的(默认设置为 False)。
    • is_serializable:用于确定方法是否可序列化的属性方法。
    • is_trainable:用于确定您是否可以在量化方法之上微调模型(使用或不使用 PEFT 方法)的属性方法。
  4. 编写 validate_environmentupdate_torch_dtype 方法。在创建量化模型之前调用这些方法,以确保用户使用正确的配置。有关实现示例,请参阅其他量化器。

  5. 编写 _process_model_before_weight_loading 方法。在 Transformers 中,量化模型首先在 "meta" 设备上初始化,然后再加载权重。这意味着 _process_model_before_weight_loading 方法负责操作模型骨架,以将某些模块 (nn.Linear) 替换为目标模块(量化模块)。

    您可以通过在 transformers/src/integrations/ 中创建一个新文件,并在该文件夹的 __init__.py 文件中公开相关方法来定义模块替换逻辑或任何其他实用程序方法。最好的起点是查看另一个量化方法,例如 quantizer_awq.py

  6. 编写 _process_model_after_weight_loading 方法。此方法使实现需要加载权重后操作模型的其他功能成为可能。

  7. 记录一切!通过在 docs/source/en/quantization 下添加新文件,确保您的量化方法已记录在案。

  8. 您应该通过在我们的 nightly Dockerfile 中的 docker/transformers-quantization-latest-gpu 中添加软件包,然后在 tests/quantization/xxx 中添加新的测试文件来添加测试。随意查看现有的量化方法,了解它是如何实现的。

< > 在 GitHub 上更新