最新公告
  • 欢迎光临数据科学与编程,我们是数据学科学兴趣交流小组立即加入我们
  • PyTorch中的In-place操作是什么?为什么要避免使用这种操作?

    导读

    In-place操作用在推理的时候可以显著节省内存,但是训练的时候一定要小心使用。

    如今的高级深度神经网络拥有数百万个可训练参数,训练它们通常会导致GPU内存耗尽。有几种简单的方法可以减少模型占用的GPU内存,例如:

    • 考虑改变模型的架构或使用具有较少可训练参数的模型类型(例如,选择DenseNet-121而不是DenseNet-169)。这种方法会影响模型的性能度量。
    • 减少batch大小或手动设置数据加载workers的数量。在这种情况下,模型需要更长的时间来训练。

    在神经网络中使用in-place操作可能有助于避免上述方法的缺点,同时节省一些GPU内存。但是,由于几个原因,不建议使用in-place操作。

    在这篇文章中,内容包括:

    • 描述什么是in-place操作,并演示他们如何可能有助于节省GPU内存。
    • 告诉我们为什么要避免in-place操作或非常小心地使用它们。

    In-place 操作

    “In-place运算是一种直接改变给定线性函数、向量、矩阵(张量)内容而不复制的运算。”

    根据定义,in-place操作不会复制输入。这就是为什么它们可以帮助在操作高维数据时减少内存使用。

    我想演示in-place操作如何帮助消耗更少的GPU内存。为了做到这一点,我将度量out- place ReLU和in-place ReLU分配的内存,使用这个简单的函数:

    调用该函数来测量out- place ReLU分配的内存:

    得到结果如下:

    然后调用in-place ReLU:

    得到结果如下:

    看来使用in-place操作可以帮助我们节省一些GPU内存。然而,我们在使用现场操作时应该非常谨慎,并且要反复检查。在接下来的部分,我将告诉你为什么。

    In-place 操作的缺点

    in-place操作的主要缺点是,它们可能会覆盖计算梯度所需的值,这意味着破坏模型的训练过程。这是PyTorch autograd官方文档所说的:

    在autograd支持in-place操作是一件困难的事情,我们在大多数情况下不鼓励使用它们。Autograd的主动缓冲区释放和重用使其非常高效,在很少情况下,in-place操作实际上会显著降低内存使用量。除非你正在承受巨大的内存压力,否则你可能永远都不需要使用它们。

    限制in-place作业的适用性的主要原因有两个:

    1、in-place操作可能会覆盖计算梯度所需的值。

    2、每个in-place操作实际上都需要实现重写计算图。Out-of-place版本只是简单地分配新对象并保持对旧图的引用,而in-place操作则要求将所有输入的创建者更改为表示该操作的函数。

    要小心使用in-place操作的另一个原因是,它们的实现非常棘手。这就是为什么我建议使用PyTorch标准的in-place操作(如上面的就地ReLU),而不是手动实现。

    让我们看一个SiLU(或Swish-1)激活函数的例子。以下是SiLU的out-of-place实现:

    这个小示例演示了为什么我们在使用in-place操作时应该谨慎并检查两次。

    总结

    本文简介:

    • 说明了in-plac及其目的。演示了in-plac操作如何帮助消耗更少的GPU内存。
    • 描述了in-plac操作的显著缺点。人们应该非常小心地使用它们,并检查两次结果。
    英文原文:https://towardsdatascience.com/in-place-operations-in-pytorch-f91d493e970e
    本站上原创文章未经作者许可,不得用于商业用途,仅做学习交流使用,本站免责声明。转载请注明出处,否则保留追究法律责任的权利。《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
    数据科学与编程 » PyTorch中的In-place操作是什么?为什么要避免使用这种操作?

    发表评论

    • 52会员总数(位)
    • 321资源总数(个)
    • 20本周发布(个)
    • 2 今日发布(个)
    • 334稳定运行(天)

    提供最优质的博文资源集合

    立即阅览 了解详情