pytorch-optimizer 3.3.0__tar.gz → 3.3.2__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.3.0 → pytorch_optimizer-3.3.2}/PKG-INFO +10 -7
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/README.md +8 -5
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pyproject.toml +9 -9
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/__init__.py +4 -1
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/__init__.py +7 -3
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/a2grad.py +4 -2
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamg.py +4 -4
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adashift.py +10 -3
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/ademamix.py +3 -1
- pytorch_optimizer-3.3.2/pytorch_optimizer/optimizer/apollo.py +304 -0
- pytorch_optimizer-3.3.2/pytorch_optimizer/optimizer/galore.py +124 -0
- pytorch_optimizer-3.3.0/pytorch_optimizer/optimizer/galore.py → pytorch_optimizer-3.3.2/pytorch_optimizer/optimizer/galore_utils.py +44 -143
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lookahead.py +4 -4
- pytorch_optimizer-3.3.2/pytorch_optimizer/optimizer/mars.py +255 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/muon.py +2 -39
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sgd.py +123 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/shampoo_utils.py +38 -0
- pytorch_optimizer-3.3.0/pytorch_optimizer/optimizer/apollo.py +0 -148
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/LICENSE +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/optimizer.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/types.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/bi_tempered.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/cross_entropy.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/dice.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/f1.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/focal.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/jaccard.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/ldam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/lovasz.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/tversky.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adabelief.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adafactor.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adahessian.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adai.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adalite.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamp.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamw.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adan.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adopt.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/aida.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/amos.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/came.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/dadapt.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/demo.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/fadam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/ftrl.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/gc.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/grokfast.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/kate.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/laprop.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lion.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lomo.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/padam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/prodigy.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/ranger.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/ranger21.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/rotograd.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sgdp.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/shampoo.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/soap.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sophia.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/tiger.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/trac.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/utils.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/yogi.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pytorch_optimizer
|
|
3
|
-
Version: 3.3.
|
|
3
|
+
Version: 3.3.2
|
|
4
4
|
Summary: optimizer & lr scheduler & objective function collections in PyTorch
|
|
5
5
|
Home-page: https://github.com/kozistr/pytorch_optimizer
|
|
6
6
|
License: Apache-2.0
|
|
7
|
-
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdamG,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdEMAMix,ADOPT,AdaHessian,Adai,Adalite,AdaLomo,AdamMini,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DeMo,DiffGrad,FAdam,Fromage,FTRL,GaLore,Gravity,GrokFast,GSAM,Kate,Lamb,LaProp,LARS,Lion,LOMO,Lookahead,MADGRAD,MSVAG,Muno,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SOAP,SopihaH,SRMM,StableAdamW,SWATS,Tiger,TRAC,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes,WSD,QGaLore
|
|
7
|
+
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdamG,AdaMod,AdaNorm,AdaPNM,AdaSmooth,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,FAdam,Fromage,FTRL,GaLore,Gravity,GrokFast,GSAM,Kate,Lamb,LaProp,LARS,Lion,LOMO,Lookahead,MADGRAD,MARS,MSVAG,Muno,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SOAP,SopihaH,SRMM,StableAdamW,SWATS,Tiger,TRAC,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes,WSD,QGaLore
|
|
8
8
|
Author: kozistr
|
|
9
9
|
Author-email: kozistr@gmail.com
|
|
10
10
|
Maintainer: kozistr
|
|
@@ -51,11 +51,11 @@ Description-Content-Type: text/markdown
|
|
|
51
51
|
|
|
52
52
|
## The reasons why you use `pytorch-optimizer`.
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
* Wide range of supported optimizers. Currently, **86 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
|
|
55
|
+
* Including many variants such as `Cautious`, `AdamD`, `Gradient Centrailiaztion`
|
|
56
|
+
* Easy to use, clean, and tested codes
|
|
57
|
+
* Active maintenance
|
|
58
|
+
* Somewhat a bit more optimized compared to the original implementation
|
|
59
59
|
|
|
60
60
|
Highly inspired by [pytorch-optimizer](https://github.com/jettify/pytorch-optimizer).
|
|
61
61
|
|
|
@@ -233,6 +233,9 @@ get_supported_optimizers(['adam*', 'ranger*'])
|
|
|
233
233
|
| MicroAdam | *Accurate Adaptive Optimization with Low Space Overhead and Provable Convergence* | [github](https://github.com/IST-DASLab/MicroAdam) | <https://arxiv.org/abs/2405.15593> | [cite](https://github.com/IST-DASLab/MicroAdam?tab=readme-ov-file#citing) |
|
|
234
234
|
| Muon | *MomentUm Orthogonalized by Newton-schulz* | [github](https://github.com/KellerJordan/Muon) | <https://x.com/kellerjordan0/status/1842300916864844014> | [cite](https://github.com/KellerJordan/Muon) |
|
|
235
235
|
| LaProp | *Separating Momentum and Adaptivity in Adam* | [github](https://github.com/Z-T-WANG/LaProp-Optimizer) | <https://arxiv.org/abs/2002.04839> | [cite](https://github.com/Z-T-WANG/LaProp-Optimizer?tab=readme-ov-file#citation) |
|
|
236
|
+
| APOLLO | *SGD-like Memory, AdamW-level Performance* | [github](https://github.com/zhuhanqing/APOLLO) | <https://arxiv.org/abs/2412.05270> | [cite](https://github.com/zhuhanqing/APOLLO?tab=readme-ov-file#-citation) |
|
|
237
|
+
| MARS | *Unleashing the Power of Variance Reduction for Training Large Models* | [github](https://github.com/AGI-Arena/MARS) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AGI-Arena/MARS/tree/main?tab=readme-ov-file#citation) |
|
|
238
|
+
| SGDSaI | *No More Adam: Learning Rate Scaling at Initialization is All You Need* | [github](https://github.com/AnonymousAlethiometer/SGD_SaI) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AnonymousAlethiometer/SGD_SaI?tab=readme-ov-file#citation) |
|
|
236
239
|
|
|
237
240
|
## Supported LR Scheduler
|
|
238
241
|
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
|
|
11
11
|
## The reasons why you use `pytorch-optimizer`.
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
* Wide range of supported optimizers. Currently, **86 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
|
|
14
|
+
* Including many variants such as `Cautious`, `AdamD`, `Gradient Centrailiaztion`
|
|
15
|
+
* Easy to use, clean, and tested codes
|
|
16
|
+
* Active maintenance
|
|
17
|
+
* Somewhat a bit more optimized compared to the original implementation
|
|
18
18
|
|
|
19
19
|
Highly inspired by [pytorch-optimizer](https://github.com/jettify/pytorch-optimizer).
|
|
20
20
|
|
|
@@ -192,6 +192,9 @@ get_supported_optimizers(['adam*', 'ranger*'])
|
|
|
192
192
|
| MicroAdam | *Accurate Adaptive Optimization with Low Space Overhead and Provable Convergence* | [github](https://github.com/IST-DASLab/MicroAdam) | <https://arxiv.org/abs/2405.15593> | [cite](https://github.com/IST-DASLab/MicroAdam?tab=readme-ov-file#citing) |
|
|
193
193
|
| Muon | *MomentUm Orthogonalized by Newton-schulz* | [github](https://github.com/KellerJordan/Muon) | <https://x.com/kellerjordan0/status/1842300916864844014> | [cite](https://github.com/KellerJordan/Muon) |
|
|
194
194
|
| LaProp | *Separating Momentum and Adaptivity in Adam* | [github](https://github.com/Z-T-WANG/LaProp-Optimizer) | <https://arxiv.org/abs/2002.04839> | [cite](https://github.com/Z-T-WANG/LaProp-Optimizer?tab=readme-ov-file#citation) |
|
|
195
|
+
| APOLLO | *SGD-like Memory, AdamW-level Performance* | [github](https://github.com/zhuhanqing/APOLLO) | <https://arxiv.org/abs/2412.05270> | [cite](https://github.com/zhuhanqing/APOLLO?tab=readme-ov-file#-citation) |
|
|
196
|
+
| MARS | *Unleashing the Power of Variance Reduction for Training Large Models* | [github](https://github.com/AGI-Arena/MARS) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AGI-Arena/MARS/tree/main?tab=readme-ov-file#citation) |
|
|
197
|
+
| SGDSaI | *No More Adam: Learning Rate Scaling at Initialization is All You Need* | [github](https://github.com/AnonymousAlethiometer/SGD_SaI) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AnonymousAlethiometer/SGD_SaI?tab=readme-ov-file#citation) |
|
|
195
198
|
|
|
196
199
|
## Supported LR Scheduler
|
|
197
200
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "3.3.
|
|
3
|
+
version = "3.3.2"
|
|
4
4
|
description = "optimizer & lr scheduler & objective function collections in PyTorch"
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
authors = ["kozistr <kozistr@gmail.com>"]
|
|
@@ -13,14 +13,14 @@ keywords = [
|
|
|
13
13
|
"pytorch", "deep-learning", "optimizer", "lr scheduler", "A2Grad", "ASGD", "AccSGD", "AdaBelief", "AdaBound",
|
|
14
14
|
"AdaDelta", "AdaFactor", "AdaMax", "AdamG", "AdaMod", "AdaNorm", "AdaPNM", "AdaSmooth", "AdEMAMix", "ADOPT",
|
|
15
15
|
"AdaHessian", "Adai", "Adalite", "AdaLomo", "AdamMini", "AdamP", "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos",
|
|
16
|
-
"Apollo", "AvaGrad", "bSAM", "CAME", "DAdaptAdaGrad", "DAdaptAdam", "DAdaptAdan", "DAdaptSGD",
|
|
17
|
-
"DeMo", "DiffGrad", "FAdam", "Fromage", "FTRL", "GaLore", "Gravity", "GrokFast", "GSAM", "Kate",
|
|
18
|
-
"
|
|
19
|
-
"PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM",
|
|
20
|
-
"ScheduleFreeAdamW", "ScheduleFreeRAdam", "SGDP", "Shampoo", "ScalableShampoo", "SGDW",
|
|
21
|
-
"SopihaH", "SRMM", "StableAdamW", "SWATS", "Tiger", "TRAC", "WSAM", "Yogi", "BCE",
|
|
22
|
-
"FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky",
|
|
23
|
-
"bitsandbytes", "WSD", "QGaLore",
|
|
16
|
+
"Apollo", "APOLLO", "AvaGrad", "bSAM", "CAME", "DAdaptAdaGrad", "DAdaptAdam", "DAdaptAdan", "DAdaptSGD",
|
|
17
|
+
"DAdaptLion", "DeMo", "DiffGrad", "FAdam", "Fromage", "FTRL", "GaLore", "Gravity", "GrokFast", "GSAM", "Kate",
|
|
18
|
+
"Lamb", "LaProp", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD", "MARS", "MSVAG", "Muno", "Nero", "NovoGrad",
|
|
19
|
+
"PAdam", "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM",
|
|
20
|
+
"ScheduleFreeSGD", "ScheduleFreeAdamW", "ScheduleFreeRAdam", "SGDP", "Shampoo", "ScalableShampoo", "SGDW",
|
|
21
|
+
"SignSGD", "SM3", "SOAP", "SopihaH", "SRMM", "StableAdamW", "SWATS", "Tiger", "TRAC", "WSAM", "Yogi", "BCE",
|
|
22
|
+
"BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky",
|
|
23
|
+
"LovaszHinge", "bitsandbytes", "WSD", "QGaLore",
|
|
24
24
|
]
|
|
25
25
|
classifiers = [
|
|
26
26
|
"License :: OSI Approved :: Apache Software License",
|
|
@@ -42,6 +42,7 @@ from pytorch_optimizer.lr_scheduler import (
|
|
|
42
42
|
)
|
|
43
43
|
from pytorch_optimizer.optimizer import (
|
|
44
44
|
ADOPT,
|
|
45
|
+
APOLLO,
|
|
45
46
|
ASGD,
|
|
46
47
|
BSAM,
|
|
47
48
|
CAME,
|
|
@@ -50,6 +51,7 @@ from pytorch_optimizer.optimizer import (
|
|
|
50
51
|
LARS,
|
|
51
52
|
LOMO,
|
|
52
53
|
MADGRAD,
|
|
54
|
+
MARS,
|
|
53
55
|
MSVAG,
|
|
54
56
|
PID,
|
|
55
57
|
PNM,
|
|
@@ -90,7 +92,7 @@ from pytorch_optimizer.optimizer import (
|
|
|
90
92
|
Aida,
|
|
91
93
|
AliG,
|
|
92
94
|
Amos,
|
|
93
|
-
|
|
95
|
+
ApolloDQN,
|
|
94
96
|
AvaGrad,
|
|
95
97
|
DAdaptAdaGrad,
|
|
96
98
|
DAdaptAdam,
|
|
@@ -126,6 +128,7 @@ from pytorch_optimizer.optimizer import (
|
|
|
126
128
|
ScheduleFreeAdamW,
|
|
127
129
|
ScheduleFreeRAdam,
|
|
128
130
|
ScheduleFreeSGD,
|
|
131
|
+
SGDSaI,
|
|
129
132
|
Shampoo,
|
|
130
133
|
SignSGD,
|
|
131
134
|
SophiaH,
|
|
@@ -34,7 +34,7 @@ from pytorch_optimizer.optimizer.aggmo import AggMo
|
|
|
34
34
|
from pytorch_optimizer.optimizer.aida import Aida
|
|
35
35
|
from pytorch_optimizer.optimizer.alig import AliG
|
|
36
36
|
from pytorch_optimizer.optimizer.amos import Amos
|
|
37
|
-
from pytorch_optimizer.optimizer.apollo import
|
|
37
|
+
from pytorch_optimizer.optimizer.apollo import APOLLO, ApolloDQN
|
|
38
38
|
from pytorch_optimizer.optimizer.avagrad import AvaGrad
|
|
39
39
|
from pytorch_optimizer.optimizer.came import CAME
|
|
40
40
|
from pytorch_optimizer.optimizer.dadapt import DAdaptAdaGrad, DAdaptAdam, DAdaptAdan, DAdaptLion, DAdaptSGD
|
|
@@ -56,6 +56,7 @@ from pytorch_optimizer.optimizer.lion import Lion
|
|
|
56
56
|
from pytorch_optimizer.optimizer.lomo import LOMO, AdaLOMO
|
|
57
57
|
from pytorch_optimizer.optimizer.lookahead import Lookahead
|
|
58
58
|
from pytorch_optimizer.optimizer.madgrad import MADGRAD
|
|
59
|
+
from pytorch_optimizer.optimizer.mars import MARS
|
|
59
60
|
from pytorch_optimizer.optimizer.msvag import MSVAG
|
|
60
61
|
from pytorch_optimizer.optimizer.muon import Muon
|
|
61
62
|
from pytorch_optimizer.optimizer.nero import Nero
|
|
@@ -73,7 +74,7 @@ from pytorch_optimizer.optimizer.ranger21 import Ranger21
|
|
|
73
74
|
from pytorch_optimizer.optimizer.rotograd import RotoGrad
|
|
74
75
|
from pytorch_optimizer.optimizer.sam import BSAM, GSAM, SAM, WSAM
|
|
75
76
|
from pytorch_optimizer.optimizer.schedulefree import ScheduleFreeAdamW, ScheduleFreeRAdam, ScheduleFreeSGD
|
|
76
|
-
from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD, SignSGD
|
|
77
|
+
from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD, SGDSaI, SignSGD
|
|
77
78
|
from pytorch_optimizer.optimizer.sgdp import SGDP
|
|
78
79
|
from pytorch_optimizer.optimizer.shampoo import ScalableShampoo, Shampoo
|
|
79
80
|
from pytorch_optimizer.optimizer.sm3 import SM3
|
|
@@ -228,7 +229,8 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
228
229
|
DAdaptAdan,
|
|
229
230
|
AdamS,
|
|
230
231
|
AdaFactor,
|
|
231
|
-
|
|
232
|
+
ApolloDQN,
|
|
233
|
+
APOLLO,
|
|
232
234
|
SWATS,
|
|
233
235
|
NovoGrad,
|
|
234
236
|
Lion,
|
|
@@ -278,6 +280,8 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
278
280
|
Muon,
|
|
279
281
|
ScheduleFreeRAdam,
|
|
280
282
|
LaProp,
|
|
283
|
+
MARS,
|
|
284
|
+
SGDSaI,
|
|
281
285
|
]
|
|
282
286
|
OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
|
|
283
287
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import math
|
|
2
|
-
from typing import Optional
|
|
2
|
+
from typing import Literal, Optional
|
|
3
3
|
|
|
4
4
|
import torch
|
|
5
5
|
|
|
@@ -7,6 +7,8 @@ from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
|
7
7
|
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
8
8
|
from pytorch_optimizer.base.types import CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
9
9
|
|
|
10
|
+
VARIANTS = Literal['uni', 'inc', 'exp']
|
|
11
|
+
|
|
10
12
|
|
|
11
13
|
class A2Grad(BaseOptimizer):
|
|
12
14
|
r"""Optimal Adaptive and Accelerated Stochastic Gradient Descent.
|
|
@@ -26,7 +28,7 @@ class A2Grad(BaseOptimizer):
|
|
|
26
28
|
beta: float = 10.0,
|
|
27
29
|
lips: float = 10.0,
|
|
28
30
|
rho: float = 0.5,
|
|
29
|
-
variant:
|
|
31
|
+
variant: VARIANTS = 'uni',
|
|
30
32
|
**kwargs,
|
|
31
33
|
):
|
|
32
34
|
self.validate_learning_rate(lr)
|
|
@@ -24,9 +24,9 @@ class AdamG(BaseOptimizer):
|
|
|
24
24
|
def __init__(
|
|
25
25
|
self,
|
|
26
26
|
params: PARAMETERS,
|
|
27
|
-
lr: float =
|
|
27
|
+
lr: float = 1.0,
|
|
28
28
|
betas: BETAS = (0.95, 0.999, 0.95),
|
|
29
|
-
p: float = 0.
|
|
29
|
+
p: float = 0.2,
|
|
30
30
|
q: float = 0.24,
|
|
31
31
|
weight_decay: float = 0.0,
|
|
32
32
|
weight_decouple: bool = False,
|
|
@@ -88,8 +88,8 @@ class AdamG(BaseOptimizer):
|
|
|
88
88
|
|
|
89
89
|
beta1, beta2, beta3 = group['betas']
|
|
90
90
|
|
|
91
|
-
bias_correction1: float =
|
|
92
|
-
bias_correction2: float =
|
|
91
|
+
bias_correction1: float = self.debias(beta1, group['step'])
|
|
92
|
+
bias_correction2: float = self.debias(beta2, group['step'])
|
|
93
93
|
step_size: float = min(group['lr'], 1.0 / math.sqrt(group['step']))
|
|
94
94
|
|
|
95
95
|
for p in group['params']:
|
|
@@ -17,6 +17,7 @@ class AdaShift(BaseOptimizer):
|
|
|
17
17
|
:param keep_num: int. number of gradients used to compute first moment estimation.
|
|
18
18
|
:param reduce_func: Optional[Callable]. function applied to squared gradients to further reduce the correlation.
|
|
19
19
|
If None, no function is applied.
|
|
20
|
+
:param cautious: bool. whether to use cautious feature.
|
|
20
21
|
:param eps: float. term added to the denominator to improve numerical stability.
|
|
21
22
|
"""
|
|
22
23
|
|
|
@@ -27,6 +28,7 @@ class AdaShift(BaseOptimizer):
|
|
|
27
28
|
betas: BETAS = (0.9, 0.999),
|
|
28
29
|
keep_num: int = 10,
|
|
29
30
|
reduce_func: Optional[Callable] = torch.max,
|
|
31
|
+
cautious: bool = False,
|
|
30
32
|
eps: float = 1e-10,
|
|
31
33
|
**kwargs,
|
|
32
34
|
):
|
|
@@ -36,6 +38,7 @@ class AdaShift(BaseOptimizer):
|
|
|
36
38
|
self.validate_non_negative(eps, 'eps')
|
|
37
39
|
|
|
38
40
|
self.reduce_func: Callable = reduce_func if reduce_func is not None else lambda x: x
|
|
41
|
+
self.cautious = cautious
|
|
39
42
|
|
|
40
43
|
defaults: DEFAULTS = {'lr': lr, 'betas': betas, 'keep_num': keep_num, 'eps': eps}
|
|
41
44
|
super().__init__(params, defaults)
|
|
@@ -101,13 +104,17 @@ class AdaShift(BaseOptimizer):
|
|
|
101
104
|
exp_avg = state['exp_avg']
|
|
102
105
|
exp_avg.sub_(offset_grad, alpha=first_grad_weight).mul_(beta1).add_(grad, alpha=last_grad_weight)
|
|
103
106
|
|
|
104
|
-
reduced_grad_sq = self.reduce_func(offset_grad.
|
|
107
|
+
reduced_grad_sq = self.reduce_func(offset_grad.pow_(2))
|
|
105
108
|
|
|
106
109
|
exp_avg_sq = state['exp_avg_sq']
|
|
107
110
|
exp_avg_sq.mul_(beta2).add_(reduced_grad_sq, alpha=1.0 - beta2)
|
|
108
111
|
|
|
109
|
-
|
|
112
|
+
update = exp_avg.clone()
|
|
113
|
+
if self.cautious:
|
|
114
|
+
self.apply_cautious(update, grad)
|
|
110
115
|
|
|
111
|
-
|
|
116
|
+
update.div_(exp_avg_sq.div(bias_correction).sqrt_().add_(group['eps']))
|
|
117
|
+
|
|
118
|
+
p.add_(update, alpha=-group['lr'])
|
|
112
119
|
|
|
113
120
|
return loss
|
|
@@ -146,10 +146,12 @@ class AdEMAMix(BaseOptimizer):
|
|
|
146
146
|
|
|
147
147
|
de_nom = exp_avg_sq.sqrt().div_(bias_correction2_sq).add_(group['eps'])
|
|
148
148
|
|
|
149
|
-
update =
|
|
149
|
+
update = exp_avg.clone()
|
|
150
150
|
if self.cautious:
|
|
151
151
|
self.apply_cautious(update, grad)
|
|
152
152
|
|
|
153
|
+
update.add_(exp_avg_slow, alpha=alpha_t).div_(de_nom)
|
|
154
|
+
|
|
153
155
|
p.add_(update, alpha=-step_size)
|
|
154
156
|
|
|
155
157
|
return loss
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from typing import Literal, Optional
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
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.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
10
|
+
from pytorch_optimizer.optimizer.galore_utils import GaLoreProjector
|
|
11
|
+
|
|
12
|
+
SCALE_TYPE = Literal['channel', 'tensor']
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ApolloDQN(BaseOptimizer):
|
|
16
|
+
r"""An Adaptive Parameter-wise Diagonal Quasi-Newton Method for Nonconvex Stochastic Optimization.
|
|
17
|
+
|
|
18
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
19
|
+
:param lr: float. learning rate.
|
|
20
|
+
:param init_lr: Optional[float]. initial learning rate (default lr / 1000).
|
|
21
|
+
:param beta: float. coefficient used for computing running averages of gradient.
|
|
22
|
+
:param rebound: str. rectified bound for diagonal hessian. (constant, belief).
|
|
23
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
24
|
+
:param weight_decay_type: str. type of weight decay. (l2, decoupled, stable).
|
|
25
|
+
:param warmup_steps: int. number of warmup steps.
|
|
26
|
+
:param eps: float. term added to the denominator to improve numerical stability.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
params: PARAMETERS,
|
|
32
|
+
lr: float = 1e-2,
|
|
33
|
+
init_lr: Optional[float] = 1e-5,
|
|
34
|
+
beta: float = 0.9,
|
|
35
|
+
rebound: str = 'constant',
|
|
36
|
+
weight_decay: float = 0.0,
|
|
37
|
+
weight_decay_type: str = 'l2',
|
|
38
|
+
warmup_steps: int = 500,
|
|
39
|
+
eps: float = 1e-4,
|
|
40
|
+
**kwargs,
|
|
41
|
+
):
|
|
42
|
+
self.validate_learning_rate(lr)
|
|
43
|
+
self.validate_range(beta, 'beta', 0.0, 1.0, range_type='[]')
|
|
44
|
+
self.validate_options(rebound, 'rebound', ['constant', 'belief'])
|
|
45
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
46
|
+
self.validate_options(weight_decay_type, 'weight_decay_type', ['l2', 'decoupled', 'stable'])
|
|
47
|
+
self.validate_non_negative(eps, 'eps')
|
|
48
|
+
|
|
49
|
+
self.lr = lr
|
|
50
|
+
self.warmup_steps = warmup_steps
|
|
51
|
+
self.init_lr: float = init_lr if init_lr is not None else lr / 1000.0
|
|
52
|
+
|
|
53
|
+
defaults: DEFAULTS = {
|
|
54
|
+
'lr': lr,
|
|
55
|
+
'init_lr': self.init_lr,
|
|
56
|
+
'beta': beta,
|
|
57
|
+
'rebound': rebound,
|
|
58
|
+
'weight_decay': weight_decay,
|
|
59
|
+
'weight_decay_type': weight_decay_type,
|
|
60
|
+
'eps': eps,
|
|
61
|
+
}
|
|
62
|
+
super().__init__(params, defaults)
|
|
63
|
+
|
|
64
|
+
def __str__(self) -> str:
|
|
65
|
+
return 'ApolloDQN'
|
|
66
|
+
|
|
67
|
+
@torch.no_grad()
|
|
68
|
+
def reset(self):
|
|
69
|
+
for group in self.param_groups:
|
|
70
|
+
group['step'] = 0
|
|
71
|
+
for p in group['params']:
|
|
72
|
+
state = self.state[p]
|
|
73
|
+
|
|
74
|
+
state['exp_avg_grad'] = torch.zeros_like(p)
|
|
75
|
+
state['approx_hessian'] = torch.zeros_like(p)
|
|
76
|
+
state['update'] = torch.zeros_like(p)
|
|
77
|
+
|
|
78
|
+
@torch.no_grad()
|
|
79
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
80
|
+
loss: LOSS = None
|
|
81
|
+
if closure is not None:
|
|
82
|
+
with torch.enable_grad():
|
|
83
|
+
loss = closure()
|
|
84
|
+
|
|
85
|
+
for group in self.param_groups:
|
|
86
|
+
if 'step' in group:
|
|
87
|
+
group['step'] += 1
|
|
88
|
+
else:
|
|
89
|
+
group['step'] = 1
|
|
90
|
+
|
|
91
|
+
current_lr: float = (
|
|
92
|
+
group['lr']
|
|
93
|
+
if group['step'] >= self.warmup_steps
|
|
94
|
+
else (self.lr - group['init_lr']) * group['step'] / self.warmup_steps + group['init_lr']
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
weight_decay, eps = group['weight_decay'], group['eps']
|
|
98
|
+
|
|
99
|
+
bias_correction: float = self.debias(group['beta'], group['step'])
|
|
100
|
+
alpha: float = (1.0 - group['beta']) / bias_correction
|
|
101
|
+
|
|
102
|
+
for p in group['params']:
|
|
103
|
+
if p.grad is None:
|
|
104
|
+
continue
|
|
105
|
+
|
|
106
|
+
grad = p.grad
|
|
107
|
+
if grad.is_sparse:
|
|
108
|
+
raise NoSparseGradientError(str(self))
|
|
109
|
+
|
|
110
|
+
state = self.state[p]
|
|
111
|
+
if len(state) == 0:
|
|
112
|
+
state['exp_avg_grad'] = torch.zeros_like(p)
|
|
113
|
+
state['approx_hessian'] = torch.zeros_like(p)
|
|
114
|
+
state['update'] = torch.zeros_like(p)
|
|
115
|
+
|
|
116
|
+
if weight_decay > 0.0 and group['weight_decay_type'] == 'l2':
|
|
117
|
+
grad.add_(p, alpha=weight_decay)
|
|
118
|
+
|
|
119
|
+
exp_avg_grad, b, d_p = state['exp_avg_grad'], state['approx_hessian'], state['update']
|
|
120
|
+
|
|
121
|
+
delta_grad = grad - exp_avg_grad
|
|
122
|
+
if group['rebound'] == 'belief':
|
|
123
|
+
rebound = delta_grad.norm(p=np.inf)
|
|
124
|
+
else:
|
|
125
|
+
rebound = 1e-2
|
|
126
|
+
eps /= rebound
|
|
127
|
+
|
|
128
|
+
exp_avg_grad.add_(delta_grad, alpha=alpha)
|
|
129
|
+
|
|
130
|
+
de_nom = d_p.norm(p=4).add_(eps)
|
|
131
|
+
d_p.div_(de_nom)
|
|
132
|
+
|
|
133
|
+
v_sq = d_p.mul(d_p)
|
|
134
|
+
delta = delta_grad.div_(de_nom).mul_(d_p).sum().mul(-alpha) - b.mul(v_sq).sum()
|
|
135
|
+
|
|
136
|
+
b.addcmul_(v_sq, delta)
|
|
137
|
+
|
|
138
|
+
de_nom = b.abs().clamp_(min=rebound)
|
|
139
|
+
if group['rebound'] == 'belief':
|
|
140
|
+
de_nom.add_(eps / alpha)
|
|
141
|
+
|
|
142
|
+
d_p.copy_(exp_avg_grad.div(de_nom))
|
|
143
|
+
|
|
144
|
+
if weight_decay > 0.0 and group['weight_decay_type'] != 'l2':
|
|
145
|
+
if group['weight_decay_type'] == 'stable':
|
|
146
|
+
weight_decay /= de_nom.mean().item()
|
|
147
|
+
|
|
148
|
+
d_p.add_(p, alpha=weight_decay)
|
|
149
|
+
|
|
150
|
+
p.add_(d_p, alpha=-current_lr)
|
|
151
|
+
|
|
152
|
+
return loss
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
class APOLLO(BaseOptimizer):
|
|
156
|
+
r"""SGD-like Memory, AdamW-level Performance.
|
|
157
|
+
|
|
158
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
159
|
+
:param lr: float. learning rate.
|
|
160
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
161
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
162
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
163
|
+
:param fixed_decay: bool. fix weight decay.
|
|
164
|
+
:param correct_bias: bool. Whether to correct bias in Adam.
|
|
165
|
+
:param eps: float. term added to the denominator to improve numerical stability.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
def __init__(
|
|
169
|
+
self,
|
|
170
|
+
params: PARAMETERS,
|
|
171
|
+
lr: float = 1e-2,
|
|
172
|
+
betas: BETAS = (0.9, 0.999),
|
|
173
|
+
scale_type: SCALE_TYPE = 'tensor',
|
|
174
|
+
weight_decay: float = 0.0,
|
|
175
|
+
weight_decouple: bool = True,
|
|
176
|
+
fixed_decay: bool = False,
|
|
177
|
+
correct_bias: bool = True,
|
|
178
|
+
eps: float = 1e-6,
|
|
179
|
+
**kwargs,
|
|
180
|
+
):
|
|
181
|
+
self.validate_learning_rate(lr)
|
|
182
|
+
self.validate_betas(betas)
|
|
183
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
184
|
+
self.validate_non_negative(eps, 'eps')
|
|
185
|
+
|
|
186
|
+
defaults: DEFAULTS = {
|
|
187
|
+
'lr': lr,
|
|
188
|
+
'betas': betas,
|
|
189
|
+
'scale_type': scale_type,
|
|
190
|
+
'weight_decay': weight_decay,
|
|
191
|
+
'weight_decouple': weight_decouple,
|
|
192
|
+
'fixed_decay': fixed_decay,
|
|
193
|
+
'correct_bias': correct_bias,
|
|
194
|
+
'eps': eps,
|
|
195
|
+
**kwargs,
|
|
196
|
+
}
|
|
197
|
+
super().__init__(params, defaults)
|
|
198
|
+
|
|
199
|
+
def __str__(self) -> str:
|
|
200
|
+
return 'APOLLO'
|
|
201
|
+
|
|
202
|
+
@torch.no_grad()
|
|
203
|
+
def reset(self):
|
|
204
|
+
for group in self.param_groups:
|
|
205
|
+
group['step'] = 0
|
|
206
|
+
for p in group['params']:
|
|
207
|
+
state = self.state[p]
|
|
208
|
+
|
|
209
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
210
|
+
state['exp_avg_sq'] = torch.zeros_like(p)
|
|
211
|
+
|
|
212
|
+
@torch.no_grad()
|
|
213
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
214
|
+
loss: LOSS = None
|
|
215
|
+
if closure is not None:
|
|
216
|
+
with torch.enable_grad():
|
|
217
|
+
loss = closure()
|
|
218
|
+
|
|
219
|
+
for group in self.param_groups:
|
|
220
|
+
if 'step' in group:
|
|
221
|
+
group['step'] += 1
|
|
222
|
+
else:
|
|
223
|
+
group['step'] = 1
|
|
224
|
+
|
|
225
|
+
beta1, beta2 = group['betas']
|
|
226
|
+
|
|
227
|
+
step_size: float = group['lr']
|
|
228
|
+
if group['correct_bias']:
|
|
229
|
+
bias_correction1: float = self.debias(beta1, group['step'])
|
|
230
|
+
bias_correction2_sq: float = math.sqrt(self.debias(beta2, group['step']))
|
|
231
|
+
step_size *= bias_correction2_sq / bias_correction1
|
|
232
|
+
|
|
233
|
+
for p in group['params']:
|
|
234
|
+
if p.grad is None:
|
|
235
|
+
continue
|
|
236
|
+
|
|
237
|
+
grad = p.grad
|
|
238
|
+
if grad.is_sparse:
|
|
239
|
+
raise NoSparseGradientError(str(self))
|
|
240
|
+
|
|
241
|
+
state = self.state[p]
|
|
242
|
+
if len(state) == 0:
|
|
243
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
244
|
+
state['exp_avg_sq'] = torch.zeros_like(p)
|
|
245
|
+
|
|
246
|
+
if 'rank' in group and p.dim() > 1:
|
|
247
|
+
if 'projector' not in state:
|
|
248
|
+
state['projector'] = GaLoreProjector(
|
|
249
|
+
rank=group['rank'],
|
|
250
|
+
update_proj_gap=group['update_proj_gap'],
|
|
251
|
+
scale=group['scale'],
|
|
252
|
+
projection_type=group['projection_type'],
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
grad = state['projector'].project(grad, group['step'], from_random_matrix=True)
|
|
256
|
+
|
|
257
|
+
exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']
|
|
258
|
+
exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
|
|
259
|
+
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
|
|
260
|
+
|
|
261
|
+
de_nom = exp_avg_sq.sqrt().add_(group['eps'])
|
|
262
|
+
|
|
263
|
+
norm_grad = exp_avg / de_nom
|
|
264
|
+
if 'rank' in group and p.dim() > 1:
|
|
265
|
+
if group['scale_type'] == 'channel':
|
|
266
|
+
norm_dim: int = 0 if norm_grad.shape[0] < norm_grad.shape[1] else 1
|
|
267
|
+
scaling_factor = torch.norm(norm_grad, dim=norm_dim) / (torch.norm(grad, dim=norm_dim) + 1e-8)
|
|
268
|
+
if norm_dim == 1:
|
|
269
|
+
scaling_factor = scaling_factor.unsqueeze(1)
|
|
270
|
+
else:
|
|
271
|
+
scaling_factor = torch.norm(norm_grad) / (torch.norm(grad) + 1e-8)
|
|
272
|
+
|
|
273
|
+
scaling_grad = grad * scaling_factor
|
|
274
|
+
|
|
275
|
+
scaling_grad_norm = torch.norm(scaling_grad)
|
|
276
|
+
if 'scaling_grad' in state:
|
|
277
|
+
limiter = (
|
|
278
|
+
max(
|
|
279
|
+
scaling_grad_norm / (state['scaling_grad'] + 1e-8),
|
|
280
|
+
1.01,
|
|
281
|
+
)
|
|
282
|
+
/ 1.01
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
scaling_grad.div_(limiter)
|
|
286
|
+
scaling_grad_norm.div_(limiter)
|
|
287
|
+
|
|
288
|
+
state['scaling_grad'] = scaling_grad_norm
|
|
289
|
+
|
|
290
|
+
norm_grad = scaling_grad * np.sqrt(group['scale'])
|
|
291
|
+
norm_grad = state['projector'].project_back(norm_grad)
|
|
292
|
+
|
|
293
|
+
p.add_(norm_grad, alpha=-step_size)
|
|
294
|
+
|
|
295
|
+
self.apply_weight_decay(
|
|
296
|
+
p,
|
|
297
|
+
grad,
|
|
298
|
+
lr=step_size,
|
|
299
|
+
weight_decay=group['weight_decay'],
|
|
300
|
+
weight_decouple=group['weight_decouple'],
|
|
301
|
+
fixed_decay=group['fixed_decay'],
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
return loss
|