diff --git a/bmtrain/optim/adam.py b/bmtrain/optim/adam.py index 03830fdd..06ee195e 100644 --- a/bmtrain/optim/adam.py +++ b/bmtrain/optim/adam.py @@ -107,11 +107,16 @@ def step(self, closure=None): # update the steps for each param group update state['step'] += 1 + if ('maximize' in group) and (group['maximize'] is True): + grad = -p.grad + else: + grad = p.grad + if p.dtype == torch.half: C.f_adam( state["_param_fp32"], # fp32 p, # fp16 - p.grad, # fp16 + grad, # fp16 state['exp_avg'], # fp16: m state["exp_avg_sq"], # fp32: v group['betas'][0], group['betas'][1], @@ -127,7 +132,7 @@ def step(self, closure=None): other_kwargs['maximize'] = False F.adam( [p], - [p.grad / self._scale], + [grad / self._scale], [state['exp_avg']], [state["exp_avg_sq"]], [], diff --git a/bmtrain/optim/adam_offload.py b/bmtrain/optim/adam_offload.py index 9d19c042..4f106b07 100644 --- a/bmtrain/optim/adam_offload.py +++ b/bmtrain/optim/adam_offload.py @@ -129,10 +129,14 @@ def step(self, closure=None): # update parameters if param.dtype == torch.half: + if ('maximize' in group) and (group['maximize'] is True): + grad = -state["_grad_fp16"] + else: + grad = state["_grad_fp16"] C.f_adam_cpu( state["_param_fp32"].view(-1), state["_param_fp16"].view(-1), - state["_grad_fp16"].view(-1), + grad.view(-1), state["exp_avg"].view(-1), state["exp_avg_sq"].view(-1), beta1, beta2, @@ -145,13 +149,16 @@ def step(self, closure=None): param.copy_(state["_param_fp16"], non_blocking=True) else: state["_grad_fp32"].mul_(1.0 / self._scale) - + if ('maximize' in group) and (group['maximize'] is True): + grad = -state["_grad_fp32"] + else: + grad = state["_grad_fp32"] other_kwargs = {} if 'maximize' in inspect.signature(F.adam).parameters: other_kwargs['maximize'] = False F.adam( [state["_param_fp32"]], - [state["_grad_fp32"]], + [grad], [state["exp_avg"]], [state["exp_avg_sq"]], [],