稀疏性
介绍
ModelOpt的稀疏性模块(modelopt.torch.sparsity)使您能够稀疏化模型的权重。这对于减少模型的内存占用非常有用,也可以用于加速推理。
按照以下步骤使用ModelOpt的稀疏性模块modelopt.torch.sparsity来获得具有稀疏权重的模型:
训练: 您可以使用现有的训练管道训练您的模型,或者为您的模型加载一个预训练的检查点。
稀疏化: 使用提供的
mts.sparsifyAPI 对模型进行稀疏化。检查点并重新加载:通过
mto.save保存模型,并通过mto.restore恢复。了解更多,请参阅保存和加载ModelOpt修改后的模型。
要了解更多关于稀疏性及相关概念的信息,请参阅 稀疏性概念部分。
训练后稀疏化
训练后稀疏化是将密集模型转换为稀疏模型而无需重新训练的过程。稀疏化模型的最简单方法是使用mts.sparsify API。
mts.sparsify API 接受稀疏配置和稀疏格式作为输入,并返回一个稀疏模型。稀疏配置是一个字典,指定要稀疏化的层以及用于数据驱动稀疏化(例如,SparseGPT)中的校准的可选数据加载器。
mts.sparsify() 支持 NVIDIA ASP 和 SparseGPT 方法,分别用于基于幅度的和数据驱动的稀疏化。
示例用法:
import torch
from transformers import AutoModelForCausalLM
import modelopt.torch.sparsity as mts
# User-defined model
model = AutoModelForCausalLM.from_pretrained("EleutherAI/gpt-j-6b")
# Configure and convert for sparsity
sparsity_config = {
# data_loader is required for sparsity calibration
"data_loader": calib_dataloader,
"collect_func": lambda x: x,
}
sparse_model = mts.sparsify(
model,
"sparsegpt", # or "sparse_magnitude"
config=sparsity_config,
)
注意
data_loader 仅在数据驱动的稀疏性情况下需要,例如在 sparsegpt 中进行校准时。sparse_magnitude 不需要 data_loader,因为它使用基于幅度的阈值方法。
保存和恢复稀疏模型
为了存储稀疏模型以供将来使用,调用
mto.save():
mto.save(sparse_model, "modelopt_sparse_model.pth")
注意
mto.save() 将保存模型的状态字典,以及稀疏掩码和元数据,以便稍后正确重新创建稀疏模型。
要恢复保存的稀疏模型,您可以使用
mto.restore():
import modelopt.torch.opt as mto
# Re-initialize the original, unmodified model
model = AutoModelForCausalLM.from_pretrained("EleutherAI/gpt-j-6b")
# Restore the sparse model and metadata.
sparse_model = mto.restore(model, "modelopt_sparse_model.pth")
注意
mto.restore() 将恢复模型的 state_dict,以及每个稀疏模块的稀疏掩码和元数据。普通的 pytorch 模块将被转换为稀疏模块。当访问模型权重时,稀疏掩码将自动生效。
注意
mts.export() 将会把稀疏模型导出为一个普通的pytorch模型。稀疏掩码将被应用到模型权重上,并且所有的稀疏元数据将被移除。导出后,在后续的微调过程中将不再强制执行稀疏性。如果你想要继续微调,请不要导出模型。
注意
请参阅保存和恢复ModelOpt修改的模型以了解所有可用的保存和恢复选项。
稀疏性概念
下面,我们将概述ModelOpt的稀疏性特性及其基本概念和术语。
结构化和非结构化稀疏性
权重稀疏是一种模型优化技术,其中模型中的一部分权重被设为零。模型稀疏可以大致分为结构化和非结构化稀疏。非结构化稀疏指的是零权重在权重矩阵中随机分布的情况。非结构化稀疏更加灵活,但在高度并行的硬件架构(如GPU)上可能导致利用率低下。另一方面,结构化稀疏在内存访问方面更高效,并且可以利用它来实现更高的数学吞吐量。结构化稀疏通常可以通过在权重上强制执行特定的稀疏模式来实现。
N:M 稀疏性
N:M 稀疏性指的是一种特殊类型的细粒度结构化模式,其中在每个连续的 M 个元素的块中,最多有 N 个非零元素。由于其规律性,N:M 稀疏性可以在 GPU 架构上高效实现,并提供以下好处:
减少内存带宽需求: N:M 稀疏模式比密集权重和非结构化稀疏模式的权重具有更小的内存带宽需求。
更高的数学吞吐量: 当第一个参数是压缩的N:M稀疏矩阵时,稀疏张量核心为矩阵乘法操作提供更高的数学吞吐量。例如,2:4稀疏模式允许在稀疏张量核心上实现2倍的数学吞吐量。
在当前的Nvidia架构(Ampere或更高版本)上,2:4稀疏性,即在每四个连续元素的块中有两个非零元素,支持在稀疏Tensor Cores上进行加速推理。
稀疏化算法
实现权重稀疏性有很多方法。一种常用的方法是基于幅度的稀疏性,其中在M个元素的块中,保留N个最大的元素,其余元素设置为零。基于幅度的稀疏性简单易实现,但可能无法很好地保留原始模型的准确性。其他方法,如数据驱动的稀疏性(例如,最佳脑外科医生),通常能提供更好的准确性。ModelOpt支持基于幅度的稀疏性(NVIDIA ASP)和数据驱动的稀疏性(SparseGPT)。