剪枝

提示

查看CIFAR-10 上的 ResNet20 笔记本HF BERT 剪枝、蒸馏与量化 以获取一个端到端的剪枝示例。

ModelOpt 提供了三种主要的剪枝方法(也称为 mode)—— Minitron、FastNAS 和 GradNAS —— 通过统一的 API mtp.prune。给定一个模型, 这些方法从您提供的基础模型中找到一个满足给定部署约束(例如 FLOPs、参数)的子网络, 并且几乎没有精度损失(取决于剪枝的激进程度)。 这些剪枝方法支持剪枝卷积层和线性层,以及模型的注意力头。关于这些剪枝模式的更多细节如下:

  1. fastnas: 一种推荐用于计算机视觉模型的剪枝方法。给定一个预训练模型,FastNAS 找到在满足给定约束的同时最大化评分函数的子网络。

  2. mcore_gpt_minitron: 由NVIDIA Research开发的一种剪枝方法,用于在NVIDIA NeMo或Megatron-LM框架中使用管道并行性的GPT风格模型(例如Llama 3)。它使用激活幅度来剪枝模型的mlp、注意力头、GQA查询组、嵌入隐藏大小和层数。查看论文中算法的更多详细信息。

  3. gradnas: 一种轻量级的剪枝方法,推荐用于像Hugging Face BERT和GPT-J这样的语言模型。 它使用梯度信息来剪枝模型的线性层和注意力头,以满足给定的约束条件。

按照以下步骤使用mtp获取满足您要求的最佳模型:

  1. 训练: 只需使用现有的训练流程训练您的模型,或为您的模型加载预训练的检查点。

  2. 剪枝: 使用我们提供的 mtp.prune API 对模型进行剪枝,并获取描述剪枝后网络架构的最优子网。

  3. 微调: 微调生成的子网络以恢复准确性。

要了解更多关于NAS和剪枝背后的概念,请参考 NAS 概念

培训

要进行剪枝,您可以使用通过转换预训练检查点模型获得的模型,或者从头开始训练模型。

只需初始化您的模型并在开始使用ModelOpt之前加载检查点。

你可以简单地使用现有的训练管道来训练模型,无需进一步修改。

微调

架构搜索的最后一步是在您的数据集上微调修剪后的模型。这样您可以确保为修剪后的模型获得最佳性能。

先决条件

  1. 要进行微调,您需要一个修剪过的子网,如前一节所述。

  2. 您可以重用现有的训练管道。我们建议使用原始的训练计划进行微调:

    • 1x 训练周期(或 1x 下游任务微调),

    • 相同或更小(0.5x-1x)的学习率。

加载修剪后的模型

你可以简单地使用mto.restore()来恢复你修剪过的模型(权重和架构):

import modelopt.torch.opt as mto
from torchvision.models import resnet50

# Build original model
model = resnet50()

# Restore the pruned architecture and weights
pruned_model = mto.restore(model, "modelopt_pruned_model.pth")

运行微调

现在,请继续使用您标准的训练流程和预配置的超参数对剪枝后的子网进行微调。通常一个好的微调计划是重复预训练计划,初始学习率为0.5x-1x。

不要忘记使用mto.save()保存模型。

train(pruned_model)

mto.save(pruned_model, "modelopt_pruned_finetuned_model.pth")

部署

经过修剪和微调的模型现在已准备好用于部署等下游任务。你现在手中的模型应该是满足部署感知搜索约束的最佳神经网络。

import modelopt.torch.opt as mto
from torchvision.models import resnet50

# Build original model
model = resnet50()

model = mto.restore(model, "modelopt_pruned_finetuned_model.pth")

# Continue with downstream tasks like deployment (e.g. TensorRT or TensorRT-LLM)
...

剪枝概念

剪枝是从神经网络中移除冗余组件的过程,针对特定任务。从概念上讲,剪枝与NAS(神经架构搜索)类似,但与NAS相比,剪枝的计算开销较小,但代价是可能找到的架构不如NAS找到的最优架构。大多数API基于相应的NAS API,但进行了调整以反映更简单的工作流程。

具体来说,对于剪枝,我们并不专门训练搜索空间及其所有子网。 相反,我们使用预训练的检查点来近似搜索空间。因此,我们可以跳过 (可能昂贵的)搜索空间训练步骤,直接 搜索子网架构,然后再对 生成的子网进行微调。

注意

如果你想了解更多关于NAS和剪枝背后的概念,请查看 NAS概念,包括NAS和剪枝之间更详细的比较。