【问题标题】:torch in-place operations to save memory (softmax)火炬就地操作以节省内存(softmax)
【发布时间】:2019-05-12 22:04:34
【问题描述】:

torch 中的一些操作是就地执行的。例如像 += 这样的速记运算符。

是否可以就地执行其他操作,例如softmax

我目前正在处理语言处理。该模型在大量词汇表上产生一长串概率分布。这个最终输出张量负责大约 60% 的分配内存。这是一个很大的问题,因为我需要计算一个 softmax,这会使所需的内存翻倍。

这是一个问题的例子。我对张量 t 不感兴趣,只对它的 softmax 感兴趣:

import numpy as np
import torch
import torch.nn.functional as F

t = torch.tensor(np.zeros((30000,30000))).cuda()  #allocates 6.71 GB of GPU
softmax = F.softmax(t, 1)  #out of memory error
del t  #too late, program crashed

即使以下方法也不起作用:

F.softmax(torch.tensor(np.zeros((30000,30000))).cuda(), 1)

【问题讨论】:

  • 我不知道如何就地应用 softmax。但是在您的示例中,您可以将张量拆分(即分成 2 或 4 块),然后将 softmax 应用于这些张量。此外,当只有 2 或 4 个 "batches" 时,它不应该慢得多。作为替代方案:)
  • 这就是我正在做的 ;)(但如果能在一次干净的操作中完成它会非常好)

标签: python machine-learning pytorch torch


【解决方案1】:

我已经创建了一个原地版本的 softmax:

import numpy as np
import torch
import torch.nn.functional as F

# in-place version
t = torch.tensor(np.ones((100,200)))
torch.exp(t, out=t)
summed = torch.sum(t, dim=1, keepdim=True)
t /= summed

# original version
t2 = torch.tensor(np.ones((100,200)))
softmax = F.softmax(t2, 1)

assert torch.allclose(t, softmax)

回答我的问题:如果你想要就地函数,你必须通过将低级操作插入在一起来自己创建它们:

  • torch.exp 等许多函数都可以指定一个可选的out 参数。
  • 分配t[idx] = something 已就位
  • 简写运算符/=*=+=-= 已就位

这需要仔细调试并且可能不直观:

t = t / summed  #not in-place
t /= summed  #in-place

我了解到就地操作会产生渐变问题。我会用这段代码做更多的测试。

【讨论】:

    【解决方案2】:

    到目前为止,PyTorch 是不可能的。您可以尝试滚动自己的GPU kernel,但我看到前面有麻烦(如果不是一堵墙),这可能是这个操作一开始不可用的原因。

    Softmax 可以很容易地并行应用,但归一化需要减少。减少是非常重要的,它们可以是就地并行(请记住,原子的使用相当于并发但非并行操作)。这意味着您的就地操作要么无论如何都必须在后台分配,这违背了目的,要么运行速度非常慢。请认为我的回答有点投机,我不是 GPGPU 方面的专家,但我的观点是,要便宜、快速和正确地解决它至少是一个难题。

    话虽如此,如果你只关心 softmax,我觉得你在做推理。也许您的应用程序将 logits 移动到 CPU 并在那里运行 softmax 是一个可行的选择,而您的 GPU 已经处理了下一批?

    【讨论】:

    • 我不知道典型的 softmax 实现的内部结构。话虽如此,我不明白为什么我们必须分配两个数组:exp 可以就地完成,sum 不需要很多内存
    • 减少只需要每个总和一个条目。所以如果我们分配它,它比原始张量小很多数量级
    猜你喜欢
    • 2017-02-23
    • 2017-12-13
    • 1970-01-01
    • 2021-06-11
    • 2015-09-27
    • 2012-03-24
    • 2010-11-05
    • 2011-03-30
    • 2018-09-02
    相关资源
    最近更新 更多