pytorch-optimizer 3.0.2__tar.gz → 3.1.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.0.2 → pytorch_optimizer-3.1.1}/PKG-INFO +15 -7
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/README.md +13 -5
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pyproject.toml +15 -13
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/__init__.py +61 -16
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/optimizer.py +54 -10
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/a2grad.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adabelief.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adabound.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adadelta.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adafactor.py +1 -18
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adahessian.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adai.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adalite.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adam_mini.py +15 -21
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adamax.py +2 -3
- pytorch_optimizer-3.1.1/pytorch_optimizer/optimizer/adamg.py +127 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adamod.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adamp.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adams.py +4 -5
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adamw.py +3 -5
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adan.py +5 -6
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adanorm.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adapnm.py +4 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adashift.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adasmooth.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/aggmo.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/aida.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/alig.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/amos.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/apollo.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/avagrad.py +4 -5
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/came.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/dadapt.py +6 -7
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/diffgrad.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/fadam.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/fromage.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/galore.py +3 -4
- pytorch_optimizer-3.1.1/pytorch_optimizer/optimizer/gc.py +12 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/gravity.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/grokfast.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/kate.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/lamb.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/lars.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/lion.py +1 -2
- pytorch_optimizer-3.1.1/pytorch_optimizer/optimizer/lomo.py +465 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/lookahead.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/madgrad.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/msvag.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/nero.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/novograd.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/padam.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/pid.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/pnm.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/prodigy.py +5 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/qhadam.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/qhm.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/radam.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/ranger.py +3 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/ranger21.py +15 -10
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/rotograd.py +9 -8
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sam.py +4 -5
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/schedulefree.py +2 -3
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sgd.py +4 -5
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sgdp.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/shampoo.py +11 -10
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/shampoo_utils.py +34 -34
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sm3.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sophia.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/srmm.py +1 -2
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/swats.py +3 -4
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/tiger.py +1 -2
- pytorch_optimizer-3.1.1/pytorch_optimizer/optimizer/trac.py +251 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/utils.py +35 -18
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/yogi.py +3 -4
- pytorch_optimizer-3.0.2/pytorch_optimizer/optimizer/gc.py +0 -12
- pytorch_optimizer-3.0.2/pytorch_optimizer/optimizer/lomo.py +0 -201
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/LICENSE +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/types.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/bi_tempered.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/cross_entropy.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/dice.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/f1.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/focal.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/jaccard.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/ldam.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/lovasz.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/tversky.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/__init__.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pytorch_optimizer
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.1.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,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdaHessian,Adai,Adalite,AdamMini,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DiffGrad,FAdam,Fromage,GaLore,Gravity,GrokFast,GSAM,Kate,Lamb,LARS,Lion,LOMO,Lookahead,MADGRAD,MSVAG,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SopihaH,SRMM,StableAdamW,SWATS,Tiger,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes,WSD
|
|
7
|
+
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdamG,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdaHessian,Adai,Adalite,AdaLomo,AdamMini,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DiffGrad,FAdam,Fromage,GaLore,Gravity,GrokFast,GSAM,Kate,Lamb,LARS,Lion,LOMO,Lookahead,MADGRAD,MSVAG,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,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
|
|
@@ -49,7 +49,7 @@ Description-Content-Type: text/markdown
|
|
|
49
49
|
|
|
50
50
|
**pytorch-optimizer** is optimizer & lr scheduler collections in PyTorch.
|
|
51
51
|
I just re-implemented (speed & memory tweaks, plug-ins) the algorithm while based on the original paper. Also, It includes useful and practical optimization ideas.
|
|
52
|
-
Currently, **
|
|
52
|
+
Currently, **75 optimizers (+ `bitsandbytes`, `qgalore`)**, **16 lr schedulers**, and **13 loss functions** are supported!
|
|
53
53
|
|
|
54
54
|
Highly inspired by [pytorch-optimizer](https://github.com/jettify/pytorch-optimizer).
|
|
55
55
|
|
|
@@ -66,8 +66,9 @@ So, please double-check the license before using it at your work.
|
|
|
66
66
|
$ pip3 install pytorch-optimizer
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
-
From `v2.12.0`, you can
|
|
70
|
-
please check [the requirements](https://github.com/TimDettmers/bitsandbytes?tab=readme-ov-file#tldr)
|
|
69
|
+
From `v2.12.0`, `v3.1.0`, you can use `bitsandbytes`, `q-galore-torch` optimizers respectively!
|
|
70
|
+
please check [the bnb requirements](https://github.com/TimDettmers/bitsandbytes?tab=readme-ov-file#tldr), [q-galore-torch installation](https://github.com/VITA-Group/Q-GaLore?tab=readme-ov-file#install-q-galore-optimizer)
|
|
71
|
+
before installing it.
|
|
71
72
|
|
|
72
73
|
From `v3.0.0`, drop `Python 3.7` support. However, you can still use this package with `Python 3.7` by installing with `--ignore-requires-python` option.
|
|
73
74
|
|
|
@@ -195,6 +196,7 @@ supported_optimizers = get_supported_optimizers()
|
|
|
195
196
|
| Prodigy | *An Expeditiously Adaptive Parameter-Free Learner* | [github](https://github.com/konstmish/prodigy) | <https://arxiv.org/abs/2306.06101> | [cite](https://github.com/konstmish/prodigy#how-to-cite) |
|
|
196
197
|
| PAdam | *Closing the Generalization Gap of Adaptive Gradient Methods in Training Deep Neural Networks* | [github](https://github.com/uclaml/Padam) | <https://arxiv.org/abs/1806.06763> | [cite](https://github.com/uclaml/Padam#citation) |
|
|
197
198
|
| LOMO | *Full Parameter Fine-tuning for Large Language Models with Limited Resources* | [github](https://github.com/OpenLMLab/LOMO) | <https://arxiv.org/abs/2306.09782> | [cite](https://github.com/OpenLMLab/LOMO#citation) |
|
|
199
|
+
| AdaLOMO | *Low-memory Optimization with Adaptive Learning Rate* | [github](https://github.com/OpenLMLab/LOMO) | <https://arxiv.org/abs/2310.10195> | [cite](https://github.com/OpenLMLab/LOMO#citation) |
|
|
198
200
|
| Tiger | *A Tight-fisted Optimizer, an optimizer that is extremely budget-conscious* | [github](https://github.com/bojone/tiger) | | [cite](https://github.com/bojone/tiger/blob/main/README_en.md#citation) |
|
|
199
201
|
| CAME | *Confidence-guided Adaptive Memory Efficient Optimization* | [github](https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/CAME) | <https://aclanthology.org/2023.acl-long.243/> | [cite](https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/CAME#citation) |
|
|
200
202
|
| WSAM | *Sharpness-Aware Minimization Revisited: Weighted Sharpness as a Regularization Term* | [github](https://github.com/intelligent-machine-learning/dlrover/blob/master/atorch/atorch/optimizers/wsam.py) | <https://arxiv.org/abs/2305.15817> | [cite](https://github.com/intelligent-machine-learning/dlrover) |
|
|
@@ -208,6 +210,8 @@ supported_optimizers = get_supported_optimizers()
|
|
|
208
210
|
| Kate | *Remove that Square Root: A New Efficient Scale-Invariant Version of AdaGrad* | [github](https://github.com/nazya/KATE) | <https://arxiv.org/abs/2403.02648> | [cite](https://github.com/nazya/KATE?tab=readme-ov-file#remove-that-square-root-a-new-efficient-scale-invariant-version-of-adagrad) |
|
|
209
211
|
| StableAdamW | *Stable and low-precision training for large-scale vision-language models* | | <https://arxiv.org/abs/2304.13013> | [cite](https://ui.adsabs.harvard.edu/abs/2023arXiv230413013W/exportcitation) |
|
|
210
212
|
| AdamMini | *Use Fewer Learning Rates To Gain More* | [github](https://github.com/zyushun/Adam-mini) | <https://arxiv.org/abs/2406.16793> | [cite](https://github.com/zyushun/Adam-mini?tab=readme-ov-file#citation) |
|
|
213
|
+
| TRAC | *Adaptive Parameter-free Optimization* | [github](https://github.com/ComputationalRobotics/TRAC) | <https://arxiv.org/abs/2405.16642> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240516642M/exportcitation) |
|
|
214
|
+
| AdamG | *Towards Stability of Parameter-free Optimization* | | <https://arxiv.org/abs/2405.04376> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240504376P/exportcitation) |
|
|
211
215
|
|
|
212
216
|
## Supported LR Scheduler
|
|
213
217
|
|
|
@@ -357,7 +361,11 @@ Correcting the norm of a gradient in each iteration based on the adaptive traini
|
|
|
357
361
|
|
|
358
362
|
## Frequently asked questions
|
|
359
363
|
|
|
360
|
-
[here](
|
|
364
|
+
[here](docs/qa.md)
|
|
365
|
+
|
|
366
|
+
## Visualization
|
|
367
|
+
|
|
368
|
+
[here](docs/visualization.md)
|
|
361
369
|
|
|
362
370
|
## Citation
|
|
363
371
|
|
|
@@ -369,7 +377,7 @@ If you use this software, please cite it below. Or you can get it from "cite thi
|
|
|
369
377
|
month = jan,
|
|
370
378
|
title = {{pytorch_optimizer: optimizer & lr scheduler & loss function collections in PyTorch}},
|
|
371
379
|
url = {https://github.com/kozistr/pytorch_optimizer},
|
|
372
|
-
version = {3.0
|
|
380
|
+
version = {3.1.0},
|
|
373
381
|
year = {2021}
|
|
374
382
|
}
|
|
375
383
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
**pytorch-optimizer** is optimizer & lr scheduler collections in PyTorch.
|
|
12
12
|
I just re-implemented (speed & memory tweaks, plug-ins) the algorithm while based on the original paper. Also, It includes useful and practical optimization ideas.
|
|
13
|
-
Currently, **
|
|
13
|
+
Currently, **75 optimizers (+ `bitsandbytes`, `qgalore`)**, **16 lr schedulers**, and **13 loss functions** are supported!
|
|
14
14
|
|
|
15
15
|
Highly inspired by [pytorch-optimizer](https://github.com/jettify/pytorch-optimizer).
|
|
16
16
|
|
|
@@ -27,8 +27,9 @@ So, please double-check the license before using it at your work.
|
|
|
27
27
|
$ pip3 install pytorch-optimizer
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
From `v2.12.0`, you can
|
|
31
|
-
please check [the requirements](https://github.com/TimDettmers/bitsandbytes?tab=readme-ov-file#tldr)
|
|
30
|
+
From `v2.12.0`, `v3.1.0`, you can use `bitsandbytes`, `q-galore-torch` optimizers respectively!
|
|
31
|
+
please check [the bnb requirements](https://github.com/TimDettmers/bitsandbytes?tab=readme-ov-file#tldr), [q-galore-torch installation](https://github.com/VITA-Group/Q-GaLore?tab=readme-ov-file#install-q-galore-optimizer)
|
|
32
|
+
before installing it.
|
|
32
33
|
|
|
33
34
|
From `v3.0.0`, drop `Python 3.7` support. However, you can still use this package with `Python 3.7` by installing with `--ignore-requires-python` option.
|
|
34
35
|
|
|
@@ -156,6 +157,7 @@ supported_optimizers = get_supported_optimizers()
|
|
|
156
157
|
| Prodigy | *An Expeditiously Adaptive Parameter-Free Learner* | [github](https://github.com/konstmish/prodigy) | <https://arxiv.org/abs/2306.06101> | [cite](https://github.com/konstmish/prodigy#how-to-cite) |
|
|
157
158
|
| PAdam | *Closing the Generalization Gap of Adaptive Gradient Methods in Training Deep Neural Networks* | [github](https://github.com/uclaml/Padam) | <https://arxiv.org/abs/1806.06763> | [cite](https://github.com/uclaml/Padam#citation) |
|
|
158
159
|
| LOMO | *Full Parameter Fine-tuning for Large Language Models with Limited Resources* | [github](https://github.com/OpenLMLab/LOMO) | <https://arxiv.org/abs/2306.09782> | [cite](https://github.com/OpenLMLab/LOMO#citation) |
|
|
160
|
+
| AdaLOMO | *Low-memory Optimization with Adaptive Learning Rate* | [github](https://github.com/OpenLMLab/LOMO) | <https://arxiv.org/abs/2310.10195> | [cite](https://github.com/OpenLMLab/LOMO#citation) |
|
|
159
161
|
| Tiger | *A Tight-fisted Optimizer, an optimizer that is extremely budget-conscious* | [github](https://github.com/bojone/tiger) | | [cite](https://github.com/bojone/tiger/blob/main/README_en.md#citation) |
|
|
160
162
|
| CAME | *Confidence-guided Adaptive Memory Efficient Optimization* | [github](https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/CAME) | <https://aclanthology.org/2023.acl-long.243/> | [cite](https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/CAME#citation) |
|
|
161
163
|
| WSAM | *Sharpness-Aware Minimization Revisited: Weighted Sharpness as a Regularization Term* | [github](https://github.com/intelligent-machine-learning/dlrover/blob/master/atorch/atorch/optimizers/wsam.py) | <https://arxiv.org/abs/2305.15817> | [cite](https://github.com/intelligent-machine-learning/dlrover) |
|
|
@@ -169,6 +171,8 @@ supported_optimizers = get_supported_optimizers()
|
|
|
169
171
|
| Kate | *Remove that Square Root: A New Efficient Scale-Invariant Version of AdaGrad* | [github](https://github.com/nazya/KATE) | <https://arxiv.org/abs/2403.02648> | [cite](https://github.com/nazya/KATE?tab=readme-ov-file#remove-that-square-root-a-new-efficient-scale-invariant-version-of-adagrad) |
|
|
170
172
|
| StableAdamW | *Stable and low-precision training for large-scale vision-language models* | | <https://arxiv.org/abs/2304.13013> | [cite](https://ui.adsabs.harvard.edu/abs/2023arXiv230413013W/exportcitation) |
|
|
171
173
|
| AdamMini | *Use Fewer Learning Rates To Gain More* | [github](https://github.com/zyushun/Adam-mini) | <https://arxiv.org/abs/2406.16793> | [cite](https://github.com/zyushun/Adam-mini?tab=readme-ov-file#citation) |
|
|
174
|
+
| TRAC | *Adaptive Parameter-free Optimization* | [github](https://github.com/ComputationalRobotics/TRAC) | <https://arxiv.org/abs/2405.16642> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240516642M/exportcitation) |
|
|
175
|
+
| AdamG | *Towards Stability of Parameter-free Optimization* | | <https://arxiv.org/abs/2405.04376> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240504376P/exportcitation) |
|
|
172
176
|
|
|
173
177
|
## Supported LR Scheduler
|
|
174
178
|
|
|
@@ -318,7 +322,11 @@ Correcting the norm of a gradient in each iteration based on the adaptive traini
|
|
|
318
322
|
|
|
319
323
|
## Frequently asked questions
|
|
320
324
|
|
|
321
|
-
[here](
|
|
325
|
+
[here](docs/qa.md)
|
|
326
|
+
|
|
327
|
+
## Visualization
|
|
328
|
+
|
|
329
|
+
[here](docs/visualization.md)
|
|
322
330
|
|
|
323
331
|
## Citation
|
|
324
332
|
|
|
@@ -330,7 +338,7 @@ If you use this software, please cite it below. Or you can get it from "cite thi
|
|
|
330
338
|
month = jan,
|
|
331
339
|
title = {{pytorch_optimizer: optimizer & lr scheduler & loss function collections in PyTorch}},
|
|
332
340
|
url = {https://github.com/kozistr/pytorch_optimizer},
|
|
333
|
-
version = {3.0
|
|
341
|
+
version = {3.1.0},
|
|
334
342
|
year = {2021}
|
|
335
343
|
}
|
|
336
344
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "3.
|
|
3
|
+
version = "3.1.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>"]
|
|
@@ -11,14 +11,15 @@ repository = "https://github.com/kozistr/pytorch_optimizer"
|
|
|
11
11
|
documentation = "https://pytorch-optimizers.readthedocs.io/en/latest"
|
|
12
12
|
keywords = [
|
|
13
13
|
"pytorch", "deep-learning", "optimizer", "lr scheduler", "A2Grad", "ASGD", "AccSGD", "AdaBelief", "AdaBound",
|
|
14
|
-
"AdaDelta", "AdaFactor", "AdaMax", "AdaMod", "AdaNorm", "AdaPNM", "AdaSmooth", "AdaHessian", "Adai",
|
|
15
|
-
"AdamMini", "AdamP", "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos", "Apollo", "AvaGrad",
|
|
16
|
-
"
|
|
17
|
-
"Gravity", "GrokFast", "GSAM", "Kate", "Lamb", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD",
|
|
18
|
-
"NovoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger",
|
|
19
|
-
"
|
|
20
|
-
"SopihaH", "SRMM", "StableAdamW", "SWATS", "Tiger", "WSAM", "Yogi", "BCE", "BCEFocal",
|
|
21
|
-
"SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky",
|
|
14
|
+
"AdaDelta", "AdaFactor", "AdaMax", "AdamG", "AdaMod", "AdaNorm", "AdaPNM", "AdaSmooth", "AdaHessian", "Adai",
|
|
15
|
+
"Adalite", "AdaLomo", "AdamMini", "AdamP", "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos", "Apollo", "AvaGrad",
|
|
16
|
+
"bSAM", "CAME", "DAdaptAdaGrad", "DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DiffGrad", "FAdam",
|
|
17
|
+
"Fromage", "GaLore", "Gravity", "GrokFast", "GSAM", "Kate", "Lamb", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD",
|
|
18
|
+
"MSVAG", "Nero", "NovoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger",
|
|
19
|
+
"Ranger21", "RotoGrad", "SAM", "ScheduleFreeSGD", "ScheduleFreeAdamW", "SGDP", "Shampoo", "ScalableShampoo", "SGDW",
|
|
20
|
+
"SignSGD", "SM3", "SopihaH", "SRMM", "StableAdamW", "SWATS", "Tiger", "TRAC", "WSAM", "Yogi", "BCE", "BCEFocal",
|
|
21
|
+
"Focal", "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky",
|
|
22
|
+
"LovaszHinge", "bitsandbytes", "WSD", "QGaLore",
|
|
22
23
|
]
|
|
23
24
|
classifiers = [
|
|
24
25
|
"License :: OSI Approved :: Apache Software License",
|
|
@@ -74,6 +75,10 @@ lint.ignore = [
|
|
|
74
75
|
]
|
|
75
76
|
lint.fixable = ["ALL"]
|
|
76
77
|
lint.unfixable = ["F401"]
|
|
78
|
+
lint.dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
|
79
|
+
lint.flake8-quotes.docstring-quotes = "double"
|
|
80
|
+
lint.flake8-quotes.inline-quotes = "single"
|
|
81
|
+
lint.pylint.max-args = 7
|
|
77
82
|
exclude = [
|
|
78
83
|
".git",
|
|
79
84
|
".github",
|
|
@@ -88,11 +93,7 @@ exclude = [
|
|
|
88
93
|
"__pypackages__",
|
|
89
94
|
]
|
|
90
95
|
line-length = 119
|
|
91
|
-
lint.dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
|
92
96
|
target-version = "py311"
|
|
93
|
-
lint.flake8-quotes.docstring-quotes = "double"
|
|
94
|
-
lint.flake8-quotes.inline-quotes = "single"
|
|
95
|
-
lint.pylint.max-args = 7
|
|
96
97
|
|
|
97
98
|
[tool.ruff.format]
|
|
98
99
|
quote-style = "single"
|
|
@@ -101,6 +102,7 @@ quote-style = "single"
|
|
|
101
102
|
"./pytorch_optimizer/__init__.py" = ["F401"]
|
|
102
103
|
"./pytorch_optimizer/lr_scheduler/__init__.py" = ["F401"]
|
|
103
104
|
"./hubconf.py" = ["D", "INP001"]
|
|
105
|
+
"./examples/visualize_optimizers.py" = ["D103", "D400", "D415"]
|
|
104
106
|
"./tests/__init__.py" = ["D"]
|
|
105
107
|
"./tests/constants.py" = ["D"]
|
|
106
108
|
"./tests/utils.py" = ["D"]
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# ruff: noqa
|
|
2
|
+
from importlib.util import find_spec
|
|
2
3
|
from typing import Dict, List
|
|
3
4
|
|
|
4
5
|
import torch.cuda
|
|
5
6
|
from torch import nn
|
|
7
|
+
from torch.optim import AdamW
|
|
6
8
|
|
|
7
9
|
from pytorch_optimizer.base.types import OPTIMIZER, PARAMETERS, SCHEDULER
|
|
8
10
|
from pytorch_optimizer.loss.bi_tempered import BinaryBiTemperedLogisticLoss, BiTemperedLogisticLoss
|
|
@@ -42,6 +44,7 @@ from pytorch_optimizer.optimizer.adai import Adai
|
|
|
42
44
|
from pytorch_optimizer.optimizer.adalite import Adalite
|
|
43
45
|
from pytorch_optimizer.optimizer.adam_mini import AdamMini
|
|
44
46
|
from pytorch_optimizer.optimizer.adamax import AdaMax
|
|
47
|
+
from pytorch_optimizer.optimizer.adamg import AdamG
|
|
45
48
|
from pytorch_optimizer.optimizer.adamod import AdaMod
|
|
46
49
|
from pytorch_optimizer.optimizer.adamp import AdamP
|
|
47
50
|
from pytorch_optimizer.optimizer.adams import AdamS
|
|
@@ -72,7 +75,7 @@ from pytorch_optimizer.optimizer.kate import Kate
|
|
|
72
75
|
from pytorch_optimizer.optimizer.lamb import Lamb
|
|
73
76
|
from pytorch_optimizer.optimizer.lars import LARS
|
|
74
77
|
from pytorch_optimizer.optimizer.lion import Lion
|
|
75
|
-
from pytorch_optimizer.optimizer.lomo import LOMO
|
|
78
|
+
from pytorch_optimizer.optimizer.lomo import LOMO, AdaLOMO
|
|
76
79
|
from pytorch_optimizer.optimizer.lookahead import Lookahead
|
|
77
80
|
from pytorch_optimizer.optimizer.madgrad import MADGRAD
|
|
78
81
|
from pytorch_optimizer.optimizer.msvag import MSVAG
|
|
@@ -114,6 +117,7 @@ from pytorch_optimizer.optimizer.sophia import SophiaH
|
|
|
114
117
|
from pytorch_optimizer.optimizer.srmm import SRMM
|
|
115
118
|
from pytorch_optimizer.optimizer.swats import SWATS
|
|
116
119
|
from pytorch_optimizer.optimizer.tiger import Tiger
|
|
120
|
+
from pytorch_optimizer.optimizer.trac import TRAC
|
|
117
121
|
from pytorch_optimizer.optimizer.utils import (
|
|
118
122
|
clip_grad_norm,
|
|
119
123
|
disable_running_stats,
|
|
@@ -126,14 +130,11 @@ from pytorch_optimizer.optimizer.utils import (
|
|
|
126
130
|
)
|
|
127
131
|
from pytorch_optimizer.optimizer.yogi import Yogi
|
|
128
132
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
HAS_BNB: bool = True # pragma: no cover
|
|
133
|
-
except ImportError:
|
|
134
|
-
HAS_BNB: bool = False
|
|
133
|
+
HAS_BNB: bool = find_spec('bitsandbytes') is not None
|
|
134
|
+
HAS_Q_GALORE: bool = find_spec('q-galore-torch') is not None
|
|
135
135
|
|
|
136
136
|
OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
137
|
+
AdamW,
|
|
137
138
|
AdaBelief,
|
|
138
139
|
AdaBound,
|
|
139
140
|
PID,
|
|
@@ -205,6 +206,8 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
205
206
|
Kate,
|
|
206
207
|
StableAdamW,
|
|
207
208
|
AdamMini,
|
|
209
|
+
AdaLOMO,
|
|
210
|
+
AdamG,
|
|
208
211
|
]
|
|
209
212
|
OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
|
|
210
213
|
|
|
@@ -252,22 +255,58 @@ LOSS_FUNCTIONS: Dict[str, nn.Module] = {
|
|
|
252
255
|
|
|
253
256
|
def load_bnb_optimizer(optimizer: str) -> OPTIMIZER: # pragma: no cover
|
|
254
257
|
r"""load bnb optimizer instance."""
|
|
258
|
+
from bitsandbytes import optim
|
|
259
|
+
|
|
255
260
|
if 'sgd8bit' in optimizer:
|
|
256
|
-
return
|
|
261
|
+
return optim.SGD8bit
|
|
257
262
|
if 'adam8bit' in optimizer:
|
|
258
|
-
return
|
|
263
|
+
return optim.Adam8bit
|
|
264
|
+
if 'paged_adam8bit' in optimizer:
|
|
265
|
+
return optim.PagedAdam8bit
|
|
259
266
|
if 'adamw8bit' in optimizer:
|
|
260
|
-
return
|
|
267
|
+
return optim.AdamW8bit
|
|
268
|
+
if 'paged_adamw8bit' in optimizer:
|
|
269
|
+
return optim.PagedAdamW8bit
|
|
261
270
|
if 'lamb8bit' in optimizer:
|
|
262
|
-
return
|
|
271
|
+
return optim.LAMB8bit
|
|
263
272
|
if 'lars8bit' in optimizer:
|
|
264
|
-
return
|
|
273
|
+
return optim.LARS8bit
|
|
265
274
|
if 'lion8bit' in optimizer:
|
|
266
|
-
return
|
|
275
|
+
return optim.Lion8bit
|
|
267
276
|
if 'adagrad8bit' in optimizer:
|
|
268
|
-
return
|
|
277
|
+
return optim.Adagrad8bit
|
|
269
278
|
if 'rmsprop8bit' in optimizer:
|
|
270
|
-
return
|
|
279
|
+
return optim.RMSprop8bit
|
|
280
|
+
if 'adagrad32bit' in optimizer:
|
|
281
|
+
return optim.Adagrad32bit
|
|
282
|
+
if 'adam32bit' in optimizer:
|
|
283
|
+
return optim.Adam32bit
|
|
284
|
+
if 'paged_adam32bit' in optimizer:
|
|
285
|
+
return optim.PagedAdam32bit
|
|
286
|
+
if 'adamw32bit' in optimizer:
|
|
287
|
+
return optim.AdamW32bit
|
|
288
|
+
if 'lamb32bit' in optimizer:
|
|
289
|
+
return optim.LAMB32bit
|
|
290
|
+
if 'lars32bit' in optimizer:
|
|
291
|
+
return optim.LARS32bit
|
|
292
|
+
if 'lion32bit' in optimizer:
|
|
293
|
+
return optim.Lion32bit
|
|
294
|
+
if 'paged_lion32bit' in optimizer:
|
|
295
|
+
return optim.PagedLion32bit
|
|
296
|
+
if 'rmsprop32bit' in optimizer:
|
|
297
|
+
return optim.RMSprop32bit
|
|
298
|
+
if 'sgd32bit' in optimizer:
|
|
299
|
+
return optim.SGD32bit
|
|
300
|
+
raise NotImplementedError(f'[-] not implemented optimizer : {optimizer}')
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def load_q_galore_optimizer(optimizer: str) -> OPTIMIZER: # pragma: no cover
|
|
304
|
+
r"""load Q-GaLore optimizer instance."""
|
|
305
|
+
import q_galore_torch
|
|
306
|
+
|
|
307
|
+
if 'adamw8bit' in optimizer:
|
|
308
|
+
return q_galore_torch.QGaLoreAdamW8bit
|
|
309
|
+
|
|
271
310
|
raise NotImplementedError(f'[-] not implemented optimizer : {optimizer}')
|
|
272
311
|
|
|
273
312
|
|
|
@@ -277,7 +316,11 @@ def load_optimizer(optimizer: str) -> OPTIMIZER:
|
|
|
277
316
|
if optimizer.startswith('bnb'):
|
|
278
317
|
if HAS_BNB and torch.cuda.is_available():
|
|
279
318
|
return load_bnb_optimizer(optimizer) # pragma: no cover
|
|
280
|
-
raise ImportError(f'[-] bitsandbytes and CUDA required for
|
|
319
|
+
raise ImportError(f'[-] bitsandbytes and CUDA required for the optimizer {optimizer}')
|
|
320
|
+
if optimizer.startswith('q_galore'):
|
|
321
|
+
if HAS_Q_GALORE and torch.cuda.is_available():
|
|
322
|
+
return load_q_galore_optimizer(optimizer) # pragma: no cover
|
|
323
|
+
raise ImportError(f'[-] bitsandbytes, q-galore-torch, and CUDA required for the optimizer {optimizer}')
|
|
281
324
|
if optimizer not in OPTIMIZERS:
|
|
282
325
|
raise NotImplementedError(f'[-] not implemented optimizer : {optimizer}')
|
|
283
326
|
|
|
@@ -312,6 +355,8 @@ def create_optimizer(
|
|
|
312
355
|
|
|
313
356
|
if optimizer_name == 'alig':
|
|
314
357
|
optimizer = optimizer(parameters, max_lr=lr, **kwargs)
|
|
358
|
+
elif optimizer_name in {'lomo', 'adalomo', 'adammini'}:
|
|
359
|
+
optimizer = optimizer(model, lr=lr, **kwargs)
|
|
315
360
|
else:
|
|
316
361
|
optimizer = optimizer(parameters, lr=lr, **kwargs)
|
|
317
362
|
|
|
@@ -3,17 +3,21 @@ from abc import ABC, abstractmethod
|
|
|
3
3
|
from typing import List, Optional, Tuple, Union
|
|
4
4
|
|
|
5
5
|
import torch
|
|
6
|
+
from torch.optim import Optimizer
|
|
6
7
|
|
|
7
8
|
from pytorch_optimizer.base.exception import NegativeLRError, NegativeStepError
|
|
8
|
-
from pytorch_optimizer.base.types import BETAS, HUTCHINSON_G, PARAMETERS, STATE
|
|
9
|
+
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, HUTCHINSON_G, LOSS, PARAMETERS, STATE
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
class BaseOptimizer(ABC):
|
|
12
|
-
r"""Base optimizer class."""
|
|
12
|
+
class BaseOptimizer(ABC, Optimizer):
|
|
13
|
+
r"""Base optimizer class. Provides common functionalities for the optimizers."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, params: PARAMETERS, defaults: DEFAULTS) -> None:
|
|
16
|
+
super().__init__(params, defaults)
|
|
13
17
|
|
|
14
18
|
@staticmethod
|
|
15
19
|
@torch.no_grad()
|
|
16
|
-
def set_hessian(param_groups: PARAMETERS, state: STATE, hessian: List[torch.Tensor]):
|
|
20
|
+
def set_hessian(param_groups: PARAMETERS, state: STATE, hessian: List[torch.Tensor]) -> None:
|
|
17
21
|
r"""Set hessian to state from external source. Generally useful when using functorch as a base.
|
|
18
22
|
|
|
19
23
|
Example:
|
|
@@ -45,7 +49,7 @@ class BaseOptimizer(ABC):
|
|
|
45
49
|
i += 1
|
|
46
50
|
|
|
47
51
|
@staticmethod
|
|
48
|
-
def zero_hessian(param_groups: PARAMETERS, state: STATE, pre_zero: bool = True):
|
|
52
|
+
def zero_hessian(param_groups: PARAMETERS, state: STATE, pre_zero: bool = True) -> None:
|
|
49
53
|
r"""Zero-out hessian.
|
|
50
54
|
|
|
51
55
|
:param param_groups: PARAMETERS. parameter groups.
|
|
@@ -68,7 +72,7 @@ class BaseOptimizer(ABC):
|
|
|
68
72
|
num_samples: int = 1,
|
|
69
73
|
alpha: float = 1.0,
|
|
70
74
|
distribution: HUTCHINSON_G = 'gaussian',
|
|
71
|
-
):
|
|
75
|
+
) -> None:
|
|
72
76
|
r"""Hutchinson's approximate hessian, added to the state under key `hessian`.
|
|
73
77
|
|
|
74
78
|
:param param_groups: PARAMETERS. parameter groups.
|
|
@@ -110,7 +114,7 @@ class BaseOptimizer(ABC):
|
|
|
110
114
|
weight_decouple: bool,
|
|
111
115
|
fixed_decay: bool,
|
|
112
116
|
ratio: Optional[float] = None,
|
|
113
|
-
):
|
|
117
|
+
) -> None:
|
|
114
118
|
r"""Apply weight decay.
|
|
115
119
|
|
|
116
120
|
:param p: torch.Tensor. parameter.
|
|
@@ -145,6 +149,27 @@ class BaseOptimizer(ABC):
|
|
|
145
149
|
|
|
146
150
|
return de_nom.sqrt_().add_(eps)
|
|
147
151
|
|
|
152
|
+
@staticmethod
|
|
153
|
+
def debias(beta: float, step: int) -> float:
|
|
154
|
+
r"""Adam-style debias correction. Returns `1.0 - beta ** step`.
|
|
155
|
+
|
|
156
|
+
:param beta: float. beta.
|
|
157
|
+
:param step: int. number of step.
|
|
158
|
+
"""
|
|
159
|
+
return 1.0 - math.pow(beta, step) # fmt: skip
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def debias_beta(beta: float, step: int) -> float:
|
|
163
|
+
r"""Apply the Adam-style debias correction into beta.
|
|
164
|
+
|
|
165
|
+
Simplified version of `\^{beta} = beta * (1.0 - beta ** (step - 1)) / (1.0 - beta ** step)`
|
|
166
|
+
|
|
167
|
+
:param beta: float. beta.
|
|
168
|
+
:param step: int. number of step.
|
|
169
|
+
"""
|
|
170
|
+
beta_n: float = math.pow(beta, step)
|
|
171
|
+
return (beta_n - beta) / (beta_n - 1.0) # fmt: skip
|
|
172
|
+
|
|
148
173
|
@staticmethod
|
|
149
174
|
def apply_adam_debias(adam_debias: bool, step_size: float, bias_correction1: float) -> float:
|
|
150
175
|
r"""Apply AdamD variant.
|
|
@@ -205,14 +230,30 @@ class BaseOptimizer(ABC):
|
|
|
205
230
|
:param exp_grad_norm: Optional[torch.Tensor]. exp_grad_norm.
|
|
206
231
|
:param r: float. Optional[float]. momentum (ratio).
|
|
207
232
|
"""
|
|
208
|
-
if not adanorm:
|
|
233
|
+
if not adanorm or exp_grad_norm is None:
|
|
209
234
|
return grad
|
|
210
235
|
|
|
211
236
|
grad_norm = torch.linalg.norm(grad)
|
|
212
237
|
|
|
213
238
|
exp_grad_norm.mul_(r).add_(grad_norm, alpha=1.0 - r)
|
|
214
239
|
|
|
215
|
-
return grad
|
|
240
|
+
return grad.mul(exp_grad_norm).div_(grad_norm) if exp_grad_norm > grad_norm else grad
|
|
241
|
+
|
|
242
|
+
@staticmethod
|
|
243
|
+
def get_rms(x: torch.Tensor) -> float:
|
|
244
|
+
r"""Get RMS."""
|
|
245
|
+
return x.norm(2) / math.sqrt(x.numel())
|
|
246
|
+
|
|
247
|
+
@staticmethod
|
|
248
|
+
def approximate_sq_grad(
|
|
249
|
+
exp_avg_sq_row: torch.Tensor,
|
|
250
|
+
exp_avg_sq_col: torch.Tensor,
|
|
251
|
+
output: torch.Tensor,
|
|
252
|
+
) -> None:
|
|
253
|
+
r"""Get approximation of EMA of squared gradient."""
|
|
254
|
+
r_factor: torch.Tensor = (exp_avg_sq_row / exp_avg_sq_row.mean(dim=-1, keepdim=True)).rsqrt_().unsqueeze(-1)
|
|
255
|
+
c_factor: torch.Tensor = exp_avg_sq_col.unsqueeze(-2).rsqrt()
|
|
256
|
+
torch.mul(r_factor, c_factor, out=output)
|
|
216
257
|
|
|
217
258
|
@staticmethod
|
|
218
259
|
def validate_range(x: float, name: str, low: float, high: float, range_type: str = '[)') -> None:
|
|
@@ -283,5 +324,8 @@ class BaseOptimizer(ABC):
|
|
|
283
324
|
self.validate_range(nus[1], 'nu2', 0.0, 1.0, range_type='[]')
|
|
284
325
|
|
|
285
326
|
@abstractmethod
|
|
286
|
-
def reset(self): # pragma: no cover
|
|
327
|
+
def reset(self) -> None: # pragma: no cover
|
|
328
|
+
raise NotImplementedError
|
|
329
|
+
|
|
330
|
+
def step(self, closure: CLOSURE = None) -> LOSS: # pragma: no cover
|
|
287
331
|
raise NotImplementedError
|
|
@@ -2,14 +2,13 @@ import math
|
|
|
2
2
|
from typing import Optional
|
|
3
3
|
|
|
4
4
|
import torch
|
|
5
|
-
from torch.optim.optimizer import Optimizer
|
|
6
5
|
|
|
7
6
|
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
8
7
|
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
9
8
|
from pytorch_optimizer.base.types import CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
10
9
|
|
|
11
10
|
|
|
12
|
-
class A2Grad(
|
|
11
|
+
class A2Grad(BaseOptimizer):
|
|
13
12
|
r"""Optimal Adaptive and Accelerated Stochastic Gradient Descent.
|
|
14
13
|
|
|
15
14
|
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
{pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adabelief.py
RENAMED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import math
|
|
2
2
|
|
|
3
3
|
import torch
|
|
4
|
-
from torch.optim.optimizer import Optimizer
|
|
5
4
|
|
|
6
5
|
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
7
6
|
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
8
7
|
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
9
8
|
|
|
10
9
|
|
|
11
|
-
class AdaBelief(
|
|
10
|
+
class AdaBelief(BaseOptimizer):
|
|
12
11
|
r"""Adapting Step-sizes by the Belief in Observed Gradients.
|
|
13
12
|
|
|
14
13
|
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
@@ -101,8 +100,8 @@ class AdaBelief(Optimizer, BaseOptimizer):
|
|
|
101
100
|
|
|
102
101
|
beta1, beta2 = group['betas']
|
|
103
102
|
|
|
104
|
-
bias_correction1: float =
|
|
105
|
-
bias_correction2_sq: float = math.sqrt(
|
|
103
|
+
bias_correction1: float = self.debias(beta1, group['step'])
|
|
104
|
+
bias_correction2_sq: float = math.sqrt(self.debias(beta2, group['step']))
|
|
106
105
|
|
|
107
106
|
step_size, n_sma = self.get_rectify_step_size(
|
|
108
107
|
is_rectify=group['rectify'],
|
|
@@ -2,14 +2,13 @@ import math
|
|
|
2
2
|
from typing import List
|
|
3
3
|
|
|
4
4
|
import torch
|
|
5
|
-
from torch.optim.optimizer import Optimizer
|
|
6
5
|
|
|
7
6
|
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
8
7
|
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
9
8
|
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
10
9
|
|
|
11
10
|
|
|
12
|
-
class AdaBound(
|
|
11
|
+
class AdaBound(BaseOptimizer):
|
|
13
12
|
r"""Adaptive Gradient Methods with Dynamic Bound of Learning Rate.
|
|
14
13
|
|
|
15
14
|
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
@@ -90,8 +89,8 @@ class AdaBound(Optimizer, BaseOptimizer):
|
|
|
90
89
|
|
|
91
90
|
beta1, beta2 = group['betas']
|
|
92
91
|
|
|
93
|
-
bias_correction1: float =
|
|
94
|
-
bias_correction2_sq: float = math.sqrt(
|
|
92
|
+
bias_correction1: float = self.debias(beta1, group['step'])
|
|
93
|
+
bias_correction2_sq: float = math.sqrt(self.debias(beta2, group['step']))
|
|
95
94
|
|
|
96
95
|
final_lr: float = group['final_lr'] * group['lr'] / base_lr
|
|
97
96
|
lower_bound: float = final_lr * (1 - 1 / (group['gamma'] * group['step'] + 1))
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import torch
|
|
2
|
-
from torch.optim.optimizer import Optimizer
|
|
3
2
|
|
|
4
3
|
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
5
4
|
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
6
5
|
from pytorch_optimizer.base.types import CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
7
6
|
|
|
8
7
|
|
|
9
|
-
class AdaDelta(
|
|
8
|
+
class AdaDelta(BaseOptimizer):
|
|
10
9
|
r"""An Adaptive Learning Rate Method.
|
|
11
10
|
|
|
12
11
|
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
{pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adafactor.py
RENAMED
|
@@ -2,14 +2,13 @@ import math
|
|
|
2
2
|
from typing import Optional, Tuple
|
|
3
3
|
|
|
4
4
|
import torch
|
|
5
|
-
from torch.optim.optimizer import Optimizer
|
|
6
5
|
|
|
7
6
|
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
8
7
|
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
9
8
|
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
10
9
|
|
|
11
10
|
|
|
12
|
-
class AdaFactor(
|
|
11
|
+
class AdaFactor(BaseOptimizer):
|
|
13
12
|
r"""Adaptive Learning Rates with Sublinear Memory Cost with some tweaks.
|
|
14
13
|
|
|
15
14
|
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
@@ -127,22 +126,6 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
127
126
|
r"""Get `factored`."""
|
|
128
127
|
return len(shape) >= 2
|
|
129
128
|
|
|
130
|
-
@staticmethod
|
|
131
|
-
def get_rms(x: torch.Tensor) -> float:
|
|
132
|
-
r"""Get RMS."""
|
|
133
|
-
return x.norm(2) / math.sqrt(x.numel())
|
|
134
|
-
|
|
135
|
-
@staticmethod
|
|
136
|
-
def approximate_sq_grad(
|
|
137
|
-
exp_avg_sq_row: torch.Tensor,
|
|
138
|
-
exp_avg_sq_col: torch.Tensor,
|
|
139
|
-
output: torch.Tensor,
|
|
140
|
-
):
|
|
141
|
-
r"""Get approximation of EMA of squared gradient."""
|
|
142
|
-
r_factor: torch.Tensor = (exp_avg_sq_row / exp_avg_sq_row.mean(dim=-1, keepdim=True)).rsqrt_().unsqueeze(-1)
|
|
143
|
-
c_factor: torch.Tensor = exp_avg_sq_col.unsqueeze(-2).rsqrt()
|
|
144
|
-
torch.mul(r_factor, c_factor, out=output)
|
|
145
|
-
|
|
146
129
|
@torch.no_grad()
|
|
147
130
|
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
148
131
|
loss: LOSS = None
|
{pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adahessian.py
RENAMED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
from typing import List, Optional
|
|
2
2
|
|
|
3
3
|
import torch
|
|
4
|
-
from torch.optim.optimizer import Optimizer
|
|
5
4
|
|
|
6
5
|
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
7
6
|
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
8
7
|
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, HUTCHINSON_G, LOSS, PARAMETERS
|
|
9
8
|
|
|
10
9
|
|
|
11
|
-
class AdaHessian(
|
|
10
|
+
class AdaHessian(BaseOptimizer):
|
|
12
11
|
r"""An Adaptive Second Order Optimizer for Machine Learning.
|
|
13
12
|
|
|
14
13
|
Requires `loss.backward(create_graph=True)` in order to calculate hessians.
|
|
@@ -104,8 +103,8 @@ class AdaHessian(Optimizer, BaseOptimizer):
|
|
|
104
103
|
|
|
105
104
|
beta1, beta2 = group['betas']
|
|
106
105
|
|
|
107
|
-
bias_correction1: float =
|
|
108
|
-
bias_correction2: float =
|
|
106
|
+
bias_correction1: float = self.debias(beta1, group['step'])
|
|
107
|
+
bias_correction2: float = self.debias(beta2, group['step'])
|
|
109
108
|
|
|
110
109
|
for p in group['params']:
|
|
111
110
|
if p.grad is None:
|