Coverage for / home / jenkins / .local / lib / python3.10 / site-packages / hyper_parallel / core / optimizer / adamw.py: 87%
53 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-10-25 05:45 +0800
« prev ^ index » next coverage.py v7.13.1, created at 2026-10-25 05:45 +0800
1# Copyright 2026 Huawei Technologies Co., Ltd
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14# ============================================================================
15"""Adamw optimizer."""
17from typing import List
19import torch
22def adamw(
23 params: List[torch.Tensor],
24 grads: List[torch.Tensor],
25 exp_avgs: List[torch.Tensor],
26 exp_avg_sqs: List[torch.Tensor],
27 max_exp_avg_sqs: List[torch.Tensor],
28 step: int,
29 *,
30 amsgrad: bool,
31 beta1: float,
32 beta2: float,
33 lr: float,
34 weight_decay: float,
35 eps: float,
36 maximize: bool
37) -> None:
38 r"""Functional API that performs AdamW algorithm computation.
39 See :class:`~torch.optim.AdamW` for details.
40 """
41 step_tensor = torch.tensor(step, dtype=torch.int64, device=params[0].device)
42 state_steps = [step_tensor] * len(params)
44 torch._fused_adamw_( # pylint: disable=protected-access
45 params,
46 grads,
47 exp_avgs,
48 exp_avg_sqs,
49 max_exp_avg_sqs if amsgrad else [],
50 state_steps,
51 amsgrad=amsgrad,
52 lr=lr,
53 beta1=beta1,
54 beta2=beta2,
55 weight_decay=weight_decay,
56 eps=eps,
57 maximize=maximize
58 )
61class AdamW(torch.optim.Optimizer):
62 """AdamW optimizer implementation."""
64 def __init__(
65 self,
66 params,
67 lr=1e-3,
68 betas=(0.9, 0.999),
69 eps=1e-8,
70 weight_decay=0.01,
71 amsgrad=False,
72 maximize=False
73 ):
74 defaults = {
75 "lr": lr,
76 "betas": betas,
77 "eps": eps,
78 "weight_decay": weight_decay,
79 "amsgrad": amsgrad,
80 "maximize": maximize
81 }
82 super().__init__(params, defaults)
84 def __setstate__(self, state):
85 """Set optimizer state."""
86 super().__setstate__(state)
87 for group in self.param_groups:
88 group.setdefault('amsgrad', False)
89 group.setdefault('maximize', False)
91 def __str__(self):
92 return super().__repr__()
94 __repr__ = __str__
96 def step(self, closure=None):
97 """Performs a single optimization step."""
98 loss = None
99 if closure is not None:
100 with torch.enable_grad():
101 loss = closure()
103 for group in self.param_groups:
104 params_with_grad = []
105 grads = []
106 exp_avgs = []
107 exp_avg_sqs = []
108 max_exp_avg_sqs = []
110 amsgrad = group['amsgrad']
111 beta1, beta2 = group['betas']
112 group['step'] = (group.get('step') or 0) + 1
114 current_rank_params = group['params']
115 for p in current_rank_params:
116 if p.grad is None:
117 continue
119 if p.grad.data.is_sparse:
120 raise RuntimeError('AdamW does not support sparse gradients')
122 state = self.state[p]
124 if len(state) == 0:
125 state['exp_avg'] = torch.zeros_like(p.grad, memory_format=torch.preserve_format)
126 state['exp_avg_sq'] = torch.zeros_like(p.grad, memory_format=torch.preserve_format)
127 if amsgrad:
128 state['max_exp_avg_sq'] = torch.zeros_like(p.grad, memory_format=torch.preserve_format)
130 params_with_grad.append(p)
131 grads.append(p.grad)
132 exp_avgs.append(state['exp_avg'])
133 exp_avg_sqs.append(state['exp_avg_sq'])
135 if amsgrad:
136 max_exp_avg_sqs.append(state['max_exp_avg_sq'])
138 if params_with_grad:
139 adamw(
140 params_with_grad,
141 grads,
142 exp_avgs,
143 exp_avg_sqs,
144 max_exp_avg_sqs,
145 group['step'],
146 amsgrad=amsgrad,
147 beta1=beta1,
148 beta2=beta2,
149 lr=group['lr'],
150 weight_decay=group['weight_decay'],
151 eps=group['eps'],
152 maximize=group['maximize']
153 )
155 return loss