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.
Files changed (104) hide show
  1. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/PKG-INFO +15 -7
  2. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/README.md +13 -5
  3. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pyproject.toml +15 -13
  4. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/__init__.py +61 -16
  5. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/optimizer.py +54 -10
  6. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/a2grad.py +1 -2
  7. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adabelief.py +3 -4
  8. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adabound.py +3 -4
  9. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adadelta.py +1 -2
  10. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adafactor.py +1 -18
  11. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adahessian.py +3 -4
  12. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adai.py +3 -4
  13. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adalite.py +1 -2
  14. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adam_mini.py +15 -21
  15. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adamax.py +2 -3
  16. pytorch_optimizer-3.1.1/pytorch_optimizer/optimizer/adamg.py +127 -0
  17. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adamod.py +3 -4
  18. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adamp.py +3 -4
  19. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adams.py +4 -5
  20. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adamw.py +3 -5
  21. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adan.py +5 -6
  22. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adanorm.py +3 -4
  23. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adapnm.py +4 -4
  24. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adashift.py +2 -3
  25. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/adasmooth.py +1 -2
  26. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/aggmo.py +1 -2
  27. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/aida.py +3 -4
  28. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/alig.py +2 -3
  29. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/amos.py +2 -3
  30. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/apollo.py +2 -3
  31. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/avagrad.py +4 -5
  32. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/came.py +1 -2
  33. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/dadapt.py +6 -7
  34. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/diffgrad.py +2 -3
  35. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/fadam.py +2 -3
  36. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/fromage.py +1 -2
  37. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/galore.py +3 -4
  38. pytorch_optimizer-3.1.1/pytorch_optimizer/optimizer/gc.py +12 -0
  39. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/gravity.py +1 -2
  40. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/grokfast.py +3 -4
  41. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/kate.py +1 -2
  42. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/lamb.py +3 -4
  43. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/lars.py +1 -2
  44. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/lion.py +1 -2
  45. pytorch_optimizer-3.1.1/pytorch_optimizer/optimizer/lomo.py +465 -0
  46. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/lookahead.py +2 -3
  47. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/madgrad.py +1 -2
  48. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/msvag.py +1 -2
  49. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/nero.py +1 -2
  50. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/novograd.py +3 -4
  51. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/padam.py +3 -4
  52. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/pid.py +1 -2
  53. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/pnm.py +1 -2
  54. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/prodigy.py +5 -4
  55. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/qhadam.py +1 -2
  56. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/qhm.py +1 -2
  57. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/radam.py +2 -3
  58. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/ranger.py +3 -3
  59. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/ranger21.py +15 -10
  60. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/rotograd.py +9 -8
  61. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sam.py +4 -5
  62. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/schedulefree.py +2 -3
  63. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sgd.py +4 -5
  64. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sgdp.py +1 -2
  65. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/shampoo.py +11 -10
  66. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/shampoo_utils.py +34 -34
  67. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sm3.py +1 -2
  68. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/sophia.py +1 -2
  69. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/srmm.py +1 -2
  70. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/swats.py +3 -4
  71. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/tiger.py +1 -2
  72. pytorch_optimizer-3.1.1/pytorch_optimizer/optimizer/trac.py +251 -0
  73. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/utils.py +35 -18
  74. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/yogi.py +3 -4
  75. pytorch_optimizer-3.0.2/pytorch_optimizer/optimizer/gc.py +0 -12
  76. pytorch_optimizer-3.0.2/pytorch_optimizer/optimizer/lomo.py +0 -201
  77. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/LICENSE +0 -0
  78. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/__init__.py +0 -0
  79. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/exception.py +0 -0
  80. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/scheduler.py +0 -0
  81. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/base/types.py +0 -0
  82. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/__init__.py +0 -0
  83. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/bi_tempered.py +0 -0
  84. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/cross_entropy.py +0 -0
  85. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/dice.py +0 -0
  86. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/f1.py +0 -0
  87. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/focal.py +0 -0
  88. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/jaccard.py +0 -0
  89. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/ldam.py +0 -0
  90. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/lovasz.py +0 -0
  91. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/loss/tversky.py +0 -0
  92. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  93. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  94. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
  95. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  96. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  97. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  98. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  99. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
  100. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
  101. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/__init__.py +0 -0
  102. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/agc.py +0 -0
  103. {pytorch_optimizer-3.0.2 → pytorch_optimizer-3.1.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
  104. {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.0.2
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, **72 optimizers (+ `bitsandbytes`)**, **16 lr schedulers**, and **13 loss functions** are supported!
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 install and import `bitsandbytes` optimizers.
70
- please check [the requirements](https://github.com/TimDettmers/bitsandbytes?tab=readme-ov-file#tldr) before installing it.
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](./qa.md)
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.1},
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, **72 optimizers (+ `bitsandbytes`)**, **16 lr schedulers**, and **13 loss functions** are supported!
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 install and import `bitsandbytes` optimizers.
31
- please check [the requirements](https://github.com/TimDettmers/bitsandbytes?tab=readme-ov-file#tldr) before installing it.
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](./qa.md)
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.1},
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.0.2"
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", "Adalite",
15
- "AdamMini", "AdamP", "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos", "Apollo", "AvaGrad", "bSAM", "CAME",
16
- "DAdaptAdaGrad", "DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DiffGrad", "FAdam", "Fromage", "GaLore",
17
- "Gravity", "GrokFast", "GSAM", "Kate", "Lamb", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD", "MSVAG", "Nero",
18
- "NovoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger", "Ranger21", "RotoGrad",
19
- "SAM", "ScheduleFreeSGD", "ScheduleFreeAdamW", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3",
20
- "SopihaH", "SRMM", "StableAdamW", "SWATS", "Tiger", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine",
21
- "SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes", "WSD",
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
- try:
130
- import bitsandbytes as bnb
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 bnb.optim.SGD8bit
261
+ return optim.SGD8bit
257
262
  if 'adam8bit' in optimizer:
258
- return bnb.optim.Adam8bit
263
+ return optim.Adam8bit
264
+ if 'paged_adam8bit' in optimizer:
265
+ return optim.PagedAdam8bit
259
266
  if 'adamw8bit' in optimizer:
260
- return bnb.optim.AdamW8bit
267
+ return optim.AdamW8bit
268
+ if 'paged_adamw8bit' in optimizer:
269
+ return optim.PagedAdamW8bit
261
270
  if 'lamb8bit' in optimizer:
262
- return bnb.optim.LAMB8bit
271
+ return optim.LAMB8bit
263
272
  if 'lars8bit' in optimizer:
264
- return bnb.optim.LARS8bit
273
+ return optim.LARS8bit
265
274
  if 'lion8bit' in optimizer:
266
- return bnb.optim.Lion8bit
275
+ return optim.Lion8bit
267
276
  if 'adagrad8bit' in optimizer:
268
- return bnb.optim.Adagrad8bit
277
+ return optim.Adagrad8bit
269
278
  if 'rmsprop8bit' in optimizer:
270
- return bnb.optim.RMSprop8bit
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 bnb optimizers : {optimizer}')
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 * exp_grad_norm / grad_norm if exp_grad_norm > grad_norm else 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(Optimizer, BaseOptimizer):
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.
@@ -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(Optimizer, BaseOptimizer):
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 = 1.0 - beta1 ** group['step']
105
- bias_correction2_sq: float = math.sqrt(1.0 - beta2 ** group['step'])
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(Optimizer, BaseOptimizer):
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 = 1.0 - beta1 ** group['step']
94
- bias_correction2_sq: float = math.sqrt(1.0 - beta2 ** group['step'])
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(Optimizer, BaseOptimizer):
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.
@@ -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(Optimizer, BaseOptimizer):
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
@@ -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(Optimizer, BaseOptimizer):
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 = 1.0 - beta1 ** group['step']
108
- bias_correction2: float = 1.0 - beta2 ** group['step']
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: