llmcompressor.modifiers.transform.spinquant.base
类
-
SpinQuantModifier–实现“SpinQuant: LLM量化
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用于覆盖提供的参数的可选变换配置