"git@developer.sourcefind.cn:OpenDAS/dgl.git" did not exist on "f1689ad0e12c2d6f4b00b7564b9b81dcc1301a39"
Unverified Commit 58b93a74 authored by zhangbin0917's avatar zhangbin0917 Committed by GitHub
Browse files

fix syncbn bug for pytorch 1.6 (#355)

parent ced288d6
...@@ -103,11 +103,13 @@ class syncbatchnorm_(Function): ...@@ -103,11 +103,13 @@ class syncbatchnorm_(Function):
# Output # Output
ctx.save_for_backward(x, _ex, _exs, gamma, beta) ctx.save_for_backward(x, _ex, _exs, gamma, beta)
return y
ctx.mark_non_differentiable(running_mean, running_var)
return y, running_mean, running_var
@staticmethod @staticmethod
@once_differentiable @once_differentiable
def backward(ctx, dz): def backward(ctx, dz, _drunning_mean, _drunning_var):
x, _ex, _exs, gamma, beta = ctx.saved_tensors x, _ex, _exs, gamma, beta = ctx.saved_tensors
dz = dz.contiguous() dz = dz.contiguous()
...@@ -243,11 +245,13 @@ class inp_syncbatchnorm_(Function): ...@@ -243,11 +245,13 @@ class inp_syncbatchnorm_(Function):
# Output # Output
ctx.save_for_backward(x, _ex, _exs, gamma, beta) ctx.save_for_backward(x, _ex, _exs, gamma, beta)
return x
ctx.mark_non_differentiable(running_mean, running_var)
return x, running_mean, running_var
@staticmethod @staticmethod
@once_differentiable @once_differentiable
def backward(ctx, dz): def backward(ctx, dz, _drunning_mean, _drunning_var):
z, _ex, _exs, gamma, beta = ctx.saved_tensors z, _ex, _exs, gamma, beta = ctx.saved_tensors
dz = dz.contiguous() dz = dz.contiguous()
......
...@@ -193,13 +193,15 @@ class SyncBatchNorm(_BatchNorm): ...@@ -193,13 +193,15 @@ class SyncBatchNorm(_BatchNorm):
"worker_queue": self.worker_queues[self.worker_ids.index(x.get_device())] "worker_queue": self.worker_queues[self.worker_ids.index(x.get_device())]
} }
if self.inplace: if self.inplace:
return inp_syncbatchnorm(x, self.weight, self.bias, self.running_mean, self.running_var, y, _, _ = inp_syncbatchnorm(x, self.weight, self.bias, self.running_mean, self.running_var,
extra, self.sync, self.training, self.momentum, self.eps, extra, self.sync, self.training, self.momentum, self.eps,
self.activation, self.slope).view(input_shape) self.activation, self.slope)
return y.view(input_shape)
else: else:
return syncbatchnorm(x, self.weight, self.bias, self.running_mean, self.running_var, y, _, _ = syncbatchnorm(x, self.weight, self.bias, self.running_mean, self.running_var,
extra, self.sync, self.training, self.momentum, self.eps, extra, self.sync, self.training, self.momentum, self.eps,
self.activation, self.slope).view(input_shape) self.activation, self.slope)
return y.view(input_shape)
def extra_repr(self): def extra_repr(self):
if self.activation == 'none': if self.activation == 'none':
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment