llmcompressor.modifiers.transform.spinquant
模块
-
base– -
mappings– -
norm_mappings–
类
-
Event–一个用于定义在稀疏化过程中可以触发的事件的类。
-
EventType–一个枚举,用于定义可以触发的不同类型的事件
-
Modifier–所有修改器继承的基类。
-
NormMapping–SpinQuant 需要知道模型中每个 norm 层的位置,
-
SpinQuantMapping–SpinQuant 需要知道模型的整个架构,
-
SpinQuantModifier–根据“SpinQuant: LLM 量化
-
State–状态类保存有关当前压缩状态的信息。
函数
-
center_embeddings–将每个嵌入的均值设为零
-
fuse_norm_linears–将归一化层的缩放操作融合到后续的线性层中。
-
untie_word_embeddings–如果可能,解绑词嵌入。如果模型定义中找不到嵌入,此函数将发出警告。
Event dataclass
Event(
type_: Optional[EventType] = None,
steps_per_epoch: Optional[int] = None,
batches_per_step: Optional[int] = None,
invocations_per_step: int = 1,
global_step: int = 0,
global_batch: int = 0,
)
一个用于定义在稀疏化过程中可以触发的事件的类。
参数
-
(类型_Optional[EventType], default:None) –事件类型。
-
(steps_per_epochOptional[int], 默认值:None) –每个 epoch 的步数。
-
(batches_per_stepOptional[int], 默认值:None) –每个步骤的批次数量,其中步骤是优化器步骤调用。对于大多数路径,它们是相同的。当它们不同时,请参阅 invocations_per_step 参数以获取更多详细信息。
-
(invocations_per_stepint, 默认值:1) –调用步骤包装器之前 optimizer.step 被调用的次数。通常可以保留为 1(默认值)。对于较旧的 amp 路径,这是在调用包装的优化器步骤函数以处理 fp16 中的累积之前调用缩放器包装器的次数。
-
(global_stepint, 默认值:0) –当前全局步骤。
-
(global_batchint, 默认值:0) –当前全局批次。
方法
-
new_instance–使用提供的关键字参数创建事件的新实例。
-
should_update–确定事件是否应触发更新。
属性
-
current_index(float) –计算事件的当前索引。
-
epoch(int) –计算当前 epoch。
-
epoch_based(bool) –确定事件是否基于 epoch。
-
epoch_batch(int) –计算当前 epoch 中的当前批次。
-
epoch_full(float) –计算当前 epoch 和当前步骤的比例。
-
epoch_step(int) –计算当前 epoch 中的当前步骤。
current_index property writable
计算事件的当前索引。
返回
-
float–事件的当前索引,可以是全局步数,也可以是当前步数占 epoch 的比例。
引发
-
ValueError–如果事件不是基于 epoch 的,或者每个 epoch 的步数太多。
epoch_batch property
计算当前 epoch 中的当前批次。
返回
-
int–当前 epoch 中的当前批次。
引发
-
ValueError–如果事件不是基于 epoch 的。
epoch_full property
计算当前 epoch 和当前步骤的比例。
返回
-
float–当前 epoch 和当前步骤的比例。
引发
-
ValueError–如果事件不是基于 epoch 的。
epoch_step property
计算当前 epoch 中的当前步骤。
返回
-
int–当前 epoch 中的当前步骤。
引发
-
ValueError–如果事件不是基于 epoch 的。
new_instance
使用提供的关键字参数创建事件的新实例。
参数
-
–kwargs要在新实例中设置的关键字参数。
返回
-
Event–具有提供的 kwargs 的事件新实例。
源代码位于 llmcompressor/core/events/event.py
should_update
确定事件是否应触发更新。
参数
-
(startOptional[float]) –要检查的起始索引,设置为 None 则忽略起始。
-
(结束Optional[float]) –要检查的结束索引,设置为 None 则忽略结束。
-
(更新Optional[float]) –更新间隔,设置为 None 或 0.0 则始终更新,否则必须大于 0.0,默认为 None。
返回
-
bool–如果事件应触发更新,则为 True,否则为 False。
源代码位于 llmcompressor/core/events/event.py
EventType
基类:Enum
一个枚举,用于定义在模型压缩生命周期中可以触发的不同类型的事件。每个 EventType 的目的是在训练或训练后管道中触发相应的修饰符回调。
参数
-
–初始化初始化事件类型。
-
–完成完成事件类型。
-
–BATCH_START批次开始事件类型。
-
–损失计算损失计算事件类型。
-
–BATCH_END批次结束事件类型。
-
–CALIBRATION_EPOCH_START校准 epoch 开始事件类型。
-
–SEQUENTIAL_EPOCH_END层校准 epoch 结束事件类型,专门用于
src/llmcompressor/pipelines/sequential/pipeline.py -
–CALIBRATION_EPOCH_END校准 epoch 结束事件类型。
-
–OPTIM_PRE_STEP优化前步骤事件类型。
-
–OPTIM_POST_STEP优化后步骤事件类型。
Modifier
Bases: ModifierInterface, HooksMixin
所有修改器继承的基类。修改器用于修改模型的训练过程。定义了所有修改器可用的基本属性和方法。
生命周期: 1. 初始化 2. on_event -> * 如果 self.start <= event.current_index 则 on_start * 如果 self.end >= event.current_index 则 on_end 5. 最终化
参数
-
–index修改器在模型修改器列表中的索引
-
–group修改器的组名
-
–start修改器的起始步长
-
–结束修改器的结束步长
-
–更新修改器的更新步长
方法
-
finalize–为给定模型和状态最终化修改器。
-
initialize–为给定模型和状态初始化修改器。
-
on_end–on_end 在修改器结束时调用,必须实现。
-
on_event–on_event 在事件触发时调用。
-
on_finalize–on_finalize 在修改器最终化时调用。
-
on_initialize–on_initialize 在修改器初始化时调用。
-
on_start–on_start 在修改器开始时调用。
-
on_update–on_update 在模型需要更新时调用。
-
should_end–:param event: 检查修改器是否应该结束的事件
-
should_start–:param event: 检查修改器是否应该开始的事件
-
update_event–根据给定事件更新修改器。进而调用
属性
-
finalized(bool) –:return: 如果修饰符已最终确定,则为 True
-
initialized(bool) –:return: 如果修饰符已初始化,则为 True
finalize
为给定模型和状态最终化修改器。
参数
-
(stateState) –模型的当前状态
-
–kwargs最终化修改器的附加参数
引发
-
RuntimeError–如果修改器未初始化
源代码位于 llmcompressor/modifiers/modifier.py
initialize
为给定模型和状态初始化修改器。
参数
-
(stateState) –模型的当前状态
-
–kwargs初始化修改器的附加参数
引发
-
RuntimeError–如果修改器已最终化
源代码位于 llmcompressor/modifiers/modifier.py
on_end
on_end 在修改器结束时调用,必须由继承的修改器实现。
参数
源代码位于 llmcompressor/modifiers/modifier.py
on_event
on_event 在事件触发时调用。
参数
源代码位于 llmcompressor/modifiers/modifier.py
on_finalize
on_finalize 在修改器最终化时调用,必须由继承的修改器实现。
参数
-
(stateState) –模型的当前状态
-
–kwargs最终化修改器的附加参数
返回
-
bool–如果修改器成功最终化则为 True,否则为 False
源代码位于 llmcompressor/modifiers/modifier.py
on_initialize abstractmethod
on_initialize 在修改器初始化时调用,必须由继承的修改器实现。
参数
-
(stateState) –模型的当前状态
-
–kwargs初始化修改器的附加参数
返回
-
bool–如果修改器成功初始化则为 True,否则为 False
源代码位于 llmcompressor/modifiers/modifier.py
on_start
on_start 在修改器开始时调用,必须由继承的修改器实现。
参数
源代码位于 llmcompressor/modifiers/modifier.py
on_update
on_update 在相关模型必须根据传入事件进行更新时调用。必须由继承的修改器实现。
参数
源代码位于 llmcompressor/modifiers/modifier.py
should_end
参数
-
(eventEvent) –检查修改器是否应该结束的事件
返回
- –
如果修改器应根据给定事件结束,则为 True
源代码位于 llmcompressor/modifiers/modifier.py
should_start
参数
-
(eventEvent) –检查修改器是否应该开始的事件
返回
-
bool–如果修改器应根据给定事件开始,则为 True
源代码位于 llmcompressor/modifiers/modifier.py
update_event
根据给定事件更新修改器。进而根据事件和修改器设置调用 on_start、on_update 和 on_end。如果修改器未初始化则立即返回。
参数
引发
-
RuntimeError–如果修改器已最终化
源代码位于 llmcompressor/modifiers/modifier.py
NormMapping
基类:BaseModel
SpinQuant 需要知道模型中每个 norm 层的位置,以及 norm 传递到的所有后续 Linear 层。这是因为需要对 norm 层的权重进行归一化,然后才能将变换融合到 Linear 层中。
参数
-
–norm匹配模型中 norm 层的名称或正则表达式
-
–linears接收来自 norm 输入的 Linear 层的名称或正则表达式列表。
SpinQuantMapping
基类:BaseModel
SpinQuant 需要知道模型的整个架构,因为 R1、R2、R3 和 R4 旋转需要应用于特定层(https://arxiv.org/pdf/2405.16406 图 1)。
参数
-
–embedding嵌入层的名称或正则表达式
-
–attn注意力块中 attention 层的名称或正则表达式
-
–attn_q注意力块中 q_proj 层的名称或正则表达式
-
–attn_k注意力块中 k_proj 层的名称或正则表达式
-
–attn_v注意力块中 v_proj 层的名称或正则表达式
-
–attn_o注意力块中 o_proj 层的名称或正则表达式
-
–attn_head_dim注意力模块的 head_dim,因为 R2 需要“逐头”应用于 v_proj 和 o_proj
-
–mlp_in接收 MLP 块输入的 MLP 块的名称或正则表达式列表,通常是 up_proj 和 gate_proj
-
–mlp_out构成 MLP 块输出的 MLP 块的名称或正则表达式列表,通常是 down_proj
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
- 归一化嵌入
- 将 norm 层融合到后续的 Linear 层
- 应用 TransformConfig
- 将变换合并到权重中,以便进行合并变换
- 添加在线变换的钩子
- 在序列 epoch 结束时
- on_end
- on_finalize
参数
-
–旋转一个列表,包含应用于模型的旋转名称。可能的旋转包括 R1、R2、R3 和 R4
-
–变换类型应用于模型的变换类型。
"hadamard"性能成本最低,但只支持 2 的幂次幂的尺寸。"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指定模型中要应用 norm 融合的目标层。如果提供 None,则会自动推断映射
-
–transform_config用于覆盖提供的参数的可选变换配置
State dataclass
State(
model: Any = None,
teacher_model: Any = None,
optimizer: Any = None,
optim_wrapped: bool = None,
loss: Any = None,
batch_data: Any = None,
data: Data = Data(),
hardware: Hardware = Hardware(),
loggers: Optional[LoggerManager] = None,
model_log_cadence: Optional[float] = None,
_last_log_step: Union[float, int, None] = None,
)
状态类保存有关当前压缩状态的信息。
参数
-
(modelAny, 默认值:None) –用于压缩的模型
-
(teacher_modelAny, 默认值:None) –用于压缩的教师模型
-
(优化器Any, 默认值:None) –用于训练的优化器
-
(optim_wrappedbool, 默认值:None) –优化器是否已被包装
-
(损失Any, 默认值:None) –用于训练的损失函数
-
(batch_dataAny, 默认值:None) –当前用于压缩的批次数据
-
(dataData, default:Data()) –用于训练、验证、测试和/或校准的数据集,包装在 Data 实例中
-
(硬件Hardware, default:Hardware()) –硬件实例,包含有关正在使用的目标硬件的信息
-
(loggersOptional[LoggerManager], default:None) –LoggerManager 实例,包含所有要记录的日志记录器
-
(model_log_cadenceOptional[float], 默认值:None) –记录模型信息相对于 epoch 的节奏。如果为 1,则每个 epoch 记录一次。如果为 2,则每隔一个 epoch 记录一次,依此类推。默认值为 1。
方法
-
update–使用给定参数更新状态。
属性
-
compression_ready(bool) –检查模型和优化器是否已设置为进行压缩。
compression_ready property
检查模型和优化器是否已设置为进行压缩。
返回
-
bool–如果模型和优化器已设置,则为 True,否则为 False
update
update(
model: Any = None,
teacher_model: Any = None,
optimizer: Any = None,
attach_optim_callbacks: bool = True,
train_data: Any = None,
val_data: Any = None,
test_data: Any = None,
calib_data: Any = None,
copy_data: bool = True,
start: float = None,
steps_per_epoch: int = None,
batches_per_step: int = None,
loggers: Union[
None, LoggerManager, List[BaseLogger]
] = None,
model_log_cadence: Optional[float] = None,
**kwargs,
) -> Dict
使用给定参数更新状态。
参数
-
(modelAny, 默认值:None) –用于更新状态的模型
-
(teacher_modelAny, 默认值:None) –用于更新状态的教师模型
-
(优化器Any, 默认值:None) –用于更新状态的优化器
-
(attach_optim_callbacksbool, 默认值:True) –是否附加优化器回调
-
(train_dataAny, 默认值:None) –用于更新状态的训练数据
-
(val_dataAny, 默认值:None) –用于更新状态的验证数据
-
(test_dataAny, 默认值:None) –用于更新状态的测试数据
-
(calib_dataAny, 默认值:None) –用于更新状态的校准数据
-
(copy_databool, 默认值:True) –是否复制数据
-
(startfloat, 默认值:None) –用于更新状态的起始索引
-
(steps_per_epochint, 默认值:None) –用于更新状态的每个 epoch 的步数
-
(batches_per_stepint, 默认值:None) –用于更新状态的每个步骤的批次数量
-
(loggersUnion[None, LoggerManager, List[BaseLogger]], default:None) –用于设置记录重要信息和里程碑的指标管理器,也接受 BaseLogger 列表
-
(model_log_cadenceOptional[float], 默认值:None) –记录模型信息相对于 epoch 的节奏。如果为 1,则每个 epoch 记录一次。如果为 2,则每隔一个 epoch 记录一次,依此类推。默认值为 1。
-
–kwargs用于更新状态的额外关键字参数
返回
-
Dict–更新后的状态字典
源代码位于 llmcompressor/core/state.py
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | |
center_embeddings
将每个嵌入的均值设为零
参数
-
(embeddingModule) –包含要居中嵌入的嵌入模块
源代码在 llmcompressor/modeling/fuse.py
fuse_norm_linears
将归一化层的缩放操作融合到后续的线性层中。这对于确保归一化层和线性层之间的变换不变性很有用。
请注意,幺正变换(旋转)与归一化可交换,但与缩放不可交换
参数
-
(normModule) –归一化层,其权重将融合到后续的线性层中
-
(linearsIterable[Linear]) –紧跟在归一化层之后的线性层
源代码在 llmcompressor/modeling/fuse.py
untie_word_embeddings
如果可能,解绑词嵌入。如果模型定义中找不到嵌入,此函数将发出警告。
模型配置将更新以反映嵌入现已解绑
参数
-
(modelPreTrainedModel) –包含词嵌入的 transformers 模型