积分神经网络(INN)是灵活的架构,经过一次训练就可以转换为任意用户定义的大小,无需任何微调。由于声波(音乐)可以以任何所需的采样率(音质)进行采样,INN 可以动态改变数据和参数形状(DNN 质量)。
TheStage.ai团队在 IEEE/CVF CVPR 2023 会议上展示了他们的论文“Integral Neural Networks”。该作品被认为是此次活动中仅有的 12 篇“候选奖”论文之一。 INN 是一类新型神经网络,它结合了连续参数和积分算子来表示基本层。在推理阶段,INN 通过连续权重的离散采样转换为普通 DNN 表示。这种网络的参数沿着滤波器和通道维度是连续的,这导致结构化修剪,而无需仅通过沿着这些维度重新离散化进行微调。
在本文中,我们将引导您完成将 4 倍图像超分辨率 EDSR 模型转换为 INN 的过程,然后展示如何实现模型的结构化剪枝。最后,我们将 INN 转换回离散 DNN,并将其部署在 Nvidia GPU 上以进行高效推理。本文将按以下顺序进行:
有关更多信息和更新,请查看以下资源:
INN 中的层被积分算子取代,但积分算子的实际评估需要对输入信号进行离散化,以便使用数值积分方法。事实证明,INN 中的层的设计方式与离散化后的经典 DNN 层(全连接、卷积)一致。
图像超分辨率是一项众所周知的计算机视觉任务,其中应该使用已知或未知的退化算子来增强图像。我们考虑使用双三次下采样作为退化算子的经典超分辨率形式。
许多架构可用于图像超分辨率任务,包括基于扩散模型和变压器的高端神经网络。在本文档中,我们将重点关注 4x EDSR 架构。 EDSR 架构非常适合我们的演示,因为它包含 ResNet(广泛用于许多深度学习问题)和最后的 4 倍上采样块。 EDSR 的示意图如下图所示。
结构化剪枝涉及删除整个过滤器或通道,对作为 EDSR 中主要构建块的残差块具有独特的影响。由于每个状态都是通过向输入添加 Conv -> ReLU -> Conv 块来更新的,因此输入和输出信号必须具有相同数量的参数。通过创建修剪依赖关系图,可以在 TorchIntegral 中有效地管理这一点。下图说明了每个残差块的第二次卷积形成单个组。
为了修剪残差块中的第二卷积,需要修剪每个残差块中的所有第二卷积。然而,为了更灵活的设置,我们在所有残差块中修剪第一个卷积的滤波器,从而修剪第二个卷积的通道。
对于预训练 DNN 的转换,我们利用特殊的滤波器通道排列算法进行进一步平滑插值。排列算法保留了模型质量,同时使 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()
积分网格调整是平滑选择(在 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')
模型 | 尺寸 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 的更多应用,并涵盖有关高效模型部署的更多细节。敬请关注:
感谢您的关注!
也发布在这里。