pytorch-optimizer 3.0.0__tar.gz → 3.0.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.0 → pytorch_optimizer-3.0.1}/PKG-INFO +6 -4
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/README.md +4 -2
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pyproject.toml +7 -7
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/__init__.py +4 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/optimizer.py +12 -10
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/types.py +1 -1
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adafactor.py +21 -8
- pytorch_optimizer-3.0.1/pytorch_optimizer/optimizer/fadam.py +124 -0
- pytorch_optimizer-3.0.1/pytorch_optimizer/optimizer/grokfast.py +232 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lookahead.py +4 -1
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/utils.py +1 -1
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/LICENSE +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/bi_tempered.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/cross_entropy.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/dice.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/f1.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/focal.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/jaccard.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/ldam.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/lovasz.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/tversky.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/__init__.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/a2grad.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adabelief.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adahessian.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adai.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adalite.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adamp.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adan.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adashift.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/aida.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/amos.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/apollo.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/came.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/dadapt.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/galore.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/gc.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lion.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lomo.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/padam.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/prodigy.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/ranger.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/ranger21.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/rotograd.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sgd.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sgdp.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/shampoo.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sophia.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/tiger.py +0 -0
- {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/yogi.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pytorch_optimizer
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.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,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DiffGrad,Fromage,GaLore,Gravity,GSAM,LARS,Lamb,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,SWATS,Tiger,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes
|
|
7
|
+
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdaHessian,Adai,Adalite,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DiffGrad,FAdam,Fromage,GaLore,Gravity,GrokFast,GSAM,LARS,Lamb,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,SWATS,Tiger,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes
|
|
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, **69 optimizers (+ `bitsandbytes`)**, **11 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
|
|
|
@@ -203,6 +203,8 @@ supported_optimizers = get_supported_optimizers()
|
|
|
203
203
|
| Adalite | *Adalite optimizer* | [github](https://github.com/VatsaDev/adalite) | <https://github.com/VatsaDev/adalite> | [cite](https://github.com/VatsaDev/adalite) |
|
|
204
204
|
| bSAM | *SAM as an Optimal Relaxation of Bayes* | [github](https://github.com/team-approx-bayes/bayesian-sam) | <https://arxiv.org/abs/2210.01620> | [cite](https://ui.adsabs.harvard.edu/abs/2022arXiv221001620M/exportcitation) |
|
|
205
205
|
| Schedule-Free | *Schedule-Free Optimizers* | [github](https://github.com/facebookresearch/schedule_free) | <https://github.com/facebookresearch/schedule_free> | [cite](https://github.com/facebookresearch/schedule_free) |
|
|
206
|
+
| FAdam | *Adam is a natural gradient optimizer using diagonal empirical Fisher information* | [github](https://github.com/lessw2020/fadam_pytorch) | <https://arxiv.org/abs/2405.12807> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240512807H/exportcitation) |
|
|
207
|
+
| Grokfast | *Accelerated Grokking by Amplifying Slow Gradients* | [github](https://github.com/ironjr/grokfast) | <https://arxiv.org/abs/2405.20233> | [cite](https://github.com/ironjr/grokfast?tab=readme-ov-file#citation) |
|
|
206
208
|
|
|
207
209
|
## Supported LR Scheduler
|
|
208
210
|
|
|
@@ -363,7 +365,7 @@ If you use this software, please cite it below. Or you can get it from "cite thi
|
|
|
363
365
|
month = jan,
|
|
364
366
|
title = {{pytorch_optimizer: optimizer & lr scheduler & loss function collections in PyTorch}},
|
|
365
367
|
url = {https://github.com/kozistr/pytorch_optimizer},
|
|
366
|
-
version = {
|
|
368
|
+
version = {3.0.1},
|
|
367
369
|
year = {2021}
|
|
368
370
|
}
|
|
369
371
|
|
|
@@ -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, **69 optimizers (+ `bitsandbytes`)**, **11 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
|
|
|
@@ -164,6 +164,8 @@ supported_optimizers = get_supported_optimizers()
|
|
|
164
164
|
| Adalite | *Adalite optimizer* | [github](https://github.com/VatsaDev/adalite) | <https://github.com/VatsaDev/adalite> | [cite](https://github.com/VatsaDev/adalite) |
|
|
165
165
|
| bSAM | *SAM as an Optimal Relaxation of Bayes* | [github](https://github.com/team-approx-bayes/bayesian-sam) | <https://arxiv.org/abs/2210.01620> | [cite](https://ui.adsabs.harvard.edu/abs/2022arXiv221001620M/exportcitation) |
|
|
166
166
|
| Schedule-Free | *Schedule-Free Optimizers* | [github](https://github.com/facebookresearch/schedule_free) | <https://github.com/facebookresearch/schedule_free> | [cite](https://github.com/facebookresearch/schedule_free) |
|
|
167
|
+
| FAdam | *Adam is a natural gradient optimizer using diagonal empirical Fisher information* | [github](https://github.com/lessw2020/fadam_pytorch) | <https://arxiv.org/abs/2405.12807> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240512807H/exportcitation) |
|
|
168
|
+
| Grokfast | *Accelerated Grokking by Amplifying Slow Gradients* | [github](https://github.com/ironjr/grokfast) | <https://arxiv.org/abs/2405.20233> | [cite](https://github.com/ironjr/grokfast?tab=readme-ov-file#citation) |
|
|
167
169
|
|
|
168
170
|
## Supported LR Scheduler
|
|
169
171
|
|
|
@@ -324,7 +326,7 @@ If you use this software, please cite it below. Or you can get it from "cite thi
|
|
|
324
326
|
month = jan,
|
|
325
327
|
title = {{pytorch_optimizer: optimizer & lr scheduler & loss function collections in PyTorch}},
|
|
326
328
|
url = {https://github.com/kozistr/pytorch_optimizer},
|
|
327
|
-
version = {
|
|
329
|
+
version = {3.0.1},
|
|
328
330
|
year = {2021}
|
|
329
331
|
}
|
|
330
332
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "3.0.
|
|
3
|
+
version = "3.0.1"
|
|
4
4
|
description = "optimizer & lr scheduler & objective function collections in PyTorch"
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
authors = ["kozistr <kozistr@gmail.com>"]
|
|
@@ -13,12 +13,12 @@ keywords = [
|
|
|
13
13
|
"pytorch", "deep-learning", "optimizer", "lr scheduler", "A2Grad", "ASGD", "AccSGD", "AdaBelief", "AdaBound",
|
|
14
14
|
"AdaDelta", "AdaFactor", "AdaMax", "AdaMod", "AdaNorm", "AdaPNM", "AdaSmooth", "AdaHessian", "Adai", "Adalite",
|
|
15
15
|
"AdamP", "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos", "Apollo", "AvaGrad", "bSAM", "CAME", "DAdaptAdaGrad",
|
|
16
|
-
"DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DiffGrad", "
|
|
17
|
-
"
|
|
18
|
-
"Prodigy", "QHAdam", "QHM", "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM",
|
|
19
|
-
"ScheduleFreeAdamW", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SopihaH",
|
|
20
|
-
"Tiger", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM",
|
|
21
|
-
"Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes",
|
|
16
|
+
"DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DiffGrad", "FAdam", "Fromage", "GaLore", "Gravity",
|
|
17
|
+
"GrokFast", "GSAM", "LARS", "Lamb", "Lion", "LOMO", "Lookahead", "MADGRAD", "MSVAG", "Nero", "NovoGrad", "PAdam",
|
|
18
|
+
"PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM",
|
|
19
|
+
"ScheduleFreeSGD", "ScheduleFreeAdamW", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SopihaH",
|
|
20
|
+
"SRMM", "SWATS", "Tiger", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM",
|
|
21
|
+
"Jaccard", "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes",
|
|
22
22
|
]
|
|
23
23
|
classifiers = [
|
|
24
24
|
"License :: OSI Approved :: Apache Software License",
|
|
@@ -54,11 +54,13 @@ from pytorch_optimizer.optimizer.avagrad import AvaGrad
|
|
|
54
54
|
from pytorch_optimizer.optimizer.came import CAME
|
|
55
55
|
from pytorch_optimizer.optimizer.dadapt import DAdaptAdaGrad, DAdaptAdam, DAdaptAdan, DAdaptLion, DAdaptSGD
|
|
56
56
|
from pytorch_optimizer.optimizer.diffgrad import DiffGrad
|
|
57
|
+
from pytorch_optimizer.optimizer.fadam import FAdam
|
|
57
58
|
from pytorch_optimizer.optimizer.fp16 import DynamicLossScaler, SafeFP16Optimizer
|
|
58
59
|
from pytorch_optimizer.optimizer.fromage import Fromage
|
|
59
60
|
from pytorch_optimizer.optimizer.galore import GaLore, GaLoreProjector
|
|
60
61
|
from pytorch_optimizer.optimizer.gc import centralize_gradient
|
|
61
62
|
from pytorch_optimizer.optimizer.gravity import Gravity
|
|
63
|
+
from pytorch_optimizer.optimizer.grokfast import GrokFastAdamW, gradfilter_ema, gradfilter_ma
|
|
62
64
|
from pytorch_optimizer.optimizer.lamb import Lamb
|
|
63
65
|
from pytorch_optimizer.optimizer.lars import LARS
|
|
64
66
|
from pytorch_optimizer.optimizer.lion import Lion
|
|
@@ -190,6 +192,8 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
190
192
|
BSAM,
|
|
191
193
|
ScheduleFreeSGD,
|
|
192
194
|
ScheduleFreeAdamW,
|
|
195
|
+
FAdam,
|
|
196
|
+
GrokFastAdamW,
|
|
193
197
|
]
|
|
194
198
|
OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
|
|
195
199
|
|
|
@@ -215,7 +215,7 @@ class BaseOptimizer(ABC):
|
|
|
215
215
|
return grad * exp_grad_norm / grad_norm if exp_grad_norm > grad_norm else grad
|
|
216
216
|
|
|
217
217
|
@staticmethod
|
|
218
|
-
def validate_range(x: float, name: str, low: float, high: float, range_type: str = '[)'):
|
|
218
|
+
def validate_range(x: float, name: str, low: float, high: float, range_type: str = '[)') -> None:
|
|
219
219
|
if range_type == '[)' and not low <= x < high:
|
|
220
220
|
raise ValueError(f'[-] {name} must be in the range [{low}, {high})')
|
|
221
221
|
if range_type == '[]' and not low <= x <= high:
|
|
@@ -226,40 +226,42 @@ class BaseOptimizer(ABC):
|
|
|
226
226
|
raise ValueError(f'[-] {name} must be in the range ({low}, {high})')
|
|
227
227
|
|
|
228
228
|
@staticmethod
|
|
229
|
-
def validate_non_negative(x: Optional[float], name: str):
|
|
229
|
+
def validate_non_negative(x: Optional[float], name: str) -> None:
|
|
230
230
|
if x is not None and x < 0.0:
|
|
231
231
|
raise ValueError(f'[-] {name} must be non-negative')
|
|
232
232
|
|
|
233
233
|
@staticmethod
|
|
234
|
-
def validate_positive(x: Union[float, int], name: str):
|
|
234
|
+
def validate_positive(x: Union[float, int], name: str) -> None:
|
|
235
235
|
if x <= 0:
|
|
236
236
|
raise ValueError(f'[-] {name} must be positive')
|
|
237
237
|
|
|
238
238
|
@staticmethod
|
|
239
|
-
def validate_boundary(constant: float, boundary: float, bound_type: str = 'upper'):
|
|
239
|
+
def validate_boundary(constant: float, boundary: float, bound_type: str = 'upper') -> None:
|
|
240
240
|
if bound_type == 'upper' and constant > boundary:
|
|
241
241
|
raise ValueError(f'[-] constant {constant} must be in a range of (-inf, {boundary}]')
|
|
242
242
|
if bound_type == 'lower' and constant < boundary:
|
|
243
243
|
raise ValueError(f'[-] constant {constant} must be in a range of [{boundary}, inf)')
|
|
244
244
|
|
|
245
245
|
@staticmethod
|
|
246
|
-
def validate_step(step: int, step_type: str):
|
|
246
|
+
def validate_step(step: int, step_type: str) -> None:
|
|
247
247
|
if step < 1:
|
|
248
248
|
raise NegativeStepError(step, step_type=step_type)
|
|
249
249
|
|
|
250
250
|
@staticmethod
|
|
251
|
-
def validate_options(x: str, name: str, options: List[str]):
|
|
251
|
+
def validate_options(x: str, name: str, options: List[str]) -> None:
|
|
252
252
|
if x not in options:
|
|
253
253
|
opts: str = ' or '.join([f'\'{option}\'' for option in options]).strip()
|
|
254
254
|
raise ValueError(f'[-] {name} {x} must be one of ({opts})')
|
|
255
255
|
|
|
256
256
|
@staticmethod
|
|
257
|
-
def validate_learning_rate(learning_rate: Optional[float]):
|
|
257
|
+
def validate_learning_rate(learning_rate: Optional[float]) -> None:
|
|
258
258
|
if learning_rate is not None and learning_rate < 0.0:
|
|
259
259
|
raise NegativeLRError(learning_rate)
|
|
260
260
|
|
|
261
|
-
def validate_betas(self, betas: BETAS):
|
|
262
|
-
|
|
261
|
+
def validate_betas(self, betas: BETAS) -> None:
|
|
262
|
+
if betas[0] is not None:
|
|
263
|
+
self.validate_range(betas[0], 'beta1', 0.0, 1.0, range_type='[]')
|
|
264
|
+
|
|
263
265
|
self.validate_range(betas[1], 'beta2', 0.0, 1.0, range_type='[]')
|
|
264
266
|
|
|
265
267
|
if len(betas) < 3:
|
|
@@ -268,7 +270,7 @@ class BaseOptimizer(ABC):
|
|
|
268
270
|
if betas[2] is not None:
|
|
269
271
|
self.validate_range(betas[2], 'beta3', 0.0, 1.0, range_type='[]')
|
|
270
272
|
|
|
271
|
-
def validate_nus(self, nus: Union[float, Tuple[float, float]]):
|
|
273
|
+
def validate_nus(self, nus: Union[float, Tuple[float, float]]) -> None:
|
|
272
274
|
if isinstance(nus, float):
|
|
273
275
|
self.validate_range(nus, 'nu', 0.0, 1.0, range_type='[]')
|
|
274
276
|
else:
|
|
@@ -6,7 +6,7 @@ from torch.optim.lr_scheduler import _LRScheduler
|
|
|
6
6
|
|
|
7
7
|
CLOSURE = Optional[Callable[[], float]]
|
|
8
8
|
LOSS = Optional[float]
|
|
9
|
-
BETAS = Union[Tuple[float, float], Tuple[float, float, float]]
|
|
9
|
+
BETAS = Union[Tuple[float, float], Tuple[float, float, float], Tuple[None, float]]
|
|
10
10
|
DEFAULTS = Dict
|
|
11
11
|
PARAMETERS = Optional[Union[Iterable[Dict], Iterable[torch.Tensor]]]
|
|
12
12
|
STATE = Dict
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adafactor.py
RENAMED
|
@@ -10,11 +10,12 @@ from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMET
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class AdaFactor(Optimizer, BaseOptimizer):
|
|
13
|
-
r"""Adaptive Learning Rates with Sublinear Memory Cost.
|
|
13
|
+
r"""Adaptive Learning Rates with Sublinear Memory Cost with some tweaks.
|
|
14
14
|
|
|
15
15
|
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
16
16
|
:param lr: float. learning rate.
|
|
17
|
-
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared
|
|
17
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared
|
|
18
|
+
hessian trace. if beta1 is None, first momentum will be skipped.
|
|
18
19
|
:param decay_rate: float. coefficient used to compute running averages of square gradient.
|
|
19
20
|
:param weight_decay: float. weight decay (L2 penalty).
|
|
20
21
|
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
@@ -27,6 +28,9 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
27
28
|
is being used.
|
|
28
29
|
:param eps1: float. term added to the denominator to improve numerical stability.
|
|
29
30
|
:param eps2: float. term added to the denominator to improve numerical stability.
|
|
31
|
+
:param momentum_dtype: torch.dtype. type of momentum variable. In VIT paper observed that storing momentum in
|
|
32
|
+
half-precision (bfloat16 type) does not affect training dynamics and has no effect on the outcome while
|
|
33
|
+
reducing optimize overhead from 2-fold to 1.5-fold.
|
|
30
34
|
"""
|
|
31
35
|
|
|
32
36
|
def __init__(
|
|
@@ -45,6 +49,7 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
45
49
|
warmup_init: bool = False,
|
|
46
50
|
eps1: float = 1e-30,
|
|
47
51
|
eps2: float = 1e-3,
|
|
52
|
+
momentum_dtype: torch.dtype = torch.bfloat16,
|
|
48
53
|
):
|
|
49
54
|
self.validate_learning_rate(lr)
|
|
50
55
|
self.validate_betas(betas)
|
|
@@ -56,6 +61,7 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
56
61
|
self.clip_threshold = clip_threshold
|
|
57
62
|
self.eps1 = eps1
|
|
58
63
|
self.eps2 = eps2
|
|
64
|
+
self.momentum_dtype = momentum_dtype
|
|
59
65
|
|
|
60
66
|
defaults: DEFAULTS = {
|
|
61
67
|
'lr': lr,
|
|
@@ -87,7 +93,8 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
87
93
|
grad_shape: Tuple[int, ...] = grad.shape
|
|
88
94
|
factored: bool = self.get_options(grad_shape)
|
|
89
95
|
|
|
90
|
-
|
|
96
|
+
if group['betas'][0] is not None:
|
|
97
|
+
state['exp_avg'] = torch.zeros_like(p, dtype=self.momentum_dtype)
|
|
91
98
|
|
|
92
99
|
if factored:
|
|
93
100
|
state['exp_avg_sq_row'] = torch.zeros(grad_shape[:-1], dtype=grad.dtype, device=grad.device)
|
|
@@ -149,7 +156,7 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
149
156
|
else:
|
|
150
157
|
group['step'] = 1
|
|
151
158
|
|
|
152
|
-
beta1,
|
|
159
|
+
beta1, beta2 = group['betas']
|
|
153
160
|
|
|
154
161
|
beta2_t: float = 1.0 - math.pow(group['step'], self.decay_rate)
|
|
155
162
|
|
|
@@ -167,7 +174,8 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
167
174
|
factored: bool = self.get_options(grad_shape)
|
|
168
175
|
|
|
169
176
|
if len(state) == 0:
|
|
170
|
-
|
|
177
|
+
if beta1 is not None:
|
|
178
|
+
state['exp_avg'] = torch.zeros_like(p, dtype=self.momentum_dtype)
|
|
171
179
|
|
|
172
180
|
if factored:
|
|
173
181
|
state['exp_avg_sq_row'] = torch.zeros(grad_shape[:-1], dtype=grad.dtype, device=grad.device)
|
|
@@ -205,6 +213,8 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
205
213
|
else:
|
|
206
214
|
exp_avg_sq = state['exp_avg_sq']
|
|
207
215
|
exp_avg_sq.mul_(beta2_t).add_(update, alpha=1.0 - beta2_t)
|
|
216
|
+
exp_avg_sq.clamp_(max=beta2)
|
|
217
|
+
|
|
208
218
|
torch.rsqrt(exp_avg_sq, out=update)
|
|
209
219
|
|
|
210
220
|
if group['ams_bound']:
|
|
@@ -216,8 +226,11 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
216
226
|
|
|
217
227
|
update.div_((self.get_rms(update) / self.clip_threshold).clamp_(min=1.0)).mul_(lr)
|
|
218
228
|
|
|
219
|
-
|
|
220
|
-
|
|
229
|
+
if beta1 is not None:
|
|
230
|
+
exp_avg = state['exp_avg']
|
|
231
|
+
exp_avg.mul_(beta1).add_(update, alpha=1.0 - beta1)
|
|
232
|
+
|
|
233
|
+
update = exp_avg
|
|
221
234
|
|
|
222
235
|
self.apply_weight_decay(
|
|
223
236
|
p=p,
|
|
@@ -228,6 +241,6 @@ class AdaFactor(Optimizer, BaseOptimizer):
|
|
|
228
241
|
fixed_decay=group['fixed_decay'],
|
|
229
242
|
)
|
|
230
243
|
|
|
231
|
-
p.add_(-
|
|
244
|
+
p.add_(-update)
|
|
232
245
|
|
|
233
246
|
return loss
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
from torch.optim.optimizer import Optimizer
|
|
3
|
+
|
|
4
|
+
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
5
|
+
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
6
|
+
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class FAdam(Optimizer, BaseOptimizer):
|
|
10
|
+
r"""Adam is a natural gradient optimizer using diagonal empirical Fisher information.
|
|
11
|
+
|
|
12
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
13
|
+
:param lr: float. learning rate.
|
|
14
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
15
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
16
|
+
:param clip: float. maximum norm of the gradient.
|
|
17
|
+
:param p: float. momentum factor.
|
|
18
|
+
:param eps: float. term added to the denominator to improve numerical stability.
|
|
19
|
+
:param momentum_dtype: torch.dtype. type of momentum.
|
|
20
|
+
:param fim_dtype: torch.dtype. type of fim.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
params: PARAMETERS,
|
|
26
|
+
lr: float = 1e-3,
|
|
27
|
+
betas: BETAS = (0.9, 0.999),
|
|
28
|
+
weight_decay: float = 0.1,
|
|
29
|
+
clip: float = 1.0,
|
|
30
|
+
p: float = 0.5,
|
|
31
|
+
eps: float = 1e-8,
|
|
32
|
+
momentum_dtype: torch.dtype = torch.float32,
|
|
33
|
+
fim_dtype: torch.dtype = torch.float32,
|
|
34
|
+
):
|
|
35
|
+
self.validate_learning_rate(lr)
|
|
36
|
+
self.validate_betas(betas)
|
|
37
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
38
|
+
self.validate_positive(clip, 'clip')
|
|
39
|
+
self.validate_positive(p, 'p')
|
|
40
|
+
self.validate_non_negative(eps, 'eps')
|
|
41
|
+
|
|
42
|
+
self.momentum_dtype = momentum_dtype
|
|
43
|
+
self.fim_dtype = fim_dtype
|
|
44
|
+
|
|
45
|
+
defaults: DEFAULTS = {
|
|
46
|
+
'lr': lr,
|
|
47
|
+
'betas': betas,
|
|
48
|
+
'weight_decay': weight_decay,
|
|
49
|
+
'clip': clip,
|
|
50
|
+
'p': p,
|
|
51
|
+
'eps': eps,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
super().__init__(params, defaults)
|
|
55
|
+
|
|
56
|
+
def __str__(self) -> str:
|
|
57
|
+
return 'FAdam'
|
|
58
|
+
|
|
59
|
+
@torch.no_grad()
|
|
60
|
+
def reset(self):
|
|
61
|
+
for group in self.param_groups:
|
|
62
|
+
group['step'] = 0
|
|
63
|
+
for p in group['params']:
|
|
64
|
+
state = self.state[p]
|
|
65
|
+
|
|
66
|
+
state['momentum'] = torch.zeros_like(p, dtype=self.momentum_dtype)
|
|
67
|
+
state['fim'] = torch.zeros_like(p, dtype=self.fim_dtype)
|
|
68
|
+
|
|
69
|
+
@torch.no_grad()
|
|
70
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
71
|
+
loss: LOSS = None
|
|
72
|
+
if closure is not None:
|
|
73
|
+
with torch.enable_grad():
|
|
74
|
+
loss = closure()
|
|
75
|
+
|
|
76
|
+
for group in self.param_groups:
|
|
77
|
+
if 'step' in group:
|
|
78
|
+
group['step'] += 1
|
|
79
|
+
else:
|
|
80
|
+
group['step'] = 1
|
|
81
|
+
|
|
82
|
+
beta1, beta2 = group['betas']
|
|
83
|
+
|
|
84
|
+
curr_beta2: float = beta2 * (1 - beta2 ** (group['step'] - 1)) / (1 - beta2 ** group['step'])
|
|
85
|
+
|
|
86
|
+
for p in group['params']:
|
|
87
|
+
if p.grad is None:
|
|
88
|
+
continue
|
|
89
|
+
|
|
90
|
+
grad = p.grad
|
|
91
|
+
if grad.is_sparse:
|
|
92
|
+
raise NoSparseGradientError(str(self))
|
|
93
|
+
|
|
94
|
+
state = self.state[p]
|
|
95
|
+
if len(state) == 0:
|
|
96
|
+
state['momentum'] = torch.zeros_like(p, dtype=self.momentum_dtype)
|
|
97
|
+
state['fim'] = torch.zeros_like(p, dtype=self.fim_dtype)
|
|
98
|
+
|
|
99
|
+
momentum, fim = state['momentum'], state['fim']
|
|
100
|
+
fim.mul_(curr_beta2).addcmul_(grad, grad, value=1.0 - curr_beta2)
|
|
101
|
+
|
|
102
|
+
rms_grad = grad.pow(2).mean().sqrt_()
|
|
103
|
+
curr_eps = min(rms_grad, 1) * group['eps']
|
|
104
|
+
|
|
105
|
+
fim_base = fim.pow(group['p']).add_(curr_eps)
|
|
106
|
+
grad_nat = grad / fim_base
|
|
107
|
+
|
|
108
|
+
rms = grad_nat.pow(2).mean().sqrt_()
|
|
109
|
+
divisor = max(1, rms) / group['clip']
|
|
110
|
+
grad_nat.div_(divisor)
|
|
111
|
+
|
|
112
|
+
momentum.mul_(beta1).add_(grad_nat, alpha=1.0 - beta1)
|
|
113
|
+
|
|
114
|
+
grad_weights = p / fim_base
|
|
115
|
+
|
|
116
|
+
rms = torch.pow(grad_weights, 2).mean().sqrt_()
|
|
117
|
+
divisor = max(1, rms) / group['clip']
|
|
118
|
+
grad_weights.div_(divisor)
|
|
119
|
+
|
|
120
|
+
grad_weights.mul_(group['weight_decay']).add_(momentum)
|
|
121
|
+
|
|
122
|
+
p.add_(grad_weights, alpha=-group['lr'])
|
|
123
|
+
|
|
124
|
+
return loss
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from collections import deque
|
|
3
|
+
from typing import Dict, Literal, Optional
|
|
4
|
+
|
|
5
|
+
import torch
|
|
6
|
+
from torch import nn
|
|
7
|
+
from torch.optim.optimizer import Optimizer
|
|
8
|
+
|
|
9
|
+
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
10
|
+
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
11
|
+
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
12
|
+
|
|
13
|
+
FILTER_TYPE = Literal['mean', 'sum']
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@torch.no_grad()
|
|
17
|
+
def gradfilter_ma(
|
|
18
|
+
model: nn.Module,
|
|
19
|
+
grads: Optional[Dict[str, deque]] = None,
|
|
20
|
+
window_size: int = 100,
|
|
21
|
+
lamb: float = 5.0,
|
|
22
|
+
filter_type: FILTER_TYPE = 'mean',
|
|
23
|
+
warmup: bool = True,
|
|
24
|
+
) -> Dict[str, deque]:
|
|
25
|
+
r"""Grokfast-MA.
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
-------
|
|
29
|
+
Here's an example::
|
|
30
|
+
|
|
31
|
+
loss.backwards() # Calculate the gradients.
|
|
32
|
+
|
|
33
|
+
grads = gradfilter_ma(model, grads=grads, window_size=window_size, lamb=lamb)
|
|
34
|
+
|
|
35
|
+
optimizer.step() # Call the optimizer.
|
|
36
|
+
|
|
37
|
+
:param model: nn.Module. model that contains every trainable parameters.
|
|
38
|
+
:param grads: Optional[Dict[str, deque]]. running memory (Queue for windowed moving average). initialize by setting
|
|
39
|
+
it to None. feed the output of the method recursively after on.
|
|
40
|
+
:param window_size: int. the width of the filter window. additional memory requirements increases linearly with
|
|
41
|
+
respect to the windows size.
|
|
42
|
+
:param lamb: float. amplifying factor hyperparameter of the filter.
|
|
43
|
+
:param filter_type: FILTER_TYPE. aggregation method for the running queue.
|
|
44
|
+
:param warmup: bool. if true, filter is not applied until the queue is filled.
|
|
45
|
+
"""
|
|
46
|
+
if grads is None:
|
|
47
|
+
grads = {n: deque(maxlen=window_size) for n, p in model.named_parameters() if p.requires_grad}
|
|
48
|
+
|
|
49
|
+
for n, p in model.named_parameters():
|
|
50
|
+
if p.requires_grad:
|
|
51
|
+
grads[n].append(p.grad)
|
|
52
|
+
|
|
53
|
+
if not warmup or len(grads[n]) == window_size:
|
|
54
|
+
if filter_type == 'mean':
|
|
55
|
+
avg = sum(grads[n]) / len(grads[n])
|
|
56
|
+
elif filter_type == 'sum':
|
|
57
|
+
avg = sum(grads[n])
|
|
58
|
+
else:
|
|
59
|
+
raise ValueError(f'not supported filter_type {filter_type}')
|
|
60
|
+
|
|
61
|
+
p.grad.add_(avg, alpha=lamb)
|
|
62
|
+
|
|
63
|
+
return grads
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@torch.no_grad()
|
|
67
|
+
def gradfilter_ema(
|
|
68
|
+
model: nn.Module,
|
|
69
|
+
grads: Optional[Dict[str, torch.Tensor]] = None,
|
|
70
|
+
alpha: float = 0.98,
|
|
71
|
+
lamb: float = 2.0,
|
|
72
|
+
) -> Dict[str, torch.Tensor]:
|
|
73
|
+
r"""Grokfast.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
-------
|
|
77
|
+
Here's an example::
|
|
78
|
+
|
|
79
|
+
loss.backwards() # Calculate the gradients.
|
|
80
|
+
|
|
81
|
+
grads = gradfilter_ema(model, grads=grads, alpha=alpha, lamb=lamb)
|
|
82
|
+
|
|
83
|
+
optimizer.step() # Call the optimizer.
|
|
84
|
+
|
|
85
|
+
:param model: nn.Module. model that contains every trainable parameters.
|
|
86
|
+
:param grads: Optional[Dict[str, deque]]. running memory (EMA). Initialize by setting it to None. Feed the output
|
|
87
|
+
of the method recursively after on.
|
|
88
|
+
:param alpha: int. momentum hyperparameter of the EMA.
|
|
89
|
+
:param lamb: float. amplifying factor hyperparameter of the filter.
|
|
90
|
+
"""
|
|
91
|
+
if grads is None:
|
|
92
|
+
grads = {n: p.grad for n, p in model.named_parameters() if p.requires_grad}
|
|
93
|
+
|
|
94
|
+
for n, p in model.named_parameters():
|
|
95
|
+
if p.requires_grad:
|
|
96
|
+
grads[n].mul_(alpha).add_(p.grad, alpha=1.0 - alpha)
|
|
97
|
+
p.grad.add_(grads[n], alpha=lamb)
|
|
98
|
+
|
|
99
|
+
return grads
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class GrokFastAdamW(Optimizer, BaseOptimizer):
|
|
103
|
+
r"""Accelerated Grokking by Amplifying Slow Gradients with AdamW.
|
|
104
|
+
|
|
105
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
106
|
+
:param lr: float. learning rate.
|
|
107
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
108
|
+
:param grokfast: bool. whether to use grokfast.
|
|
109
|
+
:param grokfast_alpha: float. momentum hyperparameter of the EMA.
|
|
110
|
+
:param grokfast_lamb: float. amplifying factor hyperparameter of the filter..
|
|
111
|
+
:param grokfast_after_step: int. warmup step for grokfast.
|
|
112
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
113
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
114
|
+
:param fixed_decay: bool. fix weight decay.
|
|
115
|
+
:param eps: float. term added to the denominator to improve numerical stability.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
def __init__(
|
|
119
|
+
self,
|
|
120
|
+
params: PARAMETERS,
|
|
121
|
+
lr: float = 1e-4,
|
|
122
|
+
betas: BETAS = (0.9, 0.99),
|
|
123
|
+
grokfast: bool = True,
|
|
124
|
+
grokfast_alpha: float = 0.98,
|
|
125
|
+
grokfast_lamb: float = 2.0,
|
|
126
|
+
grokfast_after_step: int = 0,
|
|
127
|
+
weight_decay: float = 0.0,
|
|
128
|
+
weight_decouple: bool = True,
|
|
129
|
+
fixed_decay: bool = False,
|
|
130
|
+
normalize_lr: bool = True,
|
|
131
|
+
eps: float = 1e-8,
|
|
132
|
+
):
|
|
133
|
+
self.validate_learning_rate(lr)
|
|
134
|
+
self.validate_betas(betas)
|
|
135
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
136
|
+
self.validate_range(grokfast_alpha, 'grokfast_alpha', 0.0, 1.0)
|
|
137
|
+
self.validate_non_negative(eps, 'eps')
|
|
138
|
+
|
|
139
|
+
if grokfast and normalize_lr:
|
|
140
|
+
lr /= 1.0 + grokfast_lamb
|
|
141
|
+
|
|
142
|
+
defaults: DEFAULTS = {
|
|
143
|
+
'lr': lr,
|
|
144
|
+
'betas': betas,
|
|
145
|
+
'weight_decay': weight_decay,
|
|
146
|
+
'weight_decouple': weight_decouple,
|
|
147
|
+
'fixed_decay': fixed_decay,
|
|
148
|
+
'grokfast': grokfast,
|
|
149
|
+
'grokfast_alpha': grokfast_alpha,
|
|
150
|
+
'grokfast_lamb': grokfast_lamb,
|
|
151
|
+
'grokfast_after_step': grokfast_after_step,
|
|
152
|
+
'eps': eps,
|
|
153
|
+
}
|
|
154
|
+
super().__init__(params, defaults)
|
|
155
|
+
|
|
156
|
+
def __str__(self) -> str:
|
|
157
|
+
return 'GrokFastAdamW'
|
|
158
|
+
|
|
159
|
+
@torch.no_grad()
|
|
160
|
+
def reset(self):
|
|
161
|
+
for group in self.param_groups:
|
|
162
|
+
group['step'] = 0
|
|
163
|
+
for p in group['params']:
|
|
164
|
+
state = self.state[p]
|
|
165
|
+
|
|
166
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
167
|
+
state['exp_avg_sq'] = torch.zeros_like(p)
|
|
168
|
+
|
|
169
|
+
@torch.no_grad()
|
|
170
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
171
|
+
loss: LOSS = None
|
|
172
|
+
if closure is not None:
|
|
173
|
+
with torch.enable_grad():
|
|
174
|
+
loss = closure()
|
|
175
|
+
|
|
176
|
+
for group in self.param_groups:
|
|
177
|
+
if 'step' in group:
|
|
178
|
+
group['step'] += 1
|
|
179
|
+
else:
|
|
180
|
+
group['step'] = 1
|
|
181
|
+
|
|
182
|
+
beta1, beta2 = group['betas']
|
|
183
|
+
|
|
184
|
+
bias_correction1: float = 1.0 - beta1 ** group['step']
|
|
185
|
+
bias_correction2_sq: float = math.sqrt(1.0 - beta2 ** group['step'])
|
|
186
|
+
|
|
187
|
+
should_grokfast: bool = (
|
|
188
|
+
group['grokfast'] and group['step'] > group['grokfast_after_step'] and group['grokfast_lamb'] > 0
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
for p in group['params']:
|
|
192
|
+
if p.grad is None:
|
|
193
|
+
continue
|
|
194
|
+
|
|
195
|
+
grad = p.grad
|
|
196
|
+
if grad.is_sparse:
|
|
197
|
+
raise NoSparseGradientError(str(self))
|
|
198
|
+
|
|
199
|
+
state = self.state[p]
|
|
200
|
+
|
|
201
|
+
if len(state) == 0:
|
|
202
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
203
|
+
state['exp_avg_sq'] = torch.zeros_like(p)
|
|
204
|
+
if should_grokfast:
|
|
205
|
+
state['grok_exp_avg'] = grad.clone()
|
|
206
|
+
|
|
207
|
+
self.apply_weight_decay(
|
|
208
|
+
p=p,
|
|
209
|
+
grad=grad,
|
|
210
|
+
lr=group['lr'],
|
|
211
|
+
weight_decay=group['weight_decay'],
|
|
212
|
+
weight_decouple=group['weight_decouple'],
|
|
213
|
+
fixed_decay=group['fixed_decay'],
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
if should_grokfast:
|
|
217
|
+
grok_exp_avg = state['grok_exp_avg']
|
|
218
|
+
grok_exp_avg.lerp_(grad, weight=1.0 - group['grokfast_alpha'])
|
|
219
|
+
|
|
220
|
+
grad.add_(grok_exp_avg, alpha=group['grokfast_lamb'])
|
|
221
|
+
|
|
222
|
+
exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']
|
|
223
|
+
exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
|
|
224
|
+
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
|
|
225
|
+
|
|
226
|
+
de_nom = exp_avg_sq.sqrt().div_(bias_correction2_sq).clamp_(min=group['eps'])
|
|
227
|
+
|
|
228
|
+
update = exp_avg.div(bias_correction1).div_(de_nom)
|
|
229
|
+
|
|
230
|
+
p.add_(update, alpha=-group['lr'])
|
|
231
|
+
|
|
232
|
+
return loss
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lookahead.py
RENAMED
|
@@ -36,7 +36,6 @@ class Lookahead(Optimizer, BaseOptimizer):
|
|
|
36
36
|
self.pullback_momentum = pullback_momentum
|
|
37
37
|
|
|
38
38
|
self.optimizer = optimizer
|
|
39
|
-
self.param_groups = self.optimizer.param_groups
|
|
40
39
|
|
|
41
40
|
self.state: STATE = defaultdict(dict)
|
|
42
41
|
|
|
@@ -58,6 +57,10 @@ class Lookahead(Optimizer, BaseOptimizer):
|
|
|
58
57
|
**optimizer.defaults,
|
|
59
58
|
}
|
|
60
59
|
|
|
60
|
+
@property
|
|
61
|
+
def param_groups(self):
|
|
62
|
+
return self.optimizer.param_groups
|
|
63
|
+
|
|
61
64
|
def __getstate__(self):
|
|
62
65
|
return {
|
|
63
66
|
'state': self.state,
|
|
@@ -282,7 +282,7 @@ def reduce_max_except_dim(x: torch.Tensor, dim: int) -> torch.Tensor:
|
|
|
282
282
|
|
|
283
283
|
def reg_noise(
|
|
284
284
|
network1: nn.Module, network2: nn.Module, num_data: int, lr: float, eta: float = 8e-3, temperature: float = 1e-4
|
|
285
|
-
) -> torch.Tensor
|
|
285
|
+
) -> Union[torch.Tensor, float]:
|
|
286
286
|
r"""Entropy-MCMC: Sampling from flat basins with ease.
|
|
287
287
|
|
|
288
288
|
usage: https://github.com/lblaoke/EMCMC/blob/master/exp/cifar10_emcmc.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/__init__.py
RENAMED
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/chebyshev.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py
RENAMED
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/proportion.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adabelief.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adahessian.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adasmooth.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/schedulefree.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/shampoo_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|