pytorch-optimizer 3.5.0__tar.gz → 3.5.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-3.5.0 → pytorch_optimizer-3.5.1}/PKG-INFO +2 -2
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/README.md +1 -1
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pyproject.toml +1 -1
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/__init__.py +1 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/__init__.py +2 -1
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/muon.py +15 -6
- pytorch_optimizer-3.5.1/pytorch_optimizer/optimizer/scion.py +530 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/spam.py +5 -4
- pytorch_optimizer-3.5.0/pytorch_optimizer/optimizer/scion.py +0 -129
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/LICENSE +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/optimizer.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/type.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/bi_tempered.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/cross_entropy.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/dice.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/f1.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/focal.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/jaccard.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/ldam.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/lovasz.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/tversky.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/a2grad.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adabelief.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adafactor.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adagc.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adahessian.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adai.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adalite.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamg.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamp.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamw.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adan.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adashift.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/ademamix.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adopt.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/aida.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/amos.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/apollo.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/came.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/dadapt.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/demo.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/exadam.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/experimental/ranger25.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/fadam.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/focus.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/ftrl.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/galore.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/galore_utils.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/gradient_centralization.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/grams.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/grokfast.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/kate.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/laprop.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lion.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lomo.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lookahead.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/mars.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/orthograd.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/padam.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/prodigy.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/psgd.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/psgd_utils.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/ranger.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/ranger21.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/rotograd.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sgd.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sgdp.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/shampoo.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/soap.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sophia.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/tam.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/tiger.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/trac.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/utils.py +0 -0
- {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/yogi.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pytorch_optimizer
|
|
3
|
-
Version: 3.5.
|
|
3
|
+
Version: 3.5.1
|
|
4
4
|
Summary: optimizer & lr scheduler & objective function collections in PyTorch
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaGC,AdaMax,AdamG,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdEMAMix,Simplified-AdEMAMix,ADOPT,AdaHessian,Adai,Adalite,AdaLomo,AdamMini,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,APOLLO,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DeMo,DiffGrad,EXAdam,FAdam,FOCUS,Fromage,FTRL,GaLore,Grams,Gravity,GrokFast,GSAM,Kate,Lamb,LaProp,LARS,Lion,LOMO,Lookahead,MADGRAD,MARS,MSVAG,Muno,Nero,NovoGrad,OrthoGrad,PAdam,PCGrad,PID,PNM,Prodigy,PSGD,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,GCSAM,LookSAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SCION,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SOAP,SopihaH,SPAM,StableSPAM,SRMM,StableAdamW,SWATS,TAM,Tiger,TRAC,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes,WSD,QGaLore
|
|
@@ -244,7 +244,7 @@ get_supported_optimizers(['adam*', 'ranger*'])
|
|
|
244
244
|
| EXAdam | *The Power of Adaptive Cross-Moments* | [github](https://github.com/AhmedMostafa16/EXAdam) | <https://arxiv.org/abs/2412.20302> | [cite](https://github.com/AhmedMostafa16/EXAdam?tab=readme-ov-file#citation) |
|
|
245
245
|
| GCSAM | *Gradient Centralized Sharpness Aware Minimization* | [github](https://github.com/mhassann22/GCSAM) | <https://arxiv.org/abs/2501.11584> | [cite](https://github.com/mhassann22/GCSAM?tab=readme-ov-file#citation) |
|
|
246
246
|
| LookSAM | *Towards Efficient and Scalable Sharpness-Aware Minimization* | [github](https://github.com/rollovd/LookSAM) | <https://arxiv.org/abs/2203.02714> | [cite](https://ui.adsabs.harvard.edu/abs/2022arXiv220302714L/exportcitation) |
|
|
247
|
-
| SCION | *Training Deep Learning Models with Norm-Constrained LMOs* |
|
|
247
|
+
| SCION | *Training Deep Learning Models with Norm-Constrained LMOs* | [github](https://github.com/LIONS-EPFL/scion) | <https://arxiv.org/abs/2502.07529> | [cite](https://github.com/LIONS-EPFL/scion?tab=readme-ov-file#citation) |
|
|
248
248
|
| COSMOS | *SOAP with Muon* | [github](https://github.com/lliu606/COSMOS) | | |
|
|
249
249
|
| StableSPAM | *How to Train in 4-Bit More Stably than 16-Bit Adam* | [github](https://github.com/TianjinYellow/StableSPAM) | <https://arxiv.org/abs/2502.17055> | |
|
|
250
250
|
| AdaGC | *Improving Training Stability for Large Language Model Pretraining* | | <https://arxiv.org/abs/2502.11034> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250211034W/exportcitation) |
|
|
@@ -206,7 +206,7 @@ get_supported_optimizers(['adam*', 'ranger*'])
|
|
|
206
206
|
| EXAdam | *The Power of Adaptive Cross-Moments* | [github](https://github.com/AhmedMostafa16/EXAdam) | <https://arxiv.org/abs/2412.20302> | [cite](https://github.com/AhmedMostafa16/EXAdam?tab=readme-ov-file#citation) |
|
|
207
207
|
| GCSAM | *Gradient Centralized Sharpness Aware Minimization* | [github](https://github.com/mhassann22/GCSAM) | <https://arxiv.org/abs/2501.11584> | [cite](https://github.com/mhassann22/GCSAM?tab=readme-ov-file#citation) |
|
|
208
208
|
| LookSAM | *Towards Efficient and Scalable Sharpness-Aware Minimization* | [github](https://github.com/rollovd/LookSAM) | <https://arxiv.org/abs/2203.02714> | [cite](https://ui.adsabs.harvard.edu/abs/2022arXiv220302714L/exportcitation) |
|
|
209
|
-
| SCION | *Training Deep Learning Models with Norm-Constrained LMOs* |
|
|
209
|
+
| SCION | *Training Deep Learning Models with Norm-Constrained LMOs* | [github](https://github.com/LIONS-EPFL/scion) | <https://arxiv.org/abs/2502.07529> | [cite](https://github.com/LIONS-EPFL/scion?tab=readme-ov-file#citation) |
|
|
210
210
|
| COSMOS | *SOAP with Muon* | [github](https://github.com/lliu606/COSMOS) | | |
|
|
211
211
|
| StableSPAM | *How to Train in 4-Bit More Stably than 16-Bit Adam* | [github](https://github.com/TianjinYellow/StableSPAM) | <https://arxiv.org/abs/2502.17055> | |
|
|
212
212
|
| AdaGC | *Improving Training Stability for Large Language Model Pretraining* | | <https://arxiv.org/abs/2502.11034> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250211034W/exportcitation) |
|
|
@@ -87,7 +87,7 @@ from pytorch_optimizer.optimizer.schedulefree import (
|
|
|
87
87
|
ScheduleFreeSGD,
|
|
88
88
|
ScheduleFreeWrapper,
|
|
89
89
|
)
|
|
90
|
-
from pytorch_optimizer.optimizer.scion import SCION
|
|
90
|
+
from pytorch_optimizer.optimizer.scion import SCION, SCIONLight
|
|
91
91
|
from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD, SGDSaI, SignSGD
|
|
92
92
|
from pytorch_optimizer.optimizer.sgdp import SGDP
|
|
93
93
|
from pytorch_optimizer.optimizer.shampoo import ScalableShampoo, Shampoo
|
|
@@ -309,6 +309,7 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
309
309
|
Kron,
|
|
310
310
|
EXAdam,
|
|
311
311
|
SCION,
|
|
312
|
+
SCIONLight,
|
|
312
313
|
StableSPAM,
|
|
313
314
|
AdaGC,
|
|
314
315
|
Ranger25,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import math
|
|
2
2
|
import os
|
|
3
|
-
from typing import List, Optional
|
|
3
|
+
from typing import List, Optional, Tuple
|
|
4
4
|
|
|
5
5
|
import torch
|
|
6
6
|
from torch.distributed import ReduceOp, all_reduce
|
|
@@ -131,9 +131,18 @@ class Muon(BaseOptimizer):
|
|
|
131
131
|
state['moment2'] = torch.zeros_like(p)
|
|
132
132
|
|
|
133
133
|
@staticmethod
|
|
134
|
-
def
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
def get_adjusted_lr(lr: float, param_shape: Tuple[float, ...], use_adjusted_lr: bool = False) -> float:
|
|
135
|
+
r"""Get the adjust learning rate."""
|
|
136
|
+
output_shape, *input_shape = param_shape
|
|
137
|
+
input_shape = math.prod(input_shape)
|
|
138
|
+
|
|
139
|
+
ratio: float = (
|
|
140
|
+
math.pow(max(1.0, output_shape / input_shape), 0.5)
|
|
141
|
+
if use_adjusted_lr
|
|
142
|
+
else 0.2 * math.sqrt(max(output_shape, input_shape))
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return lr * ratio
|
|
137
146
|
|
|
138
147
|
@torch.no_grad()
|
|
139
148
|
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
@@ -202,9 +211,9 @@ class Muon(BaseOptimizer):
|
|
|
202
211
|
fixed_decay=False,
|
|
203
212
|
)
|
|
204
213
|
|
|
205
|
-
lr: float = self.
|
|
214
|
+
lr: float = self.get_adjusted_lr(group['lr'], p.size(), group['use_adjusted_lr'])
|
|
206
215
|
|
|
207
|
-
p.add_(g, alpha=-lr
|
|
216
|
+
p.add_(g, alpha=-lr)
|
|
208
217
|
curr_idx += p.numel()
|
|
209
218
|
|
|
210
219
|
params = [p for p in group['params'] if p.grad is not None and not self.state[p]['use_muon']]
|
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from enum import IntEnum
|
|
3
|
+
from typing import Dict, Optional
|
|
4
|
+
|
|
5
|
+
import torch
|
|
6
|
+
|
|
7
|
+
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
8
|
+
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
9
|
+
from pytorch_optimizer.base.type import CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
10
|
+
from pytorch_optimizer.optimizer.shampoo_utils import zero_power_via_newton_schulz_5
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class LMONorm(IntEnum):
|
|
14
|
+
r"""normalization types."""
|
|
15
|
+
|
|
16
|
+
NONE = 0
|
|
17
|
+
AUTO = 1
|
|
18
|
+
SPECTRAL = 2
|
|
19
|
+
SPECTRALCONV = 3
|
|
20
|
+
SIGN = 4
|
|
21
|
+
BIAS = 5
|
|
22
|
+
COL = 6
|
|
23
|
+
ROW = 7
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Norm:
|
|
27
|
+
r"""Base class to perform norm onto Scion. This class does no norm."""
|
|
28
|
+
|
|
29
|
+
def init(self, x: torch.Tensor) -> torch.Tensor:
|
|
30
|
+
r"""Initialize parameter."""
|
|
31
|
+
return x
|
|
32
|
+
|
|
33
|
+
def lmo(self, grad: torch.Tensor) -> torch.Tensor:
|
|
34
|
+
r"""Get LMO."""
|
|
35
|
+
return grad
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Col(Norm):
|
|
39
|
+
r"""col-wise normalization.
|
|
40
|
+
|
|
41
|
+
:param normalized: bool. normalize by the input dimension. use for non-input layers.
|
|
42
|
+
:param transpose: bool. transpose input before normalization. use for embedding layers which have a shape of
|
|
43
|
+
(vocab_size, embedding_dim)
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, normalized: bool = False, transpose: bool = False) -> None:
|
|
47
|
+
self.normalized = normalized
|
|
48
|
+
self.transpose = transpose
|
|
49
|
+
|
|
50
|
+
def init(self, x: torch.Tensor) -> torch.Tensor:
|
|
51
|
+
dtype = x.dtype
|
|
52
|
+
if self.transpose:
|
|
53
|
+
x = x.transpose(0, 1)
|
|
54
|
+
|
|
55
|
+
torch.nn.init.normal_(x)
|
|
56
|
+
|
|
57
|
+
x.div_(x.norm(dim=0, keepdim=True)).mul_(math.sqrt(x.size(0)))
|
|
58
|
+
if self.normalized:
|
|
59
|
+
x.div_(x.size(1))
|
|
60
|
+
|
|
61
|
+
x = x.to(dtype=dtype)
|
|
62
|
+
if self.transpose:
|
|
63
|
+
x = x.transpose(0, 1)
|
|
64
|
+
|
|
65
|
+
return x
|
|
66
|
+
|
|
67
|
+
def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
|
|
68
|
+
if self.transpose:
|
|
69
|
+
grad = grad.transpose(0, 1)
|
|
70
|
+
|
|
71
|
+
d_in, d_out = grad.size()
|
|
72
|
+
|
|
73
|
+
rms_value = torch.sqrt(torch.sum(grad.pow(2), dim=0, keepdim=True)) / math.sqrt(d_in)
|
|
74
|
+
if self.normalized:
|
|
75
|
+
rms_value.mul_(d_out)
|
|
76
|
+
|
|
77
|
+
grad /= rms_value.add_(eps)
|
|
78
|
+
|
|
79
|
+
if self.transpose:
|
|
80
|
+
grad = grad.transpose(0, 1)
|
|
81
|
+
|
|
82
|
+
return grad
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class Row(Norm):
|
|
86
|
+
r"""row-wise normalization.
|
|
87
|
+
|
|
88
|
+
:param normalized: bool. normalize by the input dimension. use for non-input layers.
|
|
89
|
+
:param transpose: bool. transpose input before normalization. use for embedding layers which have a shape of
|
|
90
|
+
(vocab_size, embedding_dim)
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def __init__(self, normalized: bool = True, transpose: bool = False) -> None:
|
|
94
|
+
self.normalized = normalized
|
|
95
|
+
self.transpose = transpose
|
|
96
|
+
|
|
97
|
+
def init(self, x: torch.Tensor) -> torch.Tensor:
|
|
98
|
+
dtype = x.dtype
|
|
99
|
+
if self.transpose:
|
|
100
|
+
x = x.transpose(0, 1)
|
|
101
|
+
|
|
102
|
+
torch.nn.init.normal_(x)
|
|
103
|
+
|
|
104
|
+
x.div_(x.norm(dim=-1, keepdim=True))
|
|
105
|
+
if self.normalized:
|
|
106
|
+
x.div_(math.sqrt(x.size(-1)))
|
|
107
|
+
|
|
108
|
+
x = x.to(dtype=dtype)
|
|
109
|
+
if self.transpose:
|
|
110
|
+
x = x.transpose(0, 1)
|
|
111
|
+
|
|
112
|
+
return x
|
|
113
|
+
|
|
114
|
+
def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
|
|
115
|
+
if self.transpose:
|
|
116
|
+
grad = grad.transpose(0, 1)
|
|
117
|
+
|
|
118
|
+
rms_value = torch.sqrt(torch.sum(grad.pow(2), dim=-1, keepdim=True))
|
|
119
|
+
if self.normalized:
|
|
120
|
+
rms_value.mul_(math.sqrt(grad.size(-1)))
|
|
121
|
+
|
|
122
|
+
grad /= rms_value.add_(eps)
|
|
123
|
+
|
|
124
|
+
if self.transpose:
|
|
125
|
+
grad = grad.transpose(0, 1)
|
|
126
|
+
|
|
127
|
+
return grad
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class BiasRMS(Norm):
|
|
131
|
+
r"""bias RMS."""
|
|
132
|
+
|
|
133
|
+
def init(self, x: torch.Tensor) -> torch.Tensor:
|
|
134
|
+
return torch.nn.init.zeros_(x)
|
|
135
|
+
|
|
136
|
+
def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
|
|
137
|
+
rms_value = torch.sqrt(torch.sum(grad.pow(2), dim=0, keepdim=True))
|
|
138
|
+
grad /= rms_value.add_(eps)
|
|
139
|
+
return grad
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class SpectralConv(Norm):
|
|
143
|
+
r"""spectral-convolution normalization.
|
|
144
|
+
|
|
145
|
+
:param num_steps: int. number of steps of zero-power Newton-Schulz 5.
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
def __init__(self, num_steps: int = 5) -> None:
|
|
149
|
+
self.num_steps = num_steps
|
|
150
|
+
|
|
151
|
+
def init(self, x: torch.Tensor) -> torch.Tensor:
|
|
152
|
+
x_fp64 = x.double()
|
|
153
|
+
|
|
154
|
+
d_out, d_in, kernel_size, *_ = x_fp64.size()
|
|
155
|
+
|
|
156
|
+
for i in range(kernel_size):
|
|
157
|
+
for j in range(kernel_size):
|
|
158
|
+
torch.nn.init.orthogonal_(x_fp64[..., i, j])
|
|
159
|
+
|
|
160
|
+
x_fp64.mul_(math.sqrt(d_out / d_in) / (kernel_size**2))
|
|
161
|
+
|
|
162
|
+
return x_fp64.to(dtype=x.dtype)
|
|
163
|
+
|
|
164
|
+
def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
|
|
165
|
+
grad = zero_power_via_newton_schulz_5(grad.view(len(grad), -1), self.num_steps).view(grad.shape)
|
|
166
|
+
|
|
167
|
+
d_out, d_in, kernel_size, *_ = grad.size()
|
|
168
|
+
|
|
169
|
+
grad *= math.sqrt(d_out / d_in) / (kernel_size**2)
|
|
170
|
+
|
|
171
|
+
return grad
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class Spectral(Norm):
|
|
175
|
+
r"""spectral normalization.
|
|
176
|
+
|
|
177
|
+
:param max_scale: bool. set upper bound (1.0) of the scale.
|
|
178
|
+
:param normalize: bool. normalize by the input dimension. use for non-input layers.
|
|
179
|
+
:param num_steps: int. number of steps of zero-power Newton-Schulz 5.
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
def __init__(self, max_scale: bool = False, normalize: bool = True, num_steps: int = 5) -> None:
|
|
183
|
+
self.max_scale = max_scale
|
|
184
|
+
self.normalize = normalize
|
|
185
|
+
self.num_steps = num_steps
|
|
186
|
+
|
|
187
|
+
def init(self, x: torch.Tensor) -> torch.Tensor:
|
|
188
|
+
x_fp64 = x.double()
|
|
189
|
+
|
|
190
|
+
torch.nn.init.orthogonal_(x_fp64)
|
|
191
|
+
|
|
192
|
+
d_out, d_in = x_fp64.size()
|
|
193
|
+
|
|
194
|
+
scale: float = math.sqrt(d_out / d_in) if self.normalize else math.sqrt(d_out)
|
|
195
|
+
if self.max_scale:
|
|
196
|
+
scale = max(1.0, scale)
|
|
197
|
+
|
|
198
|
+
x_fp64.mul_(scale)
|
|
199
|
+
|
|
200
|
+
return x_fp64.to(dtype=x.dtype)
|
|
201
|
+
|
|
202
|
+
def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
|
|
203
|
+
grad = zero_power_via_newton_schulz_5(grad.view(len(grad), -1), self.num_steps).view(grad.shape)
|
|
204
|
+
|
|
205
|
+
d_out, d_in = grad.size()
|
|
206
|
+
|
|
207
|
+
scale: float = math.sqrt(d_out / d_in) if self.normalize else math.sqrt(d_out)
|
|
208
|
+
if self.max_scale:
|
|
209
|
+
scale = max(1.0, scale)
|
|
210
|
+
|
|
211
|
+
grad *= scale
|
|
212
|
+
|
|
213
|
+
return grad
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class Sign(Norm):
|
|
217
|
+
r"""sign normalization.
|
|
218
|
+
|
|
219
|
+
:param zero_init: bool. initialize with zero.
|
|
220
|
+
:param normalize: bool. normalize by the input dimension. use for non-input layers.
|
|
221
|
+
"""
|
|
222
|
+
|
|
223
|
+
def __init__(self, zero_init: bool = False, normalize: bool = True) -> None:
|
|
224
|
+
self.zero_init = zero_init
|
|
225
|
+
self.normalize = normalize
|
|
226
|
+
|
|
227
|
+
def init(self, x: torch.Tensor) -> torch.Tensor:
|
|
228
|
+
if self.zero_init:
|
|
229
|
+
return torch.nn.init.zeros_(x)
|
|
230
|
+
|
|
231
|
+
d_in: int = x.size(1)
|
|
232
|
+
|
|
233
|
+
x = 2 * torch.randint(0, 2, x.shape, dtype=x.dtype, device=x.device) - 1
|
|
234
|
+
if self.normalize:
|
|
235
|
+
x.div_(d_in)
|
|
236
|
+
|
|
237
|
+
return x
|
|
238
|
+
|
|
239
|
+
def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
|
|
240
|
+
d_in: int = grad.size(1)
|
|
241
|
+
return torch.sign(grad).div_(d_in) if self.normalize else torch.sign(grad)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
class Auto(Norm):
|
|
245
|
+
r"""choose Norm type automatically."""
|
|
246
|
+
|
|
247
|
+
def init(self, x: torch.Tensor) -> torch.Tensor:
|
|
248
|
+
ndim: int = x.ndim
|
|
249
|
+
if ndim in (0, 1):
|
|
250
|
+
return BiasRMS().init(x)
|
|
251
|
+
if ndim == 2:
|
|
252
|
+
return Spectral().init(x)
|
|
253
|
+
if ndim in (3, 4):
|
|
254
|
+
return SpectralConv().init(x)
|
|
255
|
+
raise NotImplementedError
|
|
256
|
+
|
|
257
|
+
def lmo(self, grad: torch.Tensor) -> torch.Tensor:
|
|
258
|
+
ndim: int = grad.ndim
|
|
259
|
+
if ndim in (0, 1):
|
|
260
|
+
return BiasRMS().lmo(grad)
|
|
261
|
+
if ndim == 2:
|
|
262
|
+
return Spectral().lmo(grad)
|
|
263
|
+
if ndim in (3, 4):
|
|
264
|
+
return SpectralConv().lmo(grad)
|
|
265
|
+
raise NotImplementedError
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def build_lmo_norm(norm_type: int, **kwargs) -> Norm: # noqa: PLR0911
|
|
269
|
+
r"""Build LMONorm by given norm_type."""
|
|
270
|
+
if norm_type == LMONorm.AUTO:
|
|
271
|
+
return Auto()
|
|
272
|
+
if norm_type == LMONorm.SPECTRAL:
|
|
273
|
+
return Spectral(**kwargs)
|
|
274
|
+
if norm_type == LMONorm.SPECTRALCONV:
|
|
275
|
+
return SpectralConv(**kwargs)
|
|
276
|
+
if norm_type == LMONorm.SIGN:
|
|
277
|
+
return Sign(**kwargs)
|
|
278
|
+
if norm_type == LMONorm.BIAS:
|
|
279
|
+
return BiasRMS()
|
|
280
|
+
if norm_type == LMONorm.COL:
|
|
281
|
+
return Col(**kwargs)
|
|
282
|
+
if norm_type == LMONorm.ROW:
|
|
283
|
+
return Row(**kwargs)
|
|
284
|
+
return Norm()
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class SCION(BaseOptimizer):
|
|
288
|
+
r"""Training Deep Learning Models with Norm-Constrained LMOs.
|
|
289
|
+
|
|
290
|
+
Example:
|
|
291
|
+
>>> radius = 50.0
|
|
292
|
+
>>> parameter_groups = [{
|
|
293
|
+
... 'params': model.transformer.h.parameters(),
|
|
294
|
+
... 'norm_type': 'spectral',
|
|
295
|
+
... 'norm_kwargs': {},
|
|
296
|
+
... 'scale': radius,
|
|
297
|
+
... }, {
|
|
298
|
+
... 'params': model.lm_head.parameters(),
|
|
299
|
+
... 'norm_type': 'sign',
|
|
300
|
+
... 'norm_kwargs': {},
|
|
301
|
+
... 'scale': radius * 60.0,
|
|
302
|
+
... }]
|
|
303
|
+
>>> optimizer = SCION(parameter_groups)
|
|
304
|
+
|
|
305
|
+
For more details, checkout here https://github.com/LIONS-EPFL/scion/tree/main?tab=readme-ov-file#examples
|
|
306
|
+
|
|
307
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
308
|
+
:param lr: float. learning rate.
|
|
309
|
+
:param momentum: float. momentum factor. 1.0 - usual momentum.
|
|
310
|
+
:param constraint: bool. whether to use a constraint SCG or not.
|
|
311
|
+
:param norm_type: int. supported LMO norm types. 0 stands for no normalization and 1 stands for AUTO. 0 to 7.
|
|
312
|
+
please check LMONorm Enum class for the details.
|
|
313
|
+
:param norm_kwargs: Optional[Dict]. arguments for the Norm.
|
|
314
|
+
:param scale: float. based on the usage of the original intend, 50.0 is used for Transformer block, and 3000.0 is
|
|
315
|
+
used for others (e.g. Embedding, LM head)
|
|
316
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
317
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
318
|
+
"""
|
|
319
|
+
|
|
320
|
+
def __init__(
|
|
321
|
+
self,
|
|
322
|
+
params: PARAMETERS,
|
|
323
|
+
lr: float = 1e-3,
|
|
324
|
+
momentum: float = 0.1,
|
|
325
|
+
constraint: bool = False,
|
|
326
|
+
norm_type: int = LMONorm.AUTO,
|
|
327
|
+
norm_kwargs: Optional[Dict] = None,
|
|
328
|
+
scale: float = 1.0,
|
|
329
|
+
weight_decay: float = 0.0,
|
|
330
|
+
weight_decouple: bool = True,
|
|
331
|
+
**kwargs,
|
|
332
|
+
):
|
|
333
|
+
self.validate_learning_rate(lr)
|
|
334
|
+
self.validate_range(momentum, 'momentum', 0.0, 1.0, '(]')
|
|
335
|
+
self.validate_positive(scale, 'scale')
|
|
336
|
+
|
|
337
|
+
if norm_kwargs is None:
|
|
338
|
+
norm_kwargs = {}
|
|
339
|
+
|
|
340
|
+
defaults: DEFAULTS = {
|
|
341
|
+
'lr': lr,
|
|
342
|
+
'momentum': momentum,
|
|
343
|
+
'constraint': constraint,
|
|
344
|
+
'norm_type': norm_type,
|
|
345
|
+
'norm_kwargs': norm_kwargs,
|
|
346
|
+
'scale': scale,
|
|
347
|
+
'weight_decay': weight_decay,
|
|
348
|
+
'weight_decouple': weight_decouple,
|
|
349
|
+
}
|
|
350
|
+
super().__init__(params, defaults)
|
|
351
|
+
|
|
352
|
+
def __str__(self) -> str:
|
|
353
|
+
return 'SCION'
|
|
354
|
+
|
|
355
|
+
@torch.no_grad()
|
|
356
|
+
def reset(self):
|
|
357
|
+
pass
|
|
358
|
+
|
|
359
|
+
@torch.no_grad()
|
|
360
|
+
def init(self):
|
|
361
|
+
for group in self.param_groups:
|
|
362
|
+
norm = build_lmo_norm(group['norm_type'], **group['norm_kwargs'])
|
|
363
|
+
for p in group['params']:
|
|
364
|
+
norm.init(p)
|
|
365
|
+
p.mul_(group['scale'])
|
|
366
|
+
|
|
367
|
+
@torch.no_grad()
|
|
368
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
369
|
+
loss: LOSS = None
|
|
370
|
+
if closure is not None:
|
|
371
|
+
with torch.enable_grad():
|
|
372
|
+
loss = closure()
|
|
373
|
+
|
|
374
|
+
for group in self.param_groups:
|
|
375
|
+
norm = build_lmo_norm(group['norm_type'], **group['norm_kwargs'])
|
|
376
|
+
|
|
377
|
+
for p in group['params']:
|
|
378
|
+
if p.grad is None:
|
|
379
|
+
continue
|
|
380
|
+
|
|
381
|
+
grad = p.grad
|
|
382
|
+
if grad.is_sparse:
|
|
383
|
+
raise NoSparseGradientError(str(self))
|
|
384
|
+
|
|
385
|
+
state = self.state[p]
|
|
386
|
+
if 'd' not in state:
|
|
387
|
+
state['d'] = torch.zeros_like(grad)
|
|
388
|
+
|
|
389
|
+
d = state['d']
|
|
390
|
+
d.mul_(1.0 - group['momentum']).add_(grad, alpha=group['momentum'])
|
|
391
|
+
|
|
392
|
+
update = norm.lmo(grad).mul_(group['scale'])
|
|
393
|
+
|
|
394
|
+
if group['constraint']:
|
|
395
|
+
p.mul_(1.0 - group['lr'])
|
|
396
|
+
|
|
397
|
+
if not group['constraint'] and group['weight_decay'] > 0.0:
|
|
398
|
+
self.apply_weight_decay(
|
|
399
|
+
p,
|
|
400
|
+
grad,
|
|
401
|
+
lr=group['lr'],
|
|
402
|
+
weight_decay=group['weight_decay'],
|
|
403
|
+
weight_decouple=group['weight_decouple'],
|
|
404
|
+
fixed_decay=False,
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
p.add_(update, alpha=-group['lr'])
|
|
408
|
+
|
|
409
|
+
return loss
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
class SCIONLight(BaseOptimizer):
|
|
413
|
+
r"""Memory-efficient variant of the Scion optimizer.
|
|
414
|
+
|
|
415
|
+
Example:
|
|
416
|
+
>>> radius = 50.0
|
|
417
|
+
>>> parameter_groups = [{
|
|
418
|
+
... 'params': model.transformer.h.parameters(),
|
|
419
|
+
... 'norm_type': 'spectral',
|
|
420
|
+
... 'norm_kwargs': {},
|
|
421
|
+
... 'scale': radius,
|
|
422
|
+
... }, {
|
|
423
|
+
... 'params': model.lm_head.parameters(),
|
|
424
|
+
... 'norm_type': 'sign',
|
|
425
|
+
... 'norm_kwargs': {},
|
|
426
|
+
... 'scale': radius * 60.0,
|
|
427
|
+
... }]
|
|
428
|
+
>>> optimizer = SCIONLight(parameter_groups)
|
|
429
|
+
|
|
430
|
+
For more details, checkout here https://github.com/LIONS-EPFL/scion/tree/main?tab=readme-ov-file#examples
|
|
431
|
+
|
|
432
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
433
|
+
:param lr: float. learning rate.
|
|
434
|
+
:param momentum: float. momentum factor. 1.0 - usual momentum.
|
|
435
|
+
:param constraint: bool. whether to use a constraint SCG or not.
|
|
436
|
+
:param norm_type: int. supported LMO norm types. 0 stands for no normalization and 1 stands for AUTO. 0 to 7.
|
|
437
|
+
please check LMONorm Enum class for the details.
|
|
438
|
+
:param norm_kwargs: Optional[Dict]. arguments for the Norm.
|
|
439
|
+
:param scale: float. based on the usage of the original intend, 50.0 is used for Transformer block, and 3000.0 is
|
|
440
|
+
used for others (e.g. Embedding, LM head)
|
|
441
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
442
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
443
|
+
"""
|
|
444
|
+
|
|
445
|
+
def __init__(
|
|
446
|
+
self,
|
|
447
|
+
params: PARAMETERS,
|
|
448
|
+
lr: float = 1e-3,
|
|
449
|
+
momentum: float = 0.1,
|
|
450
|
+
constraint: bool = False,
|
|
451
|
+
norm_type: int = LMONorm.AUTO,
|
|
452
|
+
norm_kwargs: Optional[Dict] = None,
|
|
453
|
+
scale: float = 1.0,
|
|
454
|
+
weight_decay: float = 0.0,
|
|
455
|
+
weight_decouple: bool = True,
|
|
456
|
+
**kwargs,
|
|
457
|
+
):
|
|
458
|
+
self.validate_learning_rate(lr)
|
|
459
|
+
self.validate_range(momentum, 'momentum', 0.0, 1.0, '(]')
|
|
460
|
+
self.validate_positive(scale, 'scale')
|
|
461
|
+
|
|
462
|
+
if norm_kwargs is None:
|
|
463
|
+
norm_kwargs = {}
|
|
464
|
+
|
|
465
|
+
defaults: DEFAULTS = {
|
|
466
|
+
'lr': lr,
|
|
467
|
+
'momentum': momentum,
|
|
468
|
+
'constraint': constraint,
|
|
469
|
+
'norm_type': norm_type,
|
|
470
|
+
'norm_kwargs': norm_kwargs,
|
|
471
|
+
'scale': scale,
|
|
472
|
+
'weight_decay': weight_decay,
|
|
473
|
+
'weight_decouple': weight_decouple,
|
|
474
|
+
}
|
|
475
|
+
super().__init__(params, defaults)
|
|
476
|
+
|
|
477
|
+
def __str__(self) -> str:
|
|
478
|
+
return 'SCIONLight'
|
|
479
|
+
|
|
480
|
+
@torch.no_grad()
|
|
481
|
+
def reset(self):
|
|
482
|
+
pass
|
|
483
|
+
|
|
484
|
+
@torch.no_grad()
|
|
485
|
+
def init(self):
|
|
486
|
+
for group in self.param_groups:
|
|
487
|
+
norm = build_lmo_norm(group['norm_type'], **group['norm_kwargs'])
|
|
488
|
+
for p in group['params']:
|
|
489
|
+
norm.init(p)
|
|
490
|
+
p.mul_(group['scale'])
|
|
491
|
+
|
|
492
|
+
@torch.no_grad()
|
|
493
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
494
|
+
loss: LOSS = None
|
|
495
|
+
if closure is not None:
|
|
496
|
+
with torch.enable_grad():
|
|
497
|
+
loss = closure()
|
|
498
|
+
|
|
499
|
+
for group in self.param_groups:
|
|
500
|
+
norm = build_lmo_norm(group['norm_type'], **group['norm_kwargs'])
|
|
501
|
+
|
|
502
|
+
for p in group['params']:
|
|
503
|
+
if p.grad is None:
|
|
504
|
+
continue
|
|
505
|
+
|
|
506
|
+
grad = p.grad
|
|
507
|
+
if grad.is_sparse:
|
|
508
|
+
raise NoSparseGradientError(str(self))
|
|
509
|
+
|
|
510
|
+
update = norm.lmo(grad).mul_(group['scale'])
|
|
511
|
+
|
|
512
|
+
if group['constraint']:
|
|
513
|
+
p.mul_(1.0 - group['lr'])
|
|
514
|
+
|
|
515
|
+
if not group['constraint'] and group['weight_decay'] > 0.0:
|
|
516
|
+
self.apply_weight_decay(
|
|
517
|
+
p,
|
|
518
|
+
grad,
|
|
519
|
+
lr=group['lr'],
|
|
520
|
+
weight_decay=group['weight_decay'],
|
|
521
|
+
weight_decouple=group['weight_decouple'],
|
|
522
|
+
fixed_decay=False,
|
|
523
|
+
)
|
|
524
|
+
|
|
525
|
+
p.add_(update, alpha=-group['lr'])
|
|
526
|
+
|
|
527
|
+
if group['momentum'] != 1.0:
|
|
528
|
+
grad.mul_(1.0 - group['momentum'])
|
|
529
|
+
|
|
530
|
+
return loss
|
|
@@ -31,7 +31,8 @@ class CosineDecay:
|
|
|
31
31
|
|
|
32
32
|
:param current_step: int. Current step index.
|
|
33
33
|
"""
|
|
34
|
-
self.cosine_stepper.
|
|
34
|
+
self.cosine_stepper.last_epoch = current_step
|
|
35
|
+
self.cosine_stepper.step()
|
|
35
36
|
|
|
36
37
|
def get_death_rate(self, current_step: int) -> float:
|
|
37
38
|
r"""Get the updated rate (death_rate) at the given step.
|
|
@@ -266,9 +267,9 @@ class StableSPAM(BaseOptimizer):
|
|
|
266
267
|
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
267
268
|
:param lr: float. learning rate.
|
|
268
269
|
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
269
|
-
:param gamma1: float.
|
|
270
|
-
:param gamma2: float.
|
|
271
|
-
:param theta: float.
|
|
270
|
+
:param gamma1: float. gamma1 parameter.
|
|
271
|
+
:param gamma2: float. gamma2 parameter.
|
|
272
|
+
:param theta: float. theta parameter.
|
|
272
273
|
:param t_max: Optional[int]. total number of steps.
|
|
273
274
|
:param eta_min: float. eta_min of CosineDecay.
|
|
274
275
|
:param weight_decay: float. weight decay (L2 penalty).
|