Transformers 文档

量化

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

量化

量化技术通过使用较低精度的数据类型(例如 8 位整数 (int8))来表示权重和激活,从而降低内存和计算成本。这使得您可以加载通常无法放入内存的大型模型,并加快推理速度。Transformers 支持 AWQ 和 GPTQ 量化算法,并且支持使用 bitsandbytes 进行 8 位和 4 位量化。

Transformers 中不支持的量化技术可以通过 HfQuantizer 类添加。

量化指南中了解如何量化模型。

QuantoConfig

transformers.QuantoConfig

< >

( 权重 = 'int8' 激活 = None 不转换的模块: Optional = None **kwargs )

参数

  • 权重 (str, 可选, 默认为 "int8") — 量化后权重的目标数据类型。支持的值为 (“float8”,“int8”,“int4”,“int2”)
  • 激活 (str, 可选) — 量化后激活的目标数据类型。支持的值为 (None,“int8”,“float8”)
  • modules_to_not_convert (list可选,默认为 None) — 不进行量化的模块列表,对于需要某些模块保持原始精度的模型(例如 Whisper 编码器、Llava 编码器、Mixtral 门控层)的量化很有用。

这是一个关于所有可能属性和特性的包装类,您可以使用通过 quanto 加载的模型进行操作。

post_init

< >

( )

安全检查器,确保参数正确

AqlmConfig

transformers.AqlmConfig

< >

( in_group_size: int = 8 out_group_size: int = 1 num_codebooks: int = 1 nbits_per_codebook: int = 16 linear_weights_not_to_quantize: Optional = None **kwargs )

参数

  • in_group_size (int可选,默认为 8) — 沿输入维度的组大小。
  • out_group_size (int可选,默认为 1) — 沿输出维度的组大小。建议始终使用 1。
  • num_codebooks (int可选,默认为 1) — 加法量化过程的码本数量。
  • nbits_per_codebook (int, 可选, 默认为 16) — 编码单个码本向量的位数。码本大小为 2**nbits_per_codebook。
  • linear_weights_not_to_quantize (Optional[List[str]], 可选) — 不应量化的 nn.Linear 权重参数的完整路径列表。
  • kwargs (Dict[str, Any], 可选) — 用于初始化配置对象的附加参数。

这是关于 aqlm 参数的包装类。

post_init

< >

( )

安全检查器,用于检查参数是否正确 - 还会将一些 NoneType 参数替换为其默认值。

AwqConfig

transformers.AwqConfig

< >

( bits: int = 4 group_size: int = 128 zero_point: bool = True version: AWQLinearVersion = <AWQLinearVersion.GEMM: 'gemm'> backend: AwqBackendPackingMethod = <AwqBackendPackingMethod.AUTOAWQ: 'autoawq'> do_fuse: Optional = None fuse_max_seq_len: Optional = None modules_to_fuse: Optional = None modules_to_not_convert: Optional = None exllama_config: Optional = None **kwargs )

参数

  • bits (int可选,默认为 4) — 量化到的位数。
  • group_size (int可选,默认为 128) — 用于量化的组大小。建议值为 128,-1 使用每列量化。
  • zero_point (bool可选,默认为 True) — 是否使用零点量化。
  • version (AWQLinearVersion可选,默认为 AWQLinearVersion.GEMM) — 要使用的量化算法版本。GEMM 更适合大批量大小(例如 >= 8),否则 GEMV 更好(例如 < 8)。GEMM 模型与 Exllama 内核兼容。
  • backend (AwqBackendPackingMethod可选,默认为 AwqBackendPackingMethod.AUTOAWQ) — 量化后端。某些模型可以使用 llm-awq 后端进行量化。这对于使用 llm-awq 库量化自己模型的用户很有用。
  • do_fuse (bool可选,默认为 False) — 是否将注意力和 mlp 层融合在一起以加快推理速度
  • fuse_max_seq_len (int可选) — 使用融合时生成的最大序列长度。
  • modules_to_fuse (dict可选,默认为 None) — 使用用户指定的融合方案覆盖原生支持的融合方案。
  • modules_to_not_convert (list可选,默认为 None) — 不进行量化的模块列表,对于需要明确保留某些模块原始精度的模型的量化很有用(例如 Whisper 编码器、Llava 编码器、Mixtral 门控层)。请注意,您不能直接使用 transformers 进行量化,请参阅 AutoAWQ 文档以了解如何量化 HF 模型。
  • exllama_config (Dict[str, Any]可选) — 您可以通过 version 键指定 exllama 内核的版本,通过 max_input_len 键指定最大序列长度,通过 max_batch_size 键指定最大批次大小。如果未设置,则默认为 {"version": 2, "max_input_len": 2048, "max_batch_size": 8}

这是一个关于所有可能属性和特征的包装类,您可以使用 auto-awq 库加载的模型进行操作,该库依赖于 auto_awq 后端的 awq 量化。

post_init

< >

( )

安全检查器,确保参数正确

EetqConfig

transformers.EetqConfig

< >

( weights: str = 'int8' modules_to_not_convert: Optional = None **kwargs )

参数

  • weights (str可选,默认为 "int8") — 权重的目标数据类型。支持的值只有“int8”
  • modules_to_not_convert (list, 可选, 默认为 None) — 不进行量化的模块列表,对于需要某些模块保持原始精度的模型的量化很有用。

这是一个关于使用 eetq 加载的模型可以使用的所有可能属性和功能的包装类。

post_init

< >

( )

安全检查器,确保参数正确

GPTQConfig

transformers.GPTQConfig

< >

( bits: int tokenizer: Any = None dataset: Union = None group_size: int = 128 damp_percent: float = 0.1 desc_act: bool = False sym: bool = True true_sequential: bool = True use_cuda_fp16: bool = False model_seqlen: Optional = None block_name_to_quantize: Optional = None module_name_preceding_first_block: Optional = None batch_size: int = 1 pad_token_id: Optional = None use_exllama: Optional = None max_input_length: Optional = None exllama_config: Optional = None cache_block_outputs: bool = True modules_in_block_to_quantize: Optional = None **kwargs )

参数

  • bits (int) — 量化的位数,支持的数字为 (2, 3, 4, 8)。
  • tokenizer (strPreTrainedTokenizerBase可选) — 用于处理数据集的分词器。您可以传递以下内容:
    • 自定义分词器对象。
    • 字符串,托管在 huggingface.co 上的模型仓库中的预定义分词器的模型 ID
    • 分词器所需的目录路径,其中包含词汇表文件,例如使用 save_pretrained() 方法保存的文件,例如,./my_model_directory/
  • dataset (Union[List[str]]可选) — 用于量化的数据集。您可以在字符串列表中提供自己的数据集,或者只使用 GPTQ 论文 [‘wikitext2’,‘c4’,‘c4-new’] 中使用的原始数据集
  • group_size (int可选,默认为 128) — 用于量化的组大小。建议值为 128,-1 使用每列量化。
  • damp_percent (float可选,默认为 0.1) — 用于阻尼的平均 Hessian 对角线的百分比。建议值为 0.1。
  • desc_act (bool可选,默认为 False) — 是否按激活大小递减的顺序量化列。将其设置为 False 可以显着加快推理速度,但困惑度可能会略有下降。也称为 act-order。
  • sym (bool可选,默认为 True) — 是否使用对称量化。
  • true_sequential (bool可选,默认为 True) — 是否即使在单个 Transformer 块内也执行顺序量化。我们不是一次量化整个块,而是执行逐层量化。因此,每一层都使用通过先前量化层的输入进行量化。
  • use_cuda_fp16 (bool可选,默认为 False) — 是否使用针对 fp16 模型优化的 cuda 内核。需要将模型转换为 fp16 格式。
  • model_seqlen (int可选) — 模型可以接受的最大序列长度。
  • block_name_to_quantize (str可选) — 要量化的 transformers 模块名称。如果为 None,我们将使用常见模式(例如 model.layers)推断模块名称。
  • module_name_preceding_first_block (List[str]可选) — 第一个 Transformer 模块之前的层。
  • batch_size (int可选,默认为 1) — 处理数据集时使用的批量大小。
  • pad_token_id (int可选) — 填充标记 ID。当 batch_size > 1 时,需要准备数据集。
  • use_exllama (bool可选) — 是否使用 exllama 后端。如果未设置,则默认为 True。仅适用于 bits = 4 的情况。
  • max_input_length (int可选) — 最大输入长度。这是初始化依赖于最大预期输入长度的缓冲区所必需的。它特定于带有 act-order 的 exllama 后端。
  • exllama_config (Dict[str, Any], 可选) — Exllama 配置。您可以通过 version 键指定 exllama 内核的版本。如果未设置,则默认为 {"version": 1}
  • cache_block_outputs (bool, 可选, 默认为 True) — 是否缓存块输出以重用作为后续块的输入。
  • modules_in_block_to_quantize (List[List[str]], 可选) — 指定块中要量化的模块名称列表的列表。此参数可用于从量化中排除某些线性模块。要量化的块可以通过设置 block_name_to_quantize 来指定。我们将按顺序量化每个列表。如果未设置,我们将量化所有线性层。示例: modules_in_block_to_quantize =[["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], ["self_attn.o_proj"]]。在此示例中,我们将首先同时量化 q、k、v 层,因为它们是独立的。然后,我们将使用量化的 q、k、v 层量化 self_attn.o_proj 层。这样,我们将获得更好的结果,因为它反映了模型量化时 self_attn.o_proj 将获得的实际输入。

这是一个关于您可以使用已使用 optimum api 加载的模型进行的所有可能属性和功能的包装类,用于依赖 auto_gptq 后端的 gptq 量化。

from_dict_optimum

< >

( config_dict )

获取与 optimum gptq 配置字典兼容的类

post_init

< >

( )

安全检查器,确保参数正确

to_dict_optimum

< >

( )

获取与 optimum gptq 配置兼容的字典

BitsAndBytesConfig

transformers.BitsAndBytesConfig

< >

( load_in_8bit = False load_in_4bit = False llm_int8_threshold = 6.0 llm_int8_skip_modules = None llm_int8_enable_fp32_cpu_offload = False llm_int8_has_fp16_weight = False bnb_4bit_compute_dtype = None bnb_4bit_quant_type = 'fp4' bnb_4bit_use_double_quant = False bnb_4bit_quant_storage = None **kwargs )

参数

  • load_in_8bit (bool, 可选, 默认为 False) — 此标志用于启用 LLM.int8() 的 8 位量化。
  • load_in_4bit (bool, 可选, 默认为 False) — 此标志用于通过将线性层替换为来自 bitsandbytes 的 FP4/NF4 层来启用 4 位量化。
  • llm_int8_threshold (float, 可选, 默认为 6.0) — 这对应于 LLM.int8() : 8-bit Matrix Multiplication for Transformers at Scale 论文中描述的异常值检测的异常值阈值: https://arxiv.org/abs/2208.07339 任何高于此阈值的隐藏状态值将被视为异常值,并且对这些值的运算将在 fp16 中完成。 值通常呈正态分布,也就是说,大多数值都在 [-3.5, 3.5] 范围内,但有一些特殊的系统异常值对于大型模型的分布非常不同。 这些异常值通常在 [-60, -6] 或 [6, 60] 区间内。 Int8 量化适用于大小约为 5 的值,但超过此值,性能会显着下降。 一个良好的默认阈值为 6,但对于更不稳定的模型(小型模型、微调),可能需要更低的阈值。
  • llm_int8_skip_modules (List[str], 可选) — 我们不想转换为 8 位的模块的显式列表。 这对于 Jukebox 等模型很有用,这些模型在不同位置有多个头部,而且不一定位于最后一个位置。 例如,对于 CausalLM 模型,最后一个 lm_head 保留在其原始 dtype 中。
  • llm_int8_enable_fp32_cpu_offload (bool可选,默认为 False) — 此标志用于高级用例和了解此功能的用户。如果想将模型拆分为不同的部分,并在 GPU 上以 int8 运行某些部分,在 CPU 上以 fp32 运行某些部分,则可以使用此标志。这对于卸载大型模型(例如 google/flan-t5-xxl)非常有用。请注意,int8 操作不会在 CPU 上运行。
  • llm_int8_has_fp16_weight (bool可选,默认为 False) — 此标志使用 16 位主权重运行 LLM.int8()。这对于微调非常有用,因为权重不必为了反向传播而反复转换。
  • bnb_4bit_compute_dtype (torch.dtype 或 str,可选,默认为 torch.float32) — 这将设置计算类型,该类型可能与输入类型不同。例如,输入可能是 fp32,但为了提高速度,可以将计算设置为 bf16。
  • bnb_4bit_quant_type (str可选,默认为 "fp4") — 这将设置 bnb.nn.Linear4Bit 层中的量化数据类型。选项为 FP4 和 NF4 数据类型,分别由 fp4nf4 指定。
  • bnb_4bit_use_double_quant (bool可选,默认为 False) — 此标志用于嵌套量化,其中来自第一次量化的量化常数将再次被量化。
  • bnb_4bit_quant_storage (torch.dtype 或 str,可选,默认为 torch.uint8) — 这将设置存储类型以打包量化的 4 位参数。
  • kwargs (Dict[str, Any]可选) — 用于初始化配置对象的附加参数。

这是一个关于所有可能属性和功能的包装类,您可以使用通过 bitsandbytes 加载的模型来使用这些属性和功能。

这将替换 load_in_8bitload_in_4bit,因此这两个选项是互斥的。

目前仅支持 LLM.int8()FP4NF4 量化。如果向 bitsandbytes 添加更多方法,则此类将添加更多参数。

is_quantizable

< >

( )

如果模型可量化,则返回 True,否则返回 False

post_init

< >

( )

安全检查器,用于检查参数是否正确 - 还会将一些 NoneType 参数替换为其默认值。

quantization_method

< >

( )

此方法返回用于模型的量化方法。如果模型不可量化,则返回 None

to_diff_dict

< >

( ) Dict[str, Any]

返回

Dict[str, Any]

组成此配置实例的所有属性的字典,

从配置中删除与默认配置属性对应的所有属性,以便于阅读并将序列化为 Python 字典。

HfQuantizer

transformers.quantizers.HfQuantizer

< >

( quantization_config: QuantizationConfigMixin **kwargs )

HuggingFace 量化器的抽象类。目前支持量化 HF transformers 模型以进行推理和/或量化。此类仅用于 transformers.PreTrainedModel.from_pretrained,并且还不能轻易在该方法范围之外使用。

属性 quantization_config (transformers.utils.quantization_config.QuantizationConfigMixin): 定义您想要量化的模型的量化参数的量化配置。 modules_to_not_convert (List[str], 可选): 量化模型时不转换的模块名称列表。 required_packages (List[str], 可选): 在使用量化器之前需要安装的 pip 软件包列表 requires_calibration (bool): 量化方法是否需要在使用之前校准模型。 requires_parameters_quantization (bool): 量化方法是否需要创建一个新的参数。例如,对于 bitsandbytes,需要创建一个新的 xxxParameter 才能正确量化模型。

adjust_max_memory

< >

( max_memory: Dict )

如果量化需要额外的内存,则调整 infer_auto_device_map() 的 max_memory 参数

adjust_target_dtype

< >

( torch_dtype: torch.dtype )

参数

  • torch_dtype (torch.dtype, 可选) — 用于计算 device_map 的 torch_dtype。

如果希望调整在 from_pretrained 中用于计算 device_map 的 target_dtype 变量(以防 device_map 是 str),请覆盖此方法。例如,对于 bitsandbytes,我们强制将 target_dtype 设置为 torch.int8,对于 4 位,我们传递一个自定义枚举 accelerate.CustomDtype.int4

check_quantized_param

< >

( model: PreTrainedModel param_value: torch.Tensor param_name: str state_dict: Dict **kwargs )

检查加载的 state_dict 组件是否是量化参数的一部分 + 一些验证;仅在 requires_parameters_quantization == True 时定义,用于需要为量化创建新参数的量化方法。

create_quantized_param

< >

( *args **kwargs )

从 state_dict 中获取所需的组件并创建量化参数;仅在 requires_parameters_quantization == True 时适用

dequantize(反量化)

< >

( model )

可能地反量化模型以检索原始模型,但精度/性能会有一定损失。请注意,并非所有量化方案都支持此操作。

get_special_dtypes_update

< >

( model torch_dtype: torch.dtype )

参数

  • model (~transformers.PreTrainedModel) — 要量化的模型
  • torch_dtype (torch.dtype) — 在 from_pretrained 方法中传递的 dtype。

返回未量化的模块的 dtype - 用于计算 device_map(如果将字符串作为 device_map 传递)。该方法将使用在 _process_model_before_weight_loading 中修改的 modules_to_not_convert

postprocess_model

< >

( model: PreTrainedModel **kwargs )

参数

  • model (~transformers.PreTrainedModel) — 要量化的模型
  • kwargs (dict, 可选) — 传递给 _process_model_after_weight_loading 的关键字参数。

在加载权重后对模型进行后处理。确保重写抽象方法 _process_model_after_weight_loading

preprocess_model

< >

( model: PreTrainedModel **kwargs )

参数

  • model (~transformers.PreTrainedModel) — 要量化的模型
  • kwargs (dict, 可选) — 传递给 _process_model_before_weight_loading 的关键字参数。

在加载权重之前设置模型属性和/或转换模型。此时,模型应该在元设备上初始化,以便您可以自由地操作模型的框架,以便就地替换模块。确保重写抽象方法 _process_model_before_weight_loading

update_device_map

< >

( device_map: Optional )

参数

  • device_map (Union[dict, str], 可选) — 通过 from_pretrained 方法传递的 device_map。

如果您想用新的设备映射覆盖现有的设备映射,请重写此方法。例如,对于 bitsandbytes,由于 accelerate 是硬性要求,如果没有传递 device_map,则 device_map 设置为 `“auto”“

update_missing_keys

< >

( model missing_keys: List prefix: str )

参数

  • missing_keys (List[str], 可选) — 与模型的状态字典相比,检查点中缺少的键列表

如果您想调整 missing_keys,请重写此方法。

update_torch_dtype

< >

( torch_dtype: torch.dtype )

参数

  • torch_dtype (torch.dtype) — 在 from_pretrained 中传入的输入数据类型

某些量化方法需要将模型的数据类型显式设置为目标数据类型。如果您想确保保留该行为,则需要重写此方法

validate_environment

< >

( *args **kwargs )

此方法用于潜在地检查 from_pretrained 中传递的参数是否存在潜在冲突。您需要为所有与 transformers 集成的未来量化器定义它。如果不需要显式检查,则只需返回 nothing。

HqqConfig

transformers.HqqConfig

< >

( nbits: int = 4 group_size: int = 64 quant_zero: bool = True quant_scale: bool = False offload_meta: bool = False view_as_float: bool = False axis: int = 0 dynamic_config: Optional = None skip_modules: List = ['lm_head'] **kwargs )

参数

  • nbits (int可选,默认为 4) — 位数。支持的值为 (8, 4, 3, 2, 1)。
  • group_size (int可选,默认为 64) — 组大小值。支持的值为任何可被 weight.shape[axis] 整除的值。
  • quant_zero (bool可选,默认为 True) — 如果设置为 True,则量化零点。
  • quant_scale (bool可选,默认为 False) — 如果设置为 True,则量化缩放比例。
  • offload_meta (bool可选,默认为 False) — 如果设置为 True,则将元数据卸载到 CPU。
  • view_as_float (bool可选,默认为 False) — 如果设置为 True,则将量化权重视为浮点数(用于分布式训练)。
  • axis (int可选,默认为 0) — 执行分组的轴。支持的值为 0 或 1。
  • dynamic_config (dict,可选) — 动态配置的参数。键是层的名称标签,值是量化配置。如果设置,则每个由其 ID 指定的层将使用其专用的量化配置。
  • skip_modules (List[str], 可选, 默认为 ['lm_head']) — 要跳过的 nn.Linear 层列表。
  • kwargs (Dict[str, Any], 可选) — 用于初始化配置对象的附加参数。

这是 hqq 的 BaseQuantizeConfig 的包装器。

post_init

< >

( )

安全检查器,用于检查参数是否正确 - 还会将一些 NoneType 参数替换为其默认值。

to_diff_dict

< >

( ) Dict[str, Any]

返回

Dict[str, Any]

组成此配置实例的所有属性的字典,

从配置中删除与默认配置属性对应的所有属性,以便于阅读并将序列化为 Python 字典。

FbgemmFp8Config

transformers.FbgemmFp8Config

< >

( activation_scale_ub: float = 1200.0 modules_to_not_convert: Optional = None **kwargs )

参数

  • activation_scale_ub (float, 可选, 默认为 1200.0) — 激活比例上限。这用于量化输入激活。
  • modules_to_not_convert (list, 可选, 默认为 None) — 不进行量化的模块列表,对于需要某些模块保持原始精度的模型的量化很有用。

这是一个关于所有可能属性和特征的包装类,您可以使用 fbgemm fp8 量化加载的模型来使用这些属性和特征。

CompressedTensorsConfig

transformers.CompressedTensorsConfig

< >

( config_groups: Dict = None format: str = 'dense' quantization_status: QuantizationStatus = 'initialized' kv_cache_scheme: Optional = None global_compression_ratio: Optional = None ignore: Optional = None sparsity_config: Dict = None quant_method: str = 'compressed-tensors' **kwargs )

参数

  • config_groups (typing.Dict[str, typing.Union[ForwardRef('QuantizationScheme'), typing.List[str]]], 可选) — 将组名映射到量化方案定义的字典
  • format (str, 可选, 默认为 "dense") — 模型表示的格式
  • quantization_status (QuantizationStatus, 可选, 默认为 "initialized") — 模型在量化生命周期中的状态,例如“初始化”、“校准”、“冻结”
  • kv_cache_scheme (typing.Union[QuantizationArgs, NoneType], 可选) — 指定键值缓存的量化。如果为 None,则不量化键值缓存。
  • global_compression_ratio (typing.Union[float, NoneType]可选) — 模型压缩百分比,0-1 之间的浮点数
  • ignore (typing.Union[typing.List[str], NoneType]可选) — 不进行量化的层名称或类型,支持以“re:”为前缀的正则表达式
  • sparsity_config (typing.Dict[str, typing.Any]可选) — 稀疏压缩的配置
  • quant_method (str可选,默认为 "compressed-tensors") — 请勿覆盖,应为 compressed-tensors

这是一个包装类,用于处理 compressed-tensors 量化配置选项。它是 compressed_tensors.QuantizationConfig 的包装器

from_dict

< >

( config_dict return_unused_kwargs = False **kwargs ) QuantizationConfigMixin

参数

  • config_dict (Dict[str, Any]) — 用于实例化配置对象的字典。
  • return_unused_kwargs (bool可选,默认为 False) — 是否返回未使用的关键字参数列表。用于 PreTrainedModel 中的 from_pretrained 方法。
  • kwargs (Dict[str, Any]) — 用于初始化配置对象的附加参数。

返回

QuantizationConfigMixin

根据这些参数实例化的配置对象。

从 Python 参数字典实例化 CompressedTensorsConfig。可选地从嵌套的 quantization_config 中解包任何参数

to_diff_dict

< >

( ) Dict[str, Any]

返回

Dict[str, Any]

组成此配置实例的所有属性的字典,

从配置中删除与默认配置属性对应的所有属性,以便于阅读并将序列化为 Python 字典。

TorchAoConfig

class transformers.TorchAoConfig

< >

( quant_type: str modules_to_not_convert: Optional = None **kwargs )

参数

  • quant_type (str) — 我们想要使用的量化类型,目前支持:int4_weight_onlyint8_weight_onlyint8_dynamic_activation_int8_weight
  • modules_to_not_convert (list, 可选, 默认值为 None) — 不进行量化的模块列表,这对于量化明确要求某些模块保持原始精度的模型很有用。
  • kwargs (Dict[str, Any], 可选) — 所选量化类型的关键字参数,例如,int4_weight_only 量化目前支持两个关键字参数 group_sizeinner_k_tiles。更多 API 示例和参数文档可以在 https://github.com/pytorch/ao/tree/main/torchao/quantization#other-available-quantization-techniques 中找到

这是一个用于 torchao 量化/稀疏化技术的配置类。

示例

quantization_config = TorchAoConfig("int4_weight_only", group_size=32)
# int4_weight_only quant is only working with *torch.bfloat16* dtype right now
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="cuda", torch_dtype=torch.bfloat16, quantization_config=quantization_config)

post_init

< >

( )

安全检查器,用于检查参数是否正确 - 还会将一些 NoneType 参数替换为其默认值。

< > 在 GitHub 上更新