这两天一直迷惑pytorch中关于requires_grad
的设置,特别是在写cuda extension时。今天在pytorch github上看到个issue解释的很不错,姑且记录在这以备后用。
我的问题是在写cuda扩展时,我会在python autograd.Function
的forward
部分先声明好变量,就是先分配好内存,然后传入cuda的函数,cuda内做自定义操作,类似:
class myfunc(torch.autograd.Function):
@staticmethod
def forward(ctx, x):
out = torch.zeros_like(x)
cuda_foward(x, out)
ctx.save_for_backward(x)
return out
@staticmethod
def backward(ctx, d_out):
x, = ctx.saved_tensors
d_x = torch.zeros_like(x)
cuda_backward(d_x, x, d_out)
return d_x
OK, 那问题是forward内部声明的out
要不要设定requires_grad
的呢?
详见该issue:https://github.com/pytorch/pytorch/issues/17849
- 当声明 `out = torch.zeros_like(x)` 时,尽管x是
requires_grad
的,但out
不是 - 通过
autograd.Function
的返回值,看来是会被设为requires_grad
的,除非在forward
内设定ctx.mark_non_differentiable(out)
OK, 主要是关于pytorch的autograd机制目前还没时间细致了解,所以先把这些实用内容留在这儿,以备后需。