pytorch-optimizer 3.3.0__tar.gz → 3.3.2__tar.gz

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