Coverage for / home / jenkins / .local / lib / python3.10 / site-packages / hyper_parallel / core / optimizer / adamw.py: 0%
51 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-07-06 05:41 +0800
« prev ^ index » next coverage.py v7.13.1, created at 2026-07-06 05:41 +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 device = torch.npu.current_device() if torch.npu.is_available() else torch.cuda.current_device()
42 step_tensor = torch.tensor(step, dtype=torch.int64, device=device)
43 state_steps = [step_tensor] * len(params)
45 torch._fused_adamw_( # pylint: disable=protected-access
46 params,
47 grads,
48 exp_avgs,
49 exp_avg_sqs,
50 max_exp_avg_sqs if amsgrad else [],
51 state_steps,
52 amsgrad=amsgrad,
53 lr=lr,
54 beta1=beta1,
55 beta2=beta2,
56 weight_decay=weight_decay,
57 eps=eps,
58 maximize=maximize
59 )
62class AdamW(torch.optim.Optimizer):
63 """AdamW optimizer implementation."""
65 def __init__(
66 self,
67 params,
68 lr=1e-3,
69 betas=(0.9, 0.999),
70 eps=1e-8,
71 weight_decay=0.01,
72 amsgrad=False,
73 maximize=False
74 ):
75 defaults = {
76 "lr": lr,
77 "betas": betas,
78 "eps": eps,
79 "weight_decay": weight_decay,
80 "amsgrad": amsgrad,
81 "maximize": maximize
82 }
83 super().__init__(params, defaults)
85 def __setstate__(self, state):
86 """Set optimizer state."""
87 super().__setstate__(state)
88 for group in self.param_groups:
89 group.setdefault('amsgrad', False)
90 group.setdefault('maximize', False)
92 def step(self, closure=None):
93 """Performs a single optimization step."""
94 loss = None
95 if closure is not None:
96 with torch.enable_grad():
97 loss = closure()
99 for group in self.param_groups:
100 params_with_grad = []
101 grads = []
102 exp_avgs = []
103 exp_avg_sqs = []
104 max_exp_avg_sqs = []
106 amsgrad = group['amsgrad']
107 beta1, beta2 = group['betas']
108 group['step'] = (group.get('step') or 0) + 1
110 current_rank_params = group['params']
111 for p in current_rank_params:
112 if p.grad is None:
113 continue
115 if p.grad.data.is_sparse:
116 raise RuntimeError('AdamW does not support sparse gradients')
118 state = self.state[p]
120 if len(state) == 0:
121 state['exp_avg'] = torch.zeros_like(p.grad, memory_format=torch.preserve_format)
122 state['exp_avg_sq'] = torch.zeros_like(p.grad, memory_format=torch.preserve_format)
123 if amsgrad:
124 state['max_exp_avg_sq'] = torch.zeros_like(p.grad, memory_format=torch.preserve_format)
126 params_with_grad.append(p)
127 grads.append(p.grad)
128 exp_avgs.append(state['exp_avg'])
129 exp_avg_sqs.append(state['exp_avg_sq'])
131 if amsgrad:
132 max_exp_avg_sqs.append(state['max_exp_avg_sq'])
134 if params_with_grad:
135 adamw(
136 params_with_grad,
137 grads,
138 exp_avgs,
139 exp_avg_sqs,
140 max_exp_avg_sqs,
141 group['step'],
142 amsgrad=amsgrad,
143 beta1=beta1,
144 beta2=beta2,
145 lr=group['lr'],
146 weight_decay=group['weight_decay'],
147 eps=group['eps'],
148 maximize=group['maximize']
149 )
151 return loss