当缓存的内存足够时无法分配GPU内存

问题描述 投票:3回答:1

我正在使用Python3(CUDA 10.1和Intel MKL)(Pytorch 1.3)在AWS EC2深度学习AMI机器(Ubuntu 18.04.3 LTS(GNU / Linux 4.15.0-1054-aws x86_64v))上从头训练vgg16模型。 .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()释放缓存
  • 减少过滤器数量以减少内存占用量

机器规格:

enter image description here

amazon-ec2 deep-learning pytorch gpu-programming
1个回答
1
投票

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

self.model(input.cuda().float()).detach().requires_grad_(True)
© www.soinside.com 2019 - 2024. All rights reserved.