Amazon ec2 当缓存内存足够时,无法分配GPU内存
我正在AWS EC2深度学习AMI机器(Ubuntu 18.04.3 LTS(GNU/Linux 4.15.0-1054-AWS x86_64v))上用Python3(CUDA 10.1和Intel MKL)(Pytorch 1.3.1)从头开始训练vgg16模型,在更新模型参数时遇到以下错误 运行时错误:CUDA内存不足。尝试分配24.00 MiB(GPU 0;11.17 GiB总容量;已分配10.76 GiB;4.81 MiB空闲;119.92 MiB缓存) 更新参数的代码:Amazon ec2 当缓存内存足够时,无法分配GPU内存,amazon-ec2,deep-learning,pytorch,gpu,Amazon Ec2,Deep Learning,Pytorch,Gpu,我正在AWS EC2深度学习AMI机器(Ubuntu 18.04.3 LTS(GNU/Linux 4.15.0-1054-AWS x86_64v))上用Python3(CUDA 10.1和Intel MKL)(Pytorch 1.3.1)从头开始训练vgg16模型,在更新模型参数时遇到以下错误 运行时错误:CUDA内存不足。尝试分配24.00 MiB(GPU 0;11.17 GiB总容量;已分配10.76 GiB;4.81 MiB空闲;119.92 MiB缓存) 更新参数的代码: def _up
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_likhoods.append(output[:,target])
line在157次迭代后抛出错误
我有所需的内存,但它没有分配,我不明白为什么更新梯度会导致内存问题,因为梯度应该在每次迭代中被取消引用并自动释放。有什么想法吗
我尝试过以下解决方案,但没有成功
- 降低批量
- 使用torch.cuda.empty_cache()释放缓存
- 减少筛选器的数量以减少内存占用
我终于解决了内存问题!我意识到在每次迭代中,我将输入数据放在一个新的张量中,Pytork生成一个新的计算图。 这使得用过的RAM永远增长。然后我使用了.detach()函数,RAM总是保持在较低的级别
self.model(input.cuda().float()).detach().requires_grad_(True)