pytorch-optimizer 3.3.0__tar.gz → 3.3.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.3.0 → pytorch_optimizer-3.3.1}/PKG-INFO +9 -7
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/README.md +7 -5
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pyproject.toml +9 -9
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/__init__.py +3 -1
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/__init__.py +5 -2
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/a2grad.py +4 -2
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adamg.py +4 -4
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adashift.py +9 -3
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/ademamix.py +3 -2
- pytorch_optimizer-3.3.1/pytorch_optimizer/optimizer/apollo.py +304 -0
- pytorch_optimizer-3.3.1/pytorch_optimizer/optimizer/galore.py +124 -0
- pytorch_optimizer-3.3.0/pytorch_optimizer/optimizer/galore.py → pytorch_optimizer-3.3.1/pytorch_optimizer/optimizer/galore_utils.py +44 -143
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/lookahead.py +4 -4
- pytorch_optimizer-3.3.1/pytorch_optimizer/optimizer/mars.py +252 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/muon.py +2 -39
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/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.1}/LICENSE +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/base/optimizer.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/base/types.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/bi_tempered.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/cross_entropy.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/dice.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/f1.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/focal.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/jaccard.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/ldam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/lovasz.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/loss/tversky.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adabelief.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adafactor.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adahessian.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adai.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adalite.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adamp.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adamw.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adan.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/adopt.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/aida.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/amos.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/came.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/dadapt.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/demo.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/fadam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/ftrl.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/gc.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/grokfast.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/kate.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/laprop.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/lion.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/lomo.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/padam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/prodigy.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/ranger.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/ranger21.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/rotograd.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/sgd.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/sgdp.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/shampoo.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/soap.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/sophia.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/tiger.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/trac.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/pytorch_optimizer/optimizer/utils.py +0 -0
- {pytorch_optimizer-3.3.0 → pytorch_optimizer-3.3.1}/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.1
|
|
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, **85 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,8 @@ 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) |
|
|
236
238
|
|
|
237
239
|
## Supported LR Scheduler
|
|
238
240
|
|
|
@@ -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, **85 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,8 @@ 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) |
|
|
195
197
|
|
|
196
198
|
## Supported LR Scheduler
|
|
197
199
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "3.3.
|
|
3
|
+
version = "3.3.1"
|
|
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,
|
|
@@ -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
|
|
@@ -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,7 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
278
280
|
Muon,
|
|
279
281
|
ScheduleFreeRAdam,
|
|
280
282
|
LaProp,
|
|
283
|
+
MARS,
|
|
281
284
|
]
|
|
282
285
|
OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
|
|
283
286
|
|
|
@@ -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,16 @@ 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
|
+
update.div_(exp_avg_sq.div(bias_correction).sqrt_().add_(group['eps']))
|
|
114
|
+
if self.cautious:
|
|
115
|
+
self.apply_cautious(update, grad)
|
|
110
116
|
|
|
111
|
-
p.
|
|
117
|
+
p.add_(update, alpha=-group['lr'])
|
|
112
118
|
|
|
113
119
|
return loss
|
|
@@ -146,9 +146,10 @@ class AdEMAMix(BaseOptimizer):
|
|
|
146
146
|
|
|
147
147
|
de_nom = exp_avg_sq.sqrt().div_(bias_correction2_sq).add_(group['eps'])
|
|
148
148
|
|
|
149
|
-
update = (exp_avg + alpha_t * exp_avg_slow).div_(de_nom)
|
|
150
149
|
if self.cautious:
|
|
151
|
-
self.apply_cautious(
|
|
150
|
+
self.apply_cautious(exp_avg, grad)
|
|
151
|
+
|
|
152
|
+
update = (exp_avg + alpha_t * exp_avg_slow).div_(de_nom)
|
|
152
153
|
|
|
153
154
|
p.add_(update, alpha=-step_size)
|
|
154
155
|
|
|
@@ -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
|