paint-brush
为 DNN 释放 2 倍加速:只需 1 分钟即可使用集成神经网络转换模型经过@thestage
1,231 讀數
1,231 讀數

为 DNN 释放 2 倍加速:只需 1 分钟即可使用集成神经网络转换模型

经过 TheStage AI6m2023/08/31
Read on Terminal Reader

太長; 讀書

在本文中,我们将引导您完成将 4 倍图像超分辨率 EDSR 模型转换为 INN 的过程,然后展示如何实现模型的结构化剪枝。最后,我们将 INN 转换回离散 DNN,并将其部署在 Nvidia GPU 上以进行高效推理。
featured image - 为 DNN 释放 2 倍加速:只需 1 分钟即可使用集成神经网络转换模型
TheStage AI HackerNoon profile picture
0-item
1-item


积分神经网络(INN)是灵活的架构,经过一次训练就可以转换为任意用户定义的大小,无需任何微调。由于声波(音乐)可以以任何所需的采样率(音质)进行采样,INN 可以动态改变数据和参数形状(DNN 质量)。


INN 申请。在推理过程中,可以根据硬件或数据条件动态改变网络的大小。尺寸减小是结构化的,并自动导致神经网络的压缩和加速。



TheStage.ai团队在 IEEE/CVF CVPR 2023 会议上展示了他们的论文“Integral Neural Networks”。该作品被认为是此次活动中仅有的 12 篇“候选奖”论文之一。 INN 是一类新型神经网络,它结合了连续参数和积分算子来表示基本层。在推理阶段,INN 通过连续权重的离散采样转换为普通 DNN 表示。这种网络的参数沿着滤波器和通道维度是连续的,这导致结构化修剪,而无需仅通过沿着这些维度重新离散化进行微调。


在本文中,我们将引导您完成将 4 倍图像超分辨率 EDSR 模型转换为 INN 的过程,然后展示如何实现模型的结构化剪枝。最后,我们将 INN 转换回离散 DNN,并将其部署在 Nvidia GPU 上以进行高效推理。本文将按以下顺序进行:


  1. INN 简介。
  2. 用于超分辨率任务的 EDSR 网络概述。
  3. TorchIntegral 框架应用程序可通过一行代码获取积分 EDSR。
  4. 无需 INN 微调的 INN 结构修剪(快速管道)。
  5. 在 Nvidia GPU 上部署修剪后的模型。


有关更多信息和更新,请查看以下资源:

INN项目现场

INN 项目 Github

本文的支持代码


离散 EDSR 的特征图。


INN EDSR 的特征图。很容易看出INN中的通道是连续组织的。


用于无需微调的 DNN 修剪的 INN

INN 中的层被积分算子取代,但积分算子的实际评估需要对输入信号进行离散化,以便使用数值积分方法。事实证明,INN 中的层的设计方式与离散化后的经典 DNN 层(全连接、卷积)一致。


积分全连接层评估概述。


EDSR 4x 图像超分辨率修剪

图像超分辨率是一项众所周知的计算机视觉任务,其中应该使用已知或未知的退化算子来增强图像。我们考虑使用双三次下采样作为退化算子的经典超分辨率形式。


许多架构可用于图像超分辨率任务,包括基于扩散模型和变压器的高端神经网络。在本文档中,我们将重点关注 4x EDSR 架构。 EDSR 架构非常适合我们的演示,因为它包含 ResNet(广泛用于许多深度学习问题)和最后的 4 倍上采样块。 EDSR 的示意图如下图所示。


EDSR 架构。 EDSR 架构由一系列残差块组成,后跟一个上采样块。该上采样块由多个卷积和上采样层组成。


左:残差块架构。右图:4 倍超分辨率的上采样块,每个上采样层都有 2 倍的比例。


EDSR 架构修剪的细节

结构化剪枝涉及删除整个过滤器或通道,对作为 EDSR 中主要构建块的残差块具有独特的影响。由于每个状态都是通过向输入添加 Conv -> ReLU -> Conv 块来更新的,因此输入和输出信号必须具有相同数量的参数。通过创建修剪依赖关系图,可以在 TorchIntegral 中有效地管理这一点。下图说明了每个残差块的第二次卷积形成单个组。


修剪依赖组。在残差块序列中,第二个卷积形成单个组。


为了修剪残差块中的第二卷积,需要修剪每个残差块中的所有第二卷积。然而,为了更灵活的设置,我们在所有残差块中修剪第一个卷积的滤波器,从而修剪第二个卷积的通道。


将 EDSR 模型转换为 INN EDSR

对于预训练 DNN 的转换,我们利用特殊的滤波器通道排列算法进行进一步平滑插值。排列算法保留了模型质量,同时使 DNN 的权重看起来像是从连续函数中采样的。


DNN 到 INN 的转换。我们使用旅行商问题公式来排列离散权重。排列后,我们获得了更平滑的权重,同时预训练的 DNN 质量没有下降。


 import torch import torchintegral as inn from super_image import EdsrModel # creating 4x EDSR model model = EdsrModel.from_pretrained("eugenesiow/edsr", scale=4).cuda() # Transform model layers to integral. # continous_dims and discrete dims define which dimensions # of parameters tensors should be parametrized continuously # or stay fixed size as in discrete networks. # In our case we make all filter and channel dimensions # to be continuous excluding convolutions of the upsample block. model = inn.IntegralWrapper(init_from_discrete=True)( model, example_input, continuous_dims, discrete_dims ).cuda()


集成网格调整:DNN 的结构化训练后修剪

积分网格调整是平滑选择(在 SGD 优化下)参数张量的操作,其滤波器应针对用户定义的数字进行采样。与滤波器/通道删除方法不同,INN 生成的滤波器可以通过插值操作组合多个离散滤波器。


INN 在滤波器和通道维度上的参数张量上引入了软按索引选择操作


 # Set trainable gird for each integral layer # Each group should have the same grid # During the sum of continuous signals # We need to sample it using the same set of points for group in model.groups: new_size = 224 if 'operator' in group.operations else 128 group.reset_grid(inn.TrainableGrid1D(new_size)) # Prepare model for tuning of integration grid model.grid_tuning() # Start training train(model, train_data, test_data)


积分网格调整是一种快速优化过程,可以在小型校准集上进行。此优化的结果是结构压缩的 DNN。在单个 Nvidia A4000 上的测试表明,完整 Div2k 数据集上的集成网格调整需要 4 分钟。 4x A4000 上的分布式设置几乎实现了 4 倍的加速,优化时间仅为 1 分钟


在我们的实验中,我们发现 500 张图像与包含 4000 张图像的完整训练集 Div2k 给出的结果相同。


表现

生成的 INN 模型可以轻松转换为离散模型并部署在任何 NVIDIA GPU 上。我们在 RTX A4000 上提供每秒帧数 (FPS),输入分辨率为 64x64。压缩模型几乎实现了 2 倍的加速。要将修剪后的 INN 模型转换为离散模型,可以使用以下代码行:


 model = model.transform_to_discrete() # then model can be compiled, for instance # compilation can add an additional 1.4x speedup for inference model = torch.compile(model, backend='cudagraphs') 


左边。 4x 双三次放大图像。正确的。使用 INN 的 50% 压缩 EDSR 模型。


模型

尺寸 FP16

FPS RTX A4000

峰值信噪比

EDSR 原版。

75MB

170

30.65

因恩 EDSR 30%

52MB

230

30.43

因恩 EDSR 40%

45MB

270

30.34

因恩 EDSR 50%

37MB

320

30.25

结论

在本文中,我们概述了 CVPR2023 候选论文“Integral Neural Networks”。应用于4x EDSR模型的训练后剪枝,通过单行代码和1分钟的集成网格微调,实现了近2倍的加速。


在未来的文章中,我们将介绍 INN 的更多应用,并涵盖有关高效模型部署的更多细节。敬请关注:


INN项目现场

INN 项目 Github

本文的支持代码


感谢您的关注!


也发布在这里