Hi, there
When I use a Function
multiple time in an iteration, the CUDA memory continuously increases. It is worth noting the Function
calls save_for_backward()
. The problem disappears when replacing the Function
with one does not call save_for_backward()
. Any ideas?
Sample code as below:
import torch
from torch.autograd import Function
from torch.autograd import Variable
class Identity(Function):
def forward(self, input):
return input
def backward(self, grad_output):
return grad_output
class Linear(Function):
def forward(self, input, weight):
self.save_for_backward(input, weight)
return input.mm(weight.t())
def backward(self, grad_output):
input, weight = self.saved_tensors
grad_input = grad_weight = None
if self.needs_input_grad[0]:
grad_input = grad_output.mm(weight)
if self.needs_input_grad[1]:
grad_weight = grad_output.t().mm(input)
return grad_input, grad_weight
x = Variable(torch.rand(4000, 3000).cuda(), requires_grad=True)
w = Variable(torch.rand(3000, 3000).cuda(), requires_grad=True)
grad_output = torch.rand(4000, 3000).cuda()
lr = 0.01
for i in range(10000):
# (1) cuda memory stays the same
# identity = Identity()
# loss1 = identity(x)
# loss2 = identity(x)
# (2) cuda memory continuously increase
linear = Linear()
loss1 = linear(x, w)
loss2 = linear(x, w)
loss = loss1 + loss2
loss.backward(grad_output)
x.data = x.data - lr * x.grad.data
x.grad.data.zero_()
if i % 100 == 0:
print(i)