Skip to content

Commit 40f34df

Browse files
authored
Merge pull request #98 from kozistr/test/coverage
[Test] Coverage
2 parents 5df1281 + e00d02e commit 40f34df

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+234
-151
lines changed

docs/scheduler_api.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,11 @@ OneCycleLR
5656

5757
.. autoclass:: pytorch_optimizer.OneCycleLR
5858
:members:
59+
60+
.. _deberta_v3_large_lr_scheduler:
61+
62+
deberta_v3_large_lr_scheduler
63+
-----------------------------
64+
65+
.. autoclass:: pytorch_optimizer.deberta_v3_large_lr_scheduler
66+
:members:

pyproject.toml

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ url = "https://download.pytorch.org/whl/cpu"
5252
secondary = true
5353

5454
[tool.ruff]
55-
select = ["A", "B", "C4", "E", "F", "G", "I", "N", "S", "T", "ISC", "W", "INP", "PIE", "T20", "RET", "SIM", "ARG"]
56-
ignore = []
55+
select = ["A", "B", "C4", "D", "E", "F", "G", "I", "N", "S", "T", "ISC", "ICN", "W", "INP", "PIE", "T20", "RET", "SIM", "TID", "ARG", "ERA", "RUF", "YTT", "PL"]
56+
ignore = ["D100", "D102", "D104", "D105", "D107", "D203", "D213", "PIE790", "PLR2004"]
5757
fixable = ["A", "B", "C", "D", "E", "F"]
5858
unfixable = ["F401"]
5959
exclude = [
@@ -77,20 +77,21 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
7777
target-version = "py39"
7878

7979
[tool.ruff.per-file-ignores]
80-
"./hubconf.py" = ["INP001"]
81-
"./tests/test_utils.py" = ["S101"]
82-
"./tests/test_gradients.py" = ["S101"]
83-
"./tests/test_optimizers.py" = ["S101"]
84-
"./tests/test_optimizer_parameters.py" = ["S101"]
85-
"./tests/test_load_optimizers.py" = ["S101"]
86-
"./tests/test_load_lr_schedulers.py" = ["S101"]
87-
"./tests/test_lr_scheduler_parameters.py" = ["S101"]
80+
"./hubconf.py" = ["D", "INP001"]
81+
"./tests/__init__.py" = ["D"]
82+
"./tests/constants.py" = ["D"]
83+
"./tests/utils.py" = ["D"]
84+
"./tests/test_utils.py" = ["D", "S101"]
85+
"./tests/test_gradients.py" = ["D", "S101"]
86+
"./tests/test_optimizers.py" = ["D", "S101"]
87+
"./tests/test_optimizer_parameters.py" = ["D", "S101"]
88+
"./tests/test_load_optimizers.py" = ["D", "S101"]
89+
"./tests/test_load_lr_schedulers.py" = ["D", "S101"]
90+
"./tests/test_lr_schedulers.py" = ["D"]
91+
"./tests/test_lr_scheduler_parameters.py" = ["D", "S101"]
8892
"./pytorch_optimizer/__init__.py" = ["F401"]
8993
"./pytorch_optimizer/lr_scheduler/__init__.py" = ["F401"]
9094

91-
[tool.ruff.mccabe]
92-
max-complexity = 10
93-
9495
[tool.coverage.run]
9596
omit = [
9697
"./pytorch_optimizer/optimizer/gsam.py",

pytorch_optimizer/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Dict, List
33

44
from pytorch_optimizer.base.types import OPTIMIZER, SCHEDULER
5+
from pytorch_optimizer.experimental.deberta_v3_lr_scheduler import deberta_v3_large_lr_scheduler
56
from pytorch_optimizer.lr_scheduler import (
67
ConstantLR,
78
CosineAnnealingLR,

pytorch_optimizer/base/exception.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class NoSparseGradientError(Exception):
2-
"""Raised when the gradient is sparse gradient
2+
"""Raised when the gradient is sparse gradient.
33
44
:param optimizer_name: str. optimizer name.
55
:param note: str. special conditions to note (default '').
@@ -12,23 +12,23 @@ def __init__(self, optimizer_name: str, note: str = ''):
1212

1313

1414
class ZeroParameterSizeError(Exception):
15-
"""Raised when the parameter size is 0"""
15+
"""Raised when the parameter size is 0."""
1616

1717
def __init__(self):
1818
self.message: str = '[-] parameter size is 0'
1919
super().__init__(self.message)
2020

2121

2222
class NoClosureError(Exception):
23-
"""Raised when there's no closure function"""
23+
"""Raised when there's no closure function."""
2424

2525
def __init__(self, optimizer_name: str):
2626
self.message: str = f'[-] {optimizer_name} requires closure.'
2727
super().__init__(self.message)
2828

2929

3030
class NegativeLRError(Exception):
31-
"""Raised when learning rate is negative"""
31+
"""Raised when learning rate is negative."""
3232

3333
def __init__(self, lr: float, lr_type: str = ''):
3434
self.note: str = 'learning rate' if lr_type == '' else lr_type
@@ -37,7 +37,7 @@ def __init__(self, lr: float, lr_type: str = ''):
3737

3838

3939
class NegativeStepError(Exception):
40-
"""Raised when step is negative"""
40+
"""Raised when step is negative."""
4141

4242
def __init__(self, num_steps: int, step_type: str = ''):
4343
self.note: str = 'step' if step_type == '' else step_type

pytorch_optimizer/base/optimizer.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88

99
class BaseOptimizer(ABC):
10+
r"""Base optimizer class."""
11+
1012
@staticmethod
1113
def validate_learning_rate(learning_rate: float):
1214
if learning_rate < 0.0:
@@ -90,7 +92,7 @@ def validate_reduction(reduction: str):
9092
@staticmethod
9193
def validate_update_frequency(update_frequency: int):
9294
if update_frequency < 1:
93-
raise NegativeStepError(f'[-] update_frequency {update_frequency} must be positive')
95+
raise NegativeStepError(update_frequency, step_type='update_frequency')
9496

9597
@staticmethod
9698
def validate_norm(norm: float):

pytorch_optimizer/base/scheduler.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77

88
class BaseLinearWarmupScheduler(ABC):
9-
r"""BaseLinearWarmupScheduler class. The LR Scheduler class based on this class has linear warmup strategy.
9+
r"""BaseLinearWarmupScheduler class.
10+
11+
The LR Scheduler class based on this class has linear warmup strategy.
1012
1113
:param optimizer: Optimizer. OPTIMIZER. It will set learning rate to all trainable parameters in optimizer.
1214
:param t_max: int. total steps to train.

pytorch_optimizer/experimental/deberta_v3_lr_scheduler.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,33 @@
55

66
def deberta_v3_large_lr_scheduler(
77
model: nn.Module,
8+
layer_low_threshold: int = 195,
9+
layer_middle_threshold: int = 323,
810
head_param_start: int = 390,
911
base_lr: float = 2e-5,
1012
head_lr: float = 1e-4,
1113
wd: float = 1e-2,
1214
) -> PARAMETERS:
13-
"""DeBERTa-v3 large layer-wise lr scheduler
14-
Reference : https://github.com/gilfernandes/commonlit
15+
"""DeBERTa-v3 large layer-wise lr scheduler.
16+
17+
Reference : https://github.com/gilfernandes/commonlit.
1518
1619
:param model: nn.Module. model. based on Huggingface Transformers.
17-
:param head_param_start: int. where the backbone ends (head starts)
18-
:param base_lr: float. base lr
19-
:param head_lr: float. head_lr
20-
:param wd: float. weight decay
20+
:param layer_low_threshold: int. start of the 12 layers.
21+
:param layer_middle_threshold: int. end of the 24 layers.
22+
:param head_param_start: int. where the backbone ends (head starts).
23+
:param base_lr: float. base lr.
24+
:param head_lr: float. head_lr.
25+
:param wd: float. weight decay.
2126
"""
2227
named_parameters = list(model.named_parameters())
2328

2429
backbone_parameters = named_parameters[:head_param_start]
25-
regressor_parameters = named_parameters[head_param_start:]
26-
27-
regressor_group = [params for (_, params) in regressor_parameters]
30+
head_parameters = named_parameters[head_param_start:]
2831

29-
parameters = [{'params': regressor_group, 'lr': head_lr}]
32+
head_group = [params for (_, params) in head_parameters]
3033

31-
layer_low_threshold: int = 195 # start of the 12 layers
32-
layer_middle_threshold: int = 323 # end of the 24 layers
34+
parameters = [{'params': head_group, 'lr': head_lr}]
3335

3436
for layer_num, (name, params) in enumerate(backbone_parameters):
3537
weight_decay: float = 0.0 if ('bias' in name) or ('LayerNorm.weight' in name) else wd

pytorch_optimizer/lr_scheduler/chebyshev.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,29 @@
22

33

44
def chebyshev_steps(small_m: float, big_m: float, num_epochs: int) -> np.ndarray:
5-
r"""chebyshev_steps
5+
r"""Chebyshev steps.
66
77
:param small_m: float. stands for 'm' notation.
88
:param big_m: float. stands for 'M' notation.
99
:param num_epochs: int. stands for 'T' notation.
1010
:return: np.array. chebyshev_steps.
1111
"""
12-
1312
c, r = (big_m + small_m) / 2.0, (big_m - small_m) / 2.0
1413
thetas = (np.arange(num_epochs) + 0.5) / num_epochs * np.pi
1514

1615
return 1.0 / (c - r * np.cos(thetas))
1716

1817

1918
def chebyshev_perm(num_epochs: int) -> np.ndarray:
19+
r"""Chebyshev permutation."""
2020
perm = np.array([0])
2121
while len(perm) < num_epochs:
2222
perm = np.vstack([perm, 2 * len(perm) - 1 - perm]).T.flatten()
2323
return perm
2424

2525

2626
def get_chebyshev_schedule(num_epochs: int) -> np.ndarray:
27+
r"""Get Chebyshev schedules."""
2728
steps: np.ndarray = chebyshev_steps(0.1, 1, num_epochs - 2)
2829
perm: np.ndarray = chebyshev_perm(num_epochs - 2)
2930
return steps[perm]

pytorch_optimizer/lr_scheduler/cosine_anealing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
class CosineAnnealingWarmupRestarts(_LRScheduler):
10-
r"""CosineAnnealingWarmupRestarts
10+
r"""CosineAnnealingWarmupRestarts.
1111
1212
:param optimizer: Optimizer. wrapped optimizer instance.
1313
:param first_cycle_steps: int. first cycle step size.

pytorch_optimizer/lr_scheduler/linear_warmup.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,24 @@
66

77

88
class LinearScheduler(BaseLinearWarmupScheduler):
9+
r"""Linear LR Scheduler w/ linear warmup."""
10+
911
def _step(self) -> float:
1012
return self.max_lr + (self.min_lr - self.max_lr) * (self.step_t - self.warmup_steps) / (
1113
self.total_steps - self.warmup_steps
1214
)
1315

1416

1517
class CosineScheduler(BaseLinearWarmupScheduler):
18+
r"""Cosine LR Scheduler w/ linear warmup."""
19+
1620
def _step(self) -> float:
1721
phase: float = (self.step_t - self.warmup_steps) / (self.total_steps - self.warmup_steps) * math.pi
1822
return self.min_lr + (self.max_lr - self.min_lr) * (np.cos(phase) + 1.0) / 2.0
1923

2024

2125
class PolyScheduler(BaseLinearWarmupScheduler):
22-
r"""Poly LR Scheduler
26+
r"""Poly LR Scheduler.
2327
2428
:param: poly_order: float. lr scheduler decreases with steps.
2529
"""

0 commit comments

Comments
 (0)