【问题标题】:Unable to allocate GPU memory, when there is enough of cached memory当有足够的缓存内存时,无法分配 GPU 内存
【发布时间】:2020-05-05 10:28:23
【问题描述】:

我正在使用 Python3(CUDA 10.1 和 Intel MKL)在 AWS EC2 深度学习 AMI 机器(Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-1054-aws x86_64v))上从头开始训练 vgg16 模型( Pytorch 1.3.1) 并在更新模型参数时遇到以下错误。

RuntimeError: CUDA 内存不足。尝试分配 24.00 MiB(GPU 0;11.17 GiB 总容量;10.76 GiB 已分配;4.81 MiB 空闲;119.92 MiB 缓存)

参数更新代码:

def _update_fisher_params(self, current_ds, batch_size, num_batch):
    dl = DataLoader(current_ds, batch_size, shuffle=True)
    log_liklihoods = []
    for i, (input, target) in enumerate(dl):
        if i > num_batch:
            break
        output = F.log_softmax(self.model(input.cuda().float()), dim=1)
        log_liklihoods.append(output[:, target])
    log_likelihood = torch.cat(log_liklihoods).mean()
    grad_log_liklihood = autograd.grad(log_likelihood, self.model.parameters())
    _buff_param_names = [param[0].replace('.', '__') for param in self.model.named_parameters()]
    for _buff_param_name, param in zip(_buff_param_names, grad_log_liklihood):
        self.model.register_buffer(_buff_param_name+'_estimated_fisher', param.data.clone() ** 2)

调试后:log_liklihoods.append(output[:, target]) 行在 157 次迭代后抛出错误

我有所需的内存,但它没有分配,我不明白为什么更新渐变会导致内存问题,因为渐变应该在每次迭代时被取消引用并自动释放。任何想法?

我尝试了以下解决方案,但没有运气。

  • 减小批量大小
  • 使用 torch.cuda.empty_cache() 释放缓存
  • 减少过滤器的数量以减少内存占用

机器规格:

【问题讨论】:

    标签: amazon-ec2 deep-learning pytorch gpu


    【解决方案1】:

    终于解决了内存问题!我意识到,在每次迭代中,我将输入数据放入一个新的张量中,pytorch 会生成一个新的计算图。 这会导致使用的 RAM 永远增长。然后我使用了 .detach() 函数,并且 RAM 总是保持在低电平。

    self.model(input.cuda().float()).detach().requires_grad_(True)
    

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 2016-06-19
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2021-03-31
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多