pytorch-optimizer 2.9.0__tar.gz → 2.9.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/PKG-INFO +4 -4
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/README.rst +2 -2
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pyproject.toml +2 -2
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/optimizer.py +19 -50
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/a2grad.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adai.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adamp.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adan.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/agc.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/apollo.py +2 -2
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/gc.py +1 -3
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lion.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lookahead.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/pcgrad.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/ranger.py +1 -1
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/ranger21.py +20 -34
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/shampoo.py +2 -2
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/utils.py +1 -3
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/LICENSE +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/__init__.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/types.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/__init__.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adabelief.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adafactor.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adashift.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/dadapt.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/gsam.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/rotograd.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/sgd.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/sgdp.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/yogi.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pytorch-optimizer
|
|
3
|
-
Version: 2.9.
|
|
4
|
-
Summary: optimizer & lr scheduler
|
|
3
|
+
Version: 2.9.1
|
|
4
|
+
Summary: optimizer & lr scheduler collections in PyTorch
|
|
5
5
|
Home-page: https://github.com/kozistr/pytorch_optimizer
|
|
6
6
|
License: Apache-2.0
|
|
7
7
|
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdaMod,AdaNorm,AdaPNM,AdaSmooth,Adai,AdamP,AdamS,Adan,AggMo,AliG,Apollo,AvaGrad,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DiffGrad,Fromage,Gravity,LARS,Lamb,Lion,MADGRAD,MSVAG,Nero,NovoGrad,PID,PNM,QHAdam,QHM,RAdam,Ranger,Ranger21,SGDP,SGDW,SM3,SRMM,SWATS,ScalableShampoo,Shampoo,Yogi,SAM,GSAM,PCGrad,RotoGrad
|
|
@@ -172,9 +172,9 @@ You can check the supported optimizers & lr schedulers.
|
|
|
172
172
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
173
173
|
| Adai | *Disentangling the Effects of Adaptive Learning Rate and Momentum* | `github <https://github.com/zeke-xie/adaptive-inertia-adai>`__ | `https://arxiv.org/abs/2006.15815 <https://arxiv.org/abs/2006.15815>`__ | `cite <https://github.com/zeke-xie/adaptive-inertia-adai#citing>`__ |
|
|
174
174
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
175
|
-
| SAM | *Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2010.01412 <https://arxiv.org/abs/2010.01412>`__
|
|
175
|
+
| SAM | *Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2010.01412 <https://arxiv.org/abs/2010.01412>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2020arXiv201001412F/exportcitation>`__ |
|
|
176
176
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
177
|
-
| ASAM | *Adaptive Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2102.11600 <https://arxiv.org/abs/2102.11600>`__
|
|
177
|
+
| ASAM | *Adaptive Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2102.11600 <https://arxiv.org/abs/2102.11600>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2021arXiv210211600K/exportcitation>`__ |
|
|
178
178
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
179
179
|
| GSAM | *Surrogate Gap Guided Sharpness-Aware Minimization* | `github <https://github.com/juntang-zhuang/GSAM>`__ | `https://openreview.net/pdf?id=edONMAnhLu- <https://openreview.net/pdf?id=edONMAnhLu->`__ | `cite <https://github.com/juntang-zhuang/GSAM#citation>`__ |
|
|
180
180
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
@@ -129,9 +129,9 @@ You can check the supported optimizers & lr schedulers.
|
|
|
129
129
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
130
130
|
| Adai | *Disentangling the Effects of Adaptive Learning Rate and Momentum* | `github <https://github.com/zeke-xie/adaptive-inertia-adai>`__ | `https://arxiv.org/abs/2006.15815 <https://arxiv.org/abs/2006.15815>`__ | `cite <https://github.com/zeke-xie/adaptive-inertia-adai#citing>`__ |
|
|
131
131
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
132
|
-
| SAM | *Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2010.01412 <https://arxiv.org/abs/2010.01412>`__
|
|
132
|
+
| SAM | *Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2010.01412 <https://arxiv.org/abs/2010.01412>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2020arXiv201001412F/exportcitation>`__ |
|
|
133
133
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
134
|
-
| ASAM | *Adaptive Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2102.11600 <https://arxiv.org/abs/2102.11600>`__
|
|
134
|
+
| ASAM | *Adaptive Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2102.11600 <https://arxiv.org/abs/2102.11600>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2021arXiv210211600K/exportcitation>`__ |
|
|
135
135
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
136
136
|
| GSAM | *Surrogate Gap Guided Sharpness-Aware Minimization* | `github <https://github.com/juntang-zhuang/GSAM>`__ | `https://openreview.net/pdf?id=edONMAnhLu- <https://openreview.net/pdf?id=edONMAnhLu->`__ | `cite <https://github.com/juntang-zhuang/GSAM#citation>`__ |
|
|
137
137
|
+--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "2.9.
|
|
4
|
-
description = "optimizer & lr scheduler
|
|
3
|
+
version = "2.9.1"
|
|
4
|
+
description = "optimizer & lr scheduler collections in PyTorch"
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
authors = ["kozistr <kozistr@gmail.com>"]
|
|
7
7
|
maintainers = ["kozistr <kozistr@gmail.com>"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import math
|
|
2
2
|
from abc import ABC, abstractmethod
|
|
3
|
-
from typing import Optional, Tuple, Union
|
|
3
|
+
from typing import List, Optional, Tuple, Union
|
|
4
4
|
|
|
5
5
|
import torch
|
|
6
6
|
|
|
@@ -90,31 +90,6 @@ class BaseOptimizer(ABC):
|
|
|
90
90
|
|
|
91
91
|
return grad * exp_grad_norm / grad_norm if exp_grad_norm > grad_norm else grad
|
|
92
92
|
|
|
93
|
-
@staticmethod
|
|
94
|
-
def validate_learning_rate(learning_rate: Optional[float]):
|
|
95
|
-
if learning_rate is not None and learning_rate < 0.0:
|
|
96
|
-
raise NegativeLRError(learning_rate)
|
|
97
|
-
|
|
98
|
-
@staticmethod
|
|
99
|
-
def validate_betas(betas: BETAS):
|
|
100
|
-
if not 0.0 <= betas[0] <= 1.0:
|
|
101
|
-
raise ValueError(f'[-] beta1 {betas[0]} must be in the range [0, 1]')
|
|
102
|
-
if not 0.0 <= betas[1] <= 1.0:
|
|
103
|
-
raise ValueError(f'[-] beta2 {betas[1]} must be in the range [0, 1]')
|
|
104
|
-
|
|
105
|
-
if len(betas) < 3:
|
|
106
|
-
return
|
|
107
|
-
|
|
108
|
-
if not 0.0 <= betas[2] <= 1.0:
|
|
109
|
-
raise ValueError(f'[-] beta3 {betas[2]} must be in the range [0, 1]')
|
|
110
|
-
|
|
111
|
-
@staticmethod
|
|
112
|
-
def validate_weight_decay_type(weight_decay_type: str):
|
|
113
|
-
if weight_decay_type not in ('l2', 'decoupled', 'stable'):
|
|
114
|
-
raise ValueError(
|
|
115
|
-
f'[-] weight_decay_type {weight_decay_type} must be one of (\'l2\', \'decoupled\', \'stable\')'
|
|
116
|
-
)
|
|
117
|
-
|
|
118
93
|
@staticmethod
|
|
119
94
|
def validate_range(x: float, name: str, low: float, high: float, range_type: str = '[)'):
|
|
120
95
|
if range_type == '[)' and not low <= x < high:
|
|
@@ -149,37 +124,31 @@ class BaseOptimizer(ABC):
|
|
|
149
124
|
raise NegativeStepError(step, step_type=step_type)
|
|
150
125
|
|
|
151
126
|
@staticmethod
|
|
152
|
-
def
|
|
153
|
-
if
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
)
|
|
127
|
+
def validate_options(x: str, name: str, options: List[str]):
|
|
128
|
+
if x not in options:
|
|
129
|
+
opts: str = ' or '.join([f'\'{option}\'' for option in options]).strip()
|
|
130
|
+
raise ValueError(f'[-] {name} {x} must be one of ({opts})')
|
|
157
131
|
|
|
158
132
|
@staticmethod
|
|
159
|
-
def
|
|
160
|
-
if
|
|
161
|
-
raise
|
|
133
|
+
def validate_learning_rate(learning_rate: Optional[float]):
|
|
134
|
+
if learning_rate is not None and learning_rate < 0.0:
|
|
135
|
+
raise NegativeLRError(learning_rate)
|
|
162
136
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
raise ValueError(f'[-] rebound {rebound} must be one of (\'constant\' or \'belief\')')
|
|
137
|
+
def validate_betas(self, betas: BETAS):
|
|
138
|
+
self.validate_range(betas[0], 'beta1', 0.0, 1.0, range_type='[]')
|
|
139
|
+
self.validate_range(betas[1], 'beta2', 0.0, 1.0, range_type='[]')
|
|
167
140
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if variant not in ('uni', 'inc', 'exp'):
|
|
171
|
-
raise ValueError(f'[-] A2Grad variant {variant} must be one of (\'uni\' or \'inc\' or \'exp\')')
|
|
141
|
+
if len(betas) < 3:
|
|
142
|
+
return
|
|
172
143
|
|
|
173
|
-
|
|
174
|
-
|
|
144
|
+
self.validate_range(betas[2], 'beta3', 0.0, 1.0, range_type='[]')
|
|
145
|
+
|
|
146
|
+
def validate_nus(self, nus: Union[float, Tuple[float, float]]):
|
|
175
147
|
if isinstance(nus, float):
|
|
176
|
-
|
|
177
|
-
raise ValueError(f'[-] nus {nus} must be in the range [0, 1]')
|
|
148
|
+
self.validate_range(nus, 'nu', 0.0, 1.0, range_type='[]')
|
|
178
149
|
else:
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
if not 0.0 <= nus[1] <= 1.0:
|
|
182
|
-
raise ValueError(f'[-] nus2 {nus[1]} must be in the range [0, 1]')
|
|
150
|
+
self.validate_range(nus[0], 'nu1', 0.0, 1.0, range_type='[]')
|
|
151
|
+
self.validate_range(nus[1], 'nu2', 0.0, 1.0, range_type='[]')
|
|
183
152
|
|
|
184
153
|
@abstractmethod
|
|
185
154
|
def reset(self):
|
|
@@ -32,7 +32,7 @@ class A2Grad(Optimizer, BaseOptimizer):
|
|
|
32
32
|
self.validate_learning_rate(lr)
|
|
33
33
|
self.validate_non_negative(lips, 'lips')
|
|
34
34
|
self.validate_non_negative(rho, 'rho')
|
|
35
|
-
self.
|
|
35
|
+
self.validate_options(variant, 'variant', ['uni', 'inc', 'exp'])
|
|
36
36
|
|
|
37
37
|
self.variant = variant
|
|
38
38
|
|
|
@@ -103,7 +103,7 @@ class Adai(Optimizer, BaseOptimizer):
|
|
|
103
103
|
state['step'] += 1
|
|
104
104
|
|
|
105
105
|
if self.use_gc:
|
|
106
|
-
|
|
106
|
+
centralize_gradient(grad, gc_conv_only=False)
|
|
107
107
|
|
|
108
108
|
bias_correction2: float = 1.0 - beta2 ** state['step']
|
|
109
109
|
|
|
@@ -122,7 +122,7 @@ class AdamP(Optimizer, BaseOptimizer):
|
|
|
122
122
|
state['exp_grad_norm'] = torch.zeros((1,), dtype=grad.dtype, device=grad.device)
|
|
123
123
|
|
|
124
124
|
if self.use_gc:
|
|
125
|
-
|
|
125
|
+
centralize_gradient(grad, gc_conv_only=False)
|
|
126
126
|
|
|
127
127
|
s_grad = self.get_adanorm_gradient(
|
|
128
128
|
grad=grad,
|
|
@@ -130,7 +130,7 @@ class Adan(Optimizer, BaseOptimizer):
|
|
|
130
130
|
grad.mul_(clip_global_grad_norm)
|
|
131
131
|
|
|
132
132
|
if self.use_gc:
|
|
133
|
-
|
|
133
|
+
centralize_gradient(grad, gc_conv_only=False)
|
|
134
134
|
|
|
135
135
|
grad_diff = state['previous_grad']
|
|
136
136
|
grad_diff.add_(grad)
|
|
@@ -6,7 +6,7 @@ from pytorch_optimizer.optimizer.utils import unit_norm
|
|
|
6
6
|
def agc(p: torch.Tensor, grad: torch.Tensor, agc_eps: float, agc_clip_val: float, eps: float = 1e-6) -> torch.Tensor:
|
|
7
7
|
r"""Clip gradient values in excess of the unit wise norm.
|
|
8
8
|
|
|
9
|
-
:param p:
|
|
9
|
+
:param p: torch.Tensor. parameter.
|
|
10
10
|
:param grad: torch.Tensor, gradient.
|
|
11
11
|
:param agc_eps: float. agc epsilon to clip the norm of parameter.
|
|
12
12
|
:param agc_clip_val: float. norm clip.
|
|
@@ -37,9 +37,9 @@ class Apollo(Optimizer, BaseOptimizer):
|
|
|
37
37
|
):
|
|
38
38
|
self.validate_learning_rate(lr)
|
|
39
39
|
self.validate_range(beta, 'beta', 0.0, 1.0, range_type='[]')
|
|
40
|
-
self.
|
|
40
|
+
self.validate_options(rebound, 'rebound', ['constant', 'belief'])
|
|
41
41
|
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
42
|
-
self.
|
|
42
|
+
self.validate_options(weight_decay_type, 'weight_decay_type', ['l2', 'decoupled', 'stable'])
|
|
43
43
|
self.validate_non_negative(eps, 'eps')
|
|
44
44
|
|
|
45
45
|
self.lr = lr
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import torch
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def centralize_gradient(x: torch.Tensor, gc_conv_only: bool = False)
|
|
4
|
+
def centralize_gradient(x: torch.Tensor, gc_conv_only: bool = False):
|
|
5
5
|
r"""Gradient Centralization (GC).
|
|
6
6
|
|
|
7
7
|
:param x: torch.Tensor. gradient.
|
|
8
8
|
:param gc_conv_only: bool. 'False' for both conv & fc layers.
|
|
9
|
-
:return: torch.Tensor. centralized gradient.
|
|
10
9
|
"""
|
|
11
10
|
size: int = x.dim()
|
|
12
11
|
if (gc_conv_only and size > 3) or (not gc_conv_only and size > 1):
|
|
13
12
|
x.add_(-x.mean(dim=tuple(range(1, size)), keepdim=True))
|
|
14
|
-
return x
|
|
@@ -90,7 +90,7 @@ class Lion(Optimizer, BaseOptimizer):
|
|
|
90
90
|
state['exp_grad_norm'] = torch.zeros((1,), dtype=grad.dtype, device=grad.device)
|
|
91
91
|
|
|
92
92
|
if self.use_gc:
|
|
93
|
-
|
|
93
|
+
centralize_gradient(grad, gc_conv_only=False)
|
|
94
94
|
|
|
95
95
|
self.apply_weight_decay(
|
|
96
96
|
p=p,
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lookahead.py
RENAMED
|
@@ -25,7 +25,7 @@ class Lookahead(BaseOptimizer):
|
|
|
25
25
|
):
|
|
26
26
|
self.validate_positive(k, 'k')
|
|
27
27
|
self.validate_range(alpha, 'alpha', 0.0, 1.0)
|
|
28
|
-
self.
|
|
28
|
+
self.validate_options(pullback_momentum, 'pullback_momentum', ['none', 'reset', 'pullback'])
|
|
29
29
|
|
|
30
30
|
self.alpha = alpha
|
|
31
31
|
self.k = k
|
|
@@ -18,7 +18,7 @@ class PCGrad(BaseOptimizer):
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
def __init__(self, optimizer: OPTIMIZER, reduction: str = 'mean'):
|
|
21
|
-
self.
|
|
21
|
+
self.validate_options(reduction, 'reduction', ['mean', 'sum'])
|
|
22
22
|
|
|
23
23
|
self.optimizer = optimizer
|
|
24
24
|
self.reduction = reduction
|
|
@@ -140,7 +140,7 @@ class Ranger(Optimizer, BaseOptimizer):
|
|
|
140
140
|
state['exp_grad_norm'] = torch.zeros((1,), dtype=grad.dtype, device=grad.device)
|
|
141
141
|
|
|
142
142
|
if self.use_gc and grad.dim() > self.gc_gradient_threshold:
|
|
143
|
-
|
|
143
|
+
centralize_gradient(grad, gc_conv_only=False)
|
|
144
144
|
|
|
145
145
|
self.apply_weight_decay(
|
|
146
146
|
p=p,
|
|
@@ -96,12 +96,9 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
96
96
|
self.lookahead_blending_alpha = lookahead_blending_alpha
|
|
97
97
|
self.norm_loss_factor = norm_loss_factor
|
|
98
98
|
|
|
99
|
-
# lookahead
|
|
100
99
|
self.lookahead_step: int = 0
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
self.starting_lr = lr
|
|
104
|
-
self.current_lr = lr
|
|
100
|
+
self.starting_lr: float = lr
|
|
101
|
+
self.current_lr: float = lr
|
|
105
102
|
|
|
106
103
|
defaults: DEFAULTS = {
|
|
107
104
|
'lr': lr,
|
|
@@ -114,7 +111,6 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
114
111
|
}
|
|
115
112
|
super().__init__(params, defaults)
|
|
116
113
|
|
|
117
|
-
# warmup iterations
|
|
118
114
|
self.num_warm_up_iterations: int = (
|
|
119
115
|
self.build_warm_up_iterations(num_iterations, betas[1])
|
|
120
116
|
if num_warm_up_iterations is None
|
|
@@ -140,8 +136,7 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
140
136
|
|
|
141
137
|
state['grad_ma'] = torch.zeros_like(p)
|
|
142
138
|
state['variance_ma'] = torch.zeros_like(p)
|
|
143
|
-
state['lookahead_params'] =
|
|
144
|
-
state['lookahead_params'].copy_(p)
|
|
139
|
+
state['lookahead_params'] = p.clone()
|
|
145
140
|
state['neg_grad_ma'] = torch.zeros_like(p)
|
|
146
141
|
state['max_variance_ma'] = torch.zeros_like(p)
|
|
147
142
|
|
|
@@ -162,28 +157,21 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
162
157
|
|
|
163
158
|
warm_up_current_pct: float = min(1.0, (step / self.num_warm_up_iterations))
|
|
164
159
|
|
|
165
|
-
|
|
166
|
-
self.current_lr = new_lr
|
|
160
|
+
self.current_lr = lr * warm_up_current_pct
|
|
167
161
|
|
|
168
|
-
return
|
|
162
|
+
return self.current_lr
|
|
169
163
|
|
|
170
164
|
def warm_down(self, lr: float, iteration: int) -> float:
|
|
171
165
|
if iteration < self.start_warm_down:
|
|
172
166
|
return lr
|
|
173
167
|
|
|
174
168
|
# start iteration from 1, not 0
|
|
175
|
-
warm_down_iteration: int = (iteration + 1) - self.start_warm_down
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
warm_down_pct: float = warm_down_iteration / (self.num_warm_down_iterations + 1)
|
|
179
|
-
warm_down_pct = min(warm_down_pct, 1.0)
|
|
180
|
-
|
|
181
|
-
new_lr: float = self.starting_lr - self.warm_down_lr_delta * warm_down_pct
|
|
182
|
-
new_lr = max(new_lr, self.min_lr)
|
|
169
|
+
warm_down_iteration: int = max((iteration + 1) - self.start_warm_down, 1)
|
|
170
|
+
warm_down_pct: float = min(warm_down_iteration / (self.num_warm_down_iterations + 1), 1.0)
|
|
183
171
|
|
|
184
|
-
self.current_lr =
|
|
172
|
+
self.current_lr = max(self.starting_lr - self.warm_down_lr_delta * warm_down_pct, self.min_lr)
|
|
185
173
|
|
|
186
|
-
return
|
|
174
|
+
return self.current_lr
|
|
187
175
|
|
|
188
176
|
@torch.no_grad()
|
|
189
177
|
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
@@ -220,8 +208,7 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
220
208
|
if len(state) == 0:
|
|
221
209
|
state['grad_ma'] = torch.zeros_like(p)
|
|
222
210
|
state['variance_ma'] = torch.zeros_like(p)
|
|
223
|
-
state['lookahead_params'] =
|
|
224
|
-
state['lookahead_params'].copy_(p)
|
|
211
|
+
state['lookahead_params'] = p.clone()
|
|
225
212
|
state['neg_grad_ma'] = torch.zeros_like(p)
|
|
226
213
|
state['max_variance_ma'] = torch.zeros_like(p)
|
|
227
214
|
|
|
@@ -229,8 +216,8 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
229
216
|
grad.copy_(agc(p, grad, self.agc_eps, self.agc_clipping_value))
|
|
230
217
|
|
|
231
218
|
# Apply gradient centralization & normalization
|
|
232
|
-
|
|
233
|
-
|
|
219
|
+
centralize_gradient(grad, gc_conv_only=False)
|
|
220
|
+
normalize_gradient(grad)
|
|
234
221
|
|
|
235
222
|
# second moment estimation
|
|
236
223
|
# using positive-negative momentum and bias correction
|
|
@@ -245,7 +232,6 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
245
232
|
|
|
246
233
|
# Phase 2 - Apply weight decay and step
|
|
247
234
|
for group in self.param_groups:
|
|
248
|
-
lr: float = group['lr']
|
|
249
235
|
beta1, beta2 = group['betas']
|
|
250
236
|
|
|
251
237
|
bias_correction1: float = 1.0 - beta1 ** group['step'] # fmt: skip
|
|
@@ -254,7 +240,7 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
254
240
|
noise_norm: float = math.sqrt((1.0 + beta2) ** 2 + beta2 ** 2) # fmt: skip
|
|
255
241
|
|
|
256
242
|
# warm up & down
|
|
257
|
-
lr = self.warm_up_dampening(lr, group['step'])
|
|
243
|
+
lr: float = self.warm_up_dampening(group['lr'], group['step'])
|
|
258
244
|
lr = self.warm_down(lr, group['step'])
|
|
259
245
|
|
|
260
246
|
for p in group['params']:
|
|
@@ -265,7 +251,7 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
265
251
|
self.apply_weight_decay(
|
|
266
252
|
p=p,
|
|
267
253
|
grad=None,
|
|
268
|
-
lr=
|
|
254
|
+
lr=lr,
|
|
269
255
|
weight_decay=group['weight_decay'],
|
|
270
256
|
weight_decouple=group['weight_decouple'],
|
|
271
257
|
fixed_decay=group['fixed_decay'],
|
|
@@ -287,16 +273,16 @@ class Ranger21(Optimizer, BaseOptimizer):
|
|
|
287
273
|
|
|
288
274
|
de_nom = (variance_ma.sqrt() / bias_correction2_sq).add_(group['eps'])
|
|
289
275
|
|
|
276
|
+
if self.use_softplus:
|
|
277
|
+
de_nom = f.softplus(de_nom, beta=self.beta_softplus)
|
|
278
|
+
|
|
290
279
|
grad = p.grad
|
|
291
|
-
|
|
292
|
-
|
|
280
|
+
centralize_gradient(grad, gc_conv_only=False)
|
|
281
|
+
normalize_gradient(grad)
|
|
293
282
|
|
|
294
283
|
grad_ma.mul_(beta1 ** 2).add_(grad, alpha=1.0 - beta1 ** 2) # fmt: skip
|
|
295
284
|
|
|
296
|
-
step_size: float =
|
|
297
|
-
|
|
298
|
-
if self.use_softplus:
|
|
299
|
-
de_nom = f.softplus(de_nom, beta=self.beta_softplus)
|
|
285
|
+
step_size: float = self.apply_adam_debias(group['adam_debias'], lr, bias_correction1)
|
|
300
286
|
|
|
301
287
|
pn_momentum = grad_ma.mul(1.0 + 1.0).add(neg_grad_ma, alpha=-1.0).mul(1.0 / noise_norm)
|
|
302
288
|
p.addcdiv_(pn_momentum, de_nom, value=-step_size)
|
|
@@ -45,7 +45,6 @@ class Shampoo(Optimizer, BaseOptimizer):
|
|
|
45
45
|
self.validate_non_negative(matrix_eps, 'matrix_eps')
|
|
46
46
|
|
|
47
47
|
self.preconditioning_compute_steps = preconditioning_compute_steps
|
|
48
|
-
self.matrix_eps = matrix_eps
|
|
49
48
|
|
|
50
49
|
defaults: DEFAULTS = {
|
|
51
50
|
'lr': lr,
|
|
@@ -53,6 +52,7 @@ class Shampoo(Optimizer, BaseOptimizer):
|
|
|
53
52
|
'weight_decay': weight_decay,
|
|
54
53
|
'weight_decouple': weight_decouple,
|
|
55
54
|
'fixed_decay': fixed_decay,
|
|
55
|
+
'matrix_eps': matrix_eps,
|
|
56
56
|
}
|
|
57
57
|
super().__init__(params, defaults)
|
|
58
58
|
|
|
@@ -93,7 +93,7 @@ class Shampoo(Optimizer, BaseOptimizer):
|
|
|
93
93
|
state['momentum_buffer'] = grad.clone()
|
|
94
94
|
|
|
95
95
|
for dim_id, dim in enumerate(grad.size()):
|
|
96
|
-
state[f'pre_cond_{dim_id}'] =
|
|
96
|
+
state[f'pre_cond_{dim_id}'] = group['matrix_eps'] * torch.eye(dim, out=grad.new(dim, dim))
|
|
97
97
|
state[f'inv_pre_cond_{dim_id}'] = grad.new(dim, dim).zero_()
|
|
98
98
|
|
|
99
99
|
if momentum > 0.0:
|
|
@@ -27,13 +27,12 @@ def to_real(x: torch.Tensor) -> torch.Tensor:
|
|
|
27
27
|
return x.real if torch.is_complex(x) else x
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
def normalize_gradient(x: torch.Tensor, use_channels: bool = False, epsilon: float = 1e-8)
|
|
30
|
+
def normalize_gradient(x: torch.Tensor, use_channels: bool = False, epsilon: float = 1e-8):
|
|
31
31
|
r"""Normalize gradient with stddev.
|
|
32
32
|
|
|
33
33
|
:param x: torch.Tensor. gradient.
|
|
34
34
|
:param use_channels: bool. channel-wise normalization.
|
|
35
35
|
:param epsilon: float. eps.
|
|
36
|
-
:return: torch.Tensor. normalized gradient.
|
|
37
36
|
"""
|
|
38
37
|
size: int = x.dim()
|
|
39
38
|
if size > 1 and use_channels:
|
|
@@ -42,7 +41,6 @@ def normalize_gradient(x: torch.Tensor, use_channels: bool = False, epsilon: flo
|
|
|
42
41
|
elif torch.numel(x) > 2:
|
|
43
42
|
s = x.std().add_(epsilon)
|
|
44
43
|
x.div_(s)
|
|
45
|
-
return x
|
|
46
44
|
|
|
47
45
|
|
|
48
46
|
def flatten_grad(grads: List[torch.Tensor]) -> torch.Tensor:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/__init__.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/chebyshev.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/proportion.py
RENAMED
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adabelief.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adafactor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adasmooth.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/shampoo_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|