Transformers 文档
贡献
并获得增强的文档体验
开始使用
贡献
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 类
在 src/transformers/utils/quantization_config.py 中创建一个新的量化配置类。将新的量化配置添加到 Transformers 的 src/transformers/init.py 文件中的 _import_structure 中。
在 src/transformers/quantizers/ 中创建一个名为
quantizer_your_method.py
的新文件,并使其继承自 [`~quantizers.HfQuantizer]。确保将新的量化器和量化配置添加到 src/transformers/quantizers/auto.py 中的量化自动映射中。为您的量化方法定义以下类属性和属性方法。
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 方法)的属性方法。
编写
validate_environment
和update_torch_dtype
方法。这些方法在创建量化模型之前调用,以确保用户使用正确的配置。请参阅其他量化器以获取其实现示例。编写
_process_model_before_weight_loading
方法。在 Transformers 中,量化模型首先在"meta"
设备上初始化,然后加载权重。这意味着_process_model_before_weight_loading
方法负责操作模型骨架以将某些模块(nn.Linear)替换为目标模块(量化模块)。您可以通过在 transformers/src/integrations/ 中创建新文件并公开该文件夹的
__init__.py
文件中的相关方法来定义模块替换逻辑或任何其他实用方法。最好的起点是查看其他量化方法,例如 quantizer_awq.py。编写
_process_model_after_weight_loading
方法。此方法允许实现需要在加载权重后操作模型的附加功能。记录所有内容!通过在
docs/source/en/quantization
下添加新文件来确保您的量化方法已记录在案。您应该通过在
docker/transformers-quantization-latest-gpu
中的 nightly Dockerfile 中添加包,然后将新测试文件添加到tests/quantization/xxx
来添加测试。请随意查看现有的量化方法以了解其实现方式。