跳到内容

llmcompressor.modifiers.transform.spinquant.base

SpinQuantModifier

基类: Modifier

实现“SpinQuant: LLM量化与学习旋转”的转换(https://arxiv.org/abs/2405.16406

变换(旋转)是添加到模型中的额外层,可以减少量化引起的精度损失。这是通过将权重和激活“旋转”到具有较小值动态范围的空间来实现的,从而减小了量化所需的尺度范围。

SpinQuant的作者描述了四种可以应用于模型的不同旋转。R1和R2是“离线”旋转,意味着它们可以融合到现有权重中,因此不会产生运行时成本。R3和R4是“在线”旋转,意味着它们需要在运行时进行额外的计算。

生命周期

  • on_initialize
    • 按需推断 SpinQuantMappings & NormMappings
    • 按需创建 R1、R2、R3 和 R4 的转换方案
  • on_start
    • 归一化嵌入
    • 将归一化层融合到后续的线性层
    • 应用 TransformConfig
      • 将变换合并到权重中,以便进行合并变换
      • 添加在线变换的钩子
  • 在序列 epoch 结束时
  • on_end
  • on_finalize

参数

  • 旋转

    一个列表,包含要应用于模型的旋转名称。可能的旋转包括 R1、R2、R3 和 R4

  • 变换类型

    要应用于模型的转换类型。"hadamard" 性能成本最低,但仅支持大小为二的幂的倍数的尺寸。"random-matrix" 性能成本较高,但支持的尺寸范围更广。"random-matrix" 性能成本最高,但支持任何尺寸

  • 随机化

    如果为 True,则为每次应用创建独立的转换

  • 可学习

    如果为 True,则将梯度附加到转换权重以进行训练

  • precision

    所有变换应应用的精度。这适用于权重融合和在线旋转

  • transform_block_size

    用于旋转矩阵的块大小。模型的 hidden_size 和 head_dim 必须能被 transform_block_size 整除。层将被一个块对角矩阵转换,其中每个块是该尺寸的矩阵。如果提供了 None,则 R1、R3 和 R4 使用模型的 hidden_size,R2 使用模型的 head_dim

  • mappings

    指定模型中要进行转换的目标层。如果提供了 None,将推断出一个映射

  • norm_mappings

    指定模型中要进行归一化融合的目标层。如果提供了 None,将推断出一个映射

  • transform_config

    用于覆盖提供的参数的可选变换配置