模型剪枝,不可忽视的推断效率提升方法

国内新闻 浏览(902)

模型修剪,一种不可忽视的推理效率提升方法

来自TowardsDataScience

作者:Ranjeet Singh

机器的核心编译

参与:道路

修剪是常用的模型压缩方法之一。本文简要介绍了修剪的原理和效果。

目前,深度学习模型需要大量的计算能力,内存和功率。当我们需要执行实时推理,在设备端运行模型以及使用有限的计算资源运行浏览器时,这是瓶颈。能耗是当前深度学习模型的主要关注点。解决该问题的一种方法是提高推理的效率。

大模型=>更多内存参考=>更多能量

修剪是提高推理效率的方法之一。它可以有效地生成具有更小规模,更高内存利用率,更低能耗,更快推理以及最小推断精度损失的模型。这些技术还包括重量。分享和量化。深度学习从神经科学中汲取灵感,修剪也受到生物学的启发。

随着深度学习的发展,目前的最优模型精度越来越高,但这一进步伴随着成本的增加。本文将讨论这个问题。

挑战1:模型尺寸越来越大

通过无线更新很难分发大型模型。

f0e403cb2ab941b8a9d5ec2d0d387ec5.jpeg

Bill Dally在NIPS 2016深度神经网络高效方法研讨会上的演讲。

挑战2:速度

fde108941e5242c3861dfa5a4b33936d.png

当使用4个M40 GPU训练ResNet时间时,所有四个模型都遵循fb.resnet.torch培训。

培训时间的长短限制了机器学习研究人员的生产力。

挑战3:能源消耗

AlphaGo使用1920个CPU和280个GPU,每个游戏的成本为3,000美元。

a041f061994945bf833777a3ebab9701.jpeg

这意味着对于移动设备:电池耗尽

对于数据中心意味着:总体拥有成本(TCO)上升

解决方案:高效的推理算法

修剪

重量分享

低秩近似

二进制网/三元网

Winograd转型

修剪的生物灵感

修剪人工神经网络的灵感来自人脑中的突触修剪。突触修剪,轴突和树突的完全衰退和死亡,是在童年和青年期间在许多哺乳动物中发生的突触丧失的过程。当雄性出生并持续到20多岁时,突触修剪就开始了。

60d2f90439c64100b95e2c3b3bdefbc1.jpeg

克里斯托弗A沃尔什。 Peter Huttenlocher(1931-2013)。 Nature,502(7470): 172-172,2013。

修剪深层神经网络

521a79e590c04e0ebd3a3dee00b65ab6.jpeg

[Lecun等人NIPS 89][Han等人NIPS 15]。

神经网络通常显示在左边,如上图所示:下层的每个神经元都与上层相连,但这意味着我们必须做很多浮点乘法。在完美的情况下,我们只需要将每个神经元与其他几个神经元连接起来,而不需要任何其他浮点乘法。这被称为“稀疏”网络。

稀疏网络更容易压缩,我们可以在推断期间跳过零以提高延迟。

如果你可以根据网络对神经元进行分类,但是可以贡献它们,你可以移除低阶神经元,得到一个更小更快的网络。

更快/更小的网络对于在移动设备上运行它们很重要。

如果按照神经元权重的l1/l2范数排序,剪枝后模型的精度会降低(如果排序做得好,可能会稍微降低),通常需要对网络进行训练剪枝训练-可以恢复剪枝的迭代。如果我们一次修剪得太多,网络就会严重损坏,无法恢复。因此,在实践中,修剪是一个迭代过程,通常称为“迭代修剪”:修剪/训练/重复。

要了解有关迭代修剪的更多信息,请参见TensorFlow团队的代码:

重量修剪

将权重矩阵中的多个权重设置为0,这对应于上图中的删除连接。为了实现稀疏度k%,我们根据权重大小对权重矩阵W中的权重进行排序,然后将排序的最后k%设置为0.

F=h5py.File( 'model_weights.h5', 'R +')

对于k [.25,50,60,70,80,90,95,97,99]:

行列={}

列表中的l(f [“model_weights”])[: -1]:

数据=f [「model_weights」] [l] [l] [「内核: 0」]

W=np.array(数据)

行列[1]=(rankdata(np.abs(W),方法='密') - 1).astype(INT).reshape(w.shape)

Lower_bound_rank=np.ceil(np.max(行列[1])* k)的.astype(int)的

行列[1] [行列[1]=lower_bound_rank]=0

行列[1] [行列[1] GT; lower_bound_rank]=1

W=W *行列[1]

数据[.]=W

单位/神经元修剪

将权重矩阵中的多个整数列设置为0以删除相应的输出神经元。

为了实现稀疏度k%,我们根据L2范数对权重矩阵中的列进行排序,并删除排序的最后k%。

F=h5py.File( 'model_weights.h5', 'R +')

对于k [.25,50,60,70,80,90,95,97,99]:

行列={}

列表中的l(f ['model_weights'])[: -1]:

数据=f ['model_weights'] [l] [l] ['内核: 0']

W=np.array(数据)

范数=LA.norm(W,轴=0)

范数=np.tile(范数,(w.shape [0],1))

行列[1]=(rankdata(范数,方法='密') - 1).astype(INT).reshape(norm.shape)

Lower_bound_rank=np.ceil(np.max(行列[1])* k)的.astype(int)的

行列[1] [行列[1]=lower_bound_rank]=0

行列[1] [行列[1] GT; lower_bound_rank]=1

W=W *行列[1]

数据[.]=W

随着稀疏性的增加和网络的减少越来越多,任务性能将逐渐下降。那么您认为稀疏性与性能的下降曲线是什么?

让我们看一个使用简单的图像分类神经网络架构对MNIST数据集执行任务并修剪网络的示例。

下图显示了神经网络的架构:

36812fea5c0b4865ac2f466960fd1ebc.png

请参阅代码中使用的模型体系结构。

d8bbe5eb753e4cd3a229ab953da8c6ec.png

稀疏与准确。读者可以使用该代码重现上面的图像(

1e387bab21d444418756abf449250a24.png

总结

许多研究人员认为修剪方法被忽略了,需要更多的关注和实践。本文介绍如何在小型数据集上使用非常简单的神经网络架构获得良好的结果。我认为深度学习在实践中解决的许多问题是相似的,所以这些问题也可以从修剪方法中受益。

参考

本文的相关代码:

修剪或不修剪:探索修剪模型压缩的功效,Michael H. Zhu,Suyog Gupta,2017(

在卷积神经网络中学习修剪滤波器,黄倩贵等。 al,2018(

修剪深度神经网络使其快速小巧(

以查看更多

12: 45

来源:同步机器的心脏

模型修剪,一种不可忽视的推理效率提升方法

来自TowardsDataScience

作者:Ranjeet Singh

机器的核心编译

参与:道路

修剪是常用的模型压缩方法之一。本文简要介绍了修剪的原理和效果。

目前,深度学习模型需要大量的计算能力,内存和功率。当我们需要执行实时推理,在设备端运行模型以及使用有限的计算资源运行浏览器时,这是瓶颈。能耗是当前深度学习模型的主要关注点。解决该问题的一种方法是提高推理的效率。

大模型=>更多内存参考=>更多能量

修剪是提高推理效率的方法之一。它可以有效地生成具有更小规模,更高内存利用率,更低能耗,更快推理以及最小推断精度损失的模型。这些技术还包括重量。分享和量化。深度学习从神经科学中汲取灵感,修剪也受到生物学的启发。

随着深度学习的发展,目前的最优模型精度越来越高,但这一进步伴随着成本的增加。本文将讨论这个问题。

挑战1:模型尺寸越来越大

通过无线更新很难分发大型模型。

f0e403cb2ab941b8a9d5ec2d0d387ec5.jpeg

Bill Dally在NIPS 2016深度神经网络高效方法研讨会上的演讲。

挑战2:速度

fde108941e5242c3861dfa5a4b33936d.png

当使用4个M40 GPU训练ResNet时间时,所有四个模型都遵循fb.resnet.torch培训。

培训时间的长短限制了机器学习研究人员的生产力。

挑战3:能源消耗

AlphaGo使用1920个CPU和280个GPU,每个游戏的成本为3,000美元。

a041f061994945bf833777a3ebab9701.jpeg

这意味着对于移动设备:电池耗尽

对于数据中心意味着:总体拥有成本(TCO)上升

解决方案:高效的推理算法

修剪

重量分享

低秩近似

二进制网/三元网

Winograd转型

修剪的生物灵感

修剪人工神经网络的灵感来自人脑中的突触修剪。突触修剪,轴突和树突的完全衰退和死亡,是在童年和青年期间在许多哺乳动物中发生的突触丧失的过程。当雄性出生并持续到20多岁时,突触修剪就开始了。

60d2f90439c64100b95e2c3b3bdefbc1.jpeg

克里斯托弗A沃尔什。 Peter Huttenlocher(1931-2013)。 Nature,502(7470): 172-172,2013。

修剪深层神经网络

521a79e590c04e0ebd3a3dee00b65ab6.jpeg

[Lecun等人。 NIPS 89] [Han et al。 NIPS 15]

神经网络通常显示在左侧,如上所示:下层的每个神经元都连接到上层,但这意味着我们必须进行大量的浮点乘法。在完美的情况下,我们只需要将每个神经元与其他几个神经元连接起来,而不需要任何其他浮点乘法。这被称为“稀疏”网络。

稀疏网络更容易压缩,我们可以在推断期间跳过零以改善延迟。

如果您可以根据网络对神经元进行排序,但可以对其进行排序,则可以删除较低阶的神经元并获得更小更快的网络。

更快/更小的网络对于在移动设备上运行它们非常重要。

如果按照神经元权重的L1/L2范数进行排序,修剪后模型的准确性会降低(如果排序很好,可能会略微下降),网络通常需要进行培训 - 修剪 - 训练 - 可以恢复修剪的迭代。如果我们立刻削减太多,网络可能会严重受损,无法恢复。因此,在实践中,修剪是一个迭代过程,通常称为“迭代修剪”:修剪/训练/重复。

要了解有关迭代修剪的更多信息,请参阅TensorFlow团队的代码:

重量修剪

将权重矩阵中的多个权重设置为0,这对应于上图中的删除连接。为了实现稀疏度k%,我们根据权重大小对权重矩阵W中的权重进行排序,然后将排序的最后k%设置为0.

F=h5py.File( 'model_weights.h5', 'R +')

对于k [.25,50,60,70,80,90,95,97,99]:

行列={}

列表中的l(f [“model_weights”])[: -1]:

数据=f [「model_weights」] [l] [l] [「内核: 0」]

W=np.array(数据)

行列[1]=(rankdata(np.abs(W),方法='密') - 1).astype(INT).reshape(w.shape)

Lower_bound_rank=np.ceil(np.max(行列[1])* k)的.astype(int)的

行列[1] [行列[1]=lower_bound_rank]=0

行列[1] [行列[1] GT; lower_bound_rank]=1

W=W *行列[1]

数据[.]=W

单位/神经元修剪

将权重矩阵中的多个整数列设置为0以删除相应的输出神经元。

为了实现稀疏度k%,我们根据L2范数对权重矩阵中的列进行排序,并删除排序的最后k%。

F=h5py.File( 'model_weights.h5', 'R +')

对于k [.25,50,60,70,80,90,95,97,99]:

行列={}

列表中的l(f ['model_weights'])[: -1]:

数据=f ['model_weights'] [l] [l] ['内核: 0']

W=np.array(数据)

范数=LA.norm(W,轴=0)

范数=np.tile(范数,(w.shape [0],1))

行列[1]=(rankdata(范数,方法='密') - 1).astype(INT).reshape(norm.shape)

Lower_bound_rank=np.ceil(np.max(行列[1])* k)的.astype(int)的

行列[1] [行列[1]=lower_bound_rank]=0

行列[1] [行列[1] GT; lower_bound_rank]=1

W=W *行列[1]

数据[.]=W

随着稀疏性的增加和网络的减少越来越多,任务性能将逐渐下降。那么您认为稀疏性与性能的下降曲线是什么?

让我们看一个使用简单的图像分类神经网络架构对MNIST数据集执行任务并修剪网络的示例。

下图显示了神经网络的架构:

36812fea5c0b4865ac2f466960fd1ebc.png

请参阅代码中使用的模型体系结构。

d8bbe5eb753e4cd3a229ab953da8c6ec.png

稀疏与准确。读者可以使用该代码重现上面的图像(

1e387bab21d444418756abf449250a24.png

总结

许多研究人员认为修剪方法被忽略了,需要更多的关注和实践。本文介绍如何在小型数据集上使用非常简单的神经网络架构获得良好的结果。我认为深度学习在实践中解决的许多问题是相似的,所以这些问题也可以从修剪方法中受益。

参考

本文的相关代码:

修剪或不修剪:探索修剪模型压缩的功效,Michael H. Zhu,Suyog Gupta,2017(

在卷积神经网络中学习修剪滤波器,黄倩贵等。 al,2018(

修剪深度神经网络使其快速小巧(

以查看更多

只提供信息存储空间服务。

行列

模型

重量

模型

数据

阅读()