Skip to content

Commit a50e173

Browse files
authored
Merge pull request #63 from kozistr/fix/ranger21
[Bug] Not to assign a default value (None) to `num_iterations` parameter
2 parents 4a7c8d4 + 7de15fc commit a50e173

File tree

3 files changed

+64
-49
lines changed

3 files changed

+64
-49
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "pytorch_optimizer"
3-
version = "1.1.1"
3+
version = "1.1.2"
44
description = "Bunch of optimizer implementations in PyTorch with clean-code, strict types. Also, including useful optimization ideas."
55
license = "Apache-2.0"
66
authors = ["kozistr <[email protected]>"]

pytorch_optimizer/ranger21.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ class Ranger21(Optimizer, BaseOptimizer):
4141
def __init__(
4242
self,
4343
params: PARAMETERS,
44+
num_iterations: int,
4445
lr: float = 1e-3,
4546
beta0: float = 0.9,
4647
betas: BETAS = (0.9, 0.999),
4748
use_softplus: bool = True,
4849
beta_softplus: float = 50.0,
49-
num_iterations: Optional[int] = None,
5050
num_warm_up_iterations: Optional[int] = None,
5151
num_warm_down_iterations: Optional[int] = None,
5252
warm_down_min_lr: float = 3e-5,
@@ -68,8 +68,8 @@ def __init__(
6868
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace
6969
:param use_softplus: bool. use softplus to smooth
7070
:param beta_softplus: float. beta
71-
:param agc_clipping_value: float
72-
:param agc_eps: float
71+
:param agc_clipping_value: float.
72+
:param agc_eps: float. eps for AGC
7373
:param centralize_gradients: bool. use GC both convolution & fc layers
7474
:param normalize_gradients: bool. use gradient normalization
7575
:param lookahead_merge_time: int. merge time

tests/test_optimizer_parameters.py

Lines changed: 60 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -40,100 +40,115 @@
4040
]
4141

4242

43-
@pytest.mark.parametrize('optimizer_names', OPTIMIZER_NAMES + ['nero'])
44-
def test_learning_rate(optimizer_names):
43+
@pytest.mark.parametrize('optimizer_name', OPTIMIZER_NAMES + ['nero'])
44+
def test_learning_rate(optimizer_name):
45+
optimizer = load_optimizer(optimizer_name)
46+
4547
with pytest.raises(ValueError):
46-
optimizer = load_optimizer(optimizer_names)
47-
optimizer(None, lr=-1e-2)
48+
if optimizer_name == 'ranger21':
49+
optimizer(None, num_iterations=100, lr=-1e-2)
50+
else:
51+
optimizer(None, lr=-1e-2)
52+
4853

54+
@pytest.mark.parametrize('optimizer_name', OPTIMIZER_NAMES)
55+
def test_epsilon(optimizer_name):
56+
optimizer = load_optimizer(optimizer_name)
4957

50-
@pytest.mark.parametrize('optimizer_names', OPTIMIZER_NAMES)
51-
def test_epsilon(optimizer_names):
5258
with pytest.raises(ValueError):
53-
optimizer = load_optimizer(optimizer_names)
54-
optimizer(None, eps=-1e-6)
59+
if optimizer_name == 'ranger21':
60+
optimizer(None, num_iterations=100, eps=-1e-6)
61+
else:
62+
optimizer(None, eps=-1e-6)
5563

5664

57-
@pytest.mark.parametrize('optimizer_names', OPTIMIZER_NAMES)
58-
def test_weight_decay(optimizer_names):
65+
@pytest.mark.parametrize('optimizer_name', OPTIMIZER_NAMES)
66+
def test_weight_decay(optimizer_name):
67+
optimizer = load_optimizer(optimizer_name)
68+
5969
with pytest.raises(ValueError):
60-
optimizer = load_optimizer(optimizer_names)
61-
optimizer(None, weight_decay=-1e-3)
70+
if optimizer_name == 'ranger21':
71+
optimizer(None, num_iterations=100, weight_decay=-1e-3)
72+
else:
73+
optimizer(None, weight_decay=-1e-3)
6274

6375

64-
@pytest.mark.parametrize('optimizer_names', ['adamp', 'sgdp'])
65-
def test_wd_ratio(optimizer_names):
76+
@pytest.mark.parametrize('optimizer_name', ['adamp', 'sgdp'])
77+
def test_wd_ratio(optimizer_name):
78+
optimizer = load_optimizer(optimizer_name)
6679
with pytest.raises(ValueError):
67-
optimizer = load_optimizer(optimizer_names)
6880
optimizer(None, wd_ratio=-1e-3)
6981

7082

71-
@pytest.mark.parametrize('optimizer_names', ['lars'])
72-
def test_trust_coefficient(optimizer_names):
83+
@pytest.mark.parametrize('optimizer_name', ['lars'])
84+
def test_trust_coefficient(optimizer_name):
85+
optimizer = load_optimizer(optimizer_name)
7386
with pytest.raises(ValueError):
74-
optimizer = load_optimizer(optimizer_names)
7587
optimizer(None, trust_coefficient=-1e-3)
7688

7789

78-
@pytest.mark.parametrize('optimizer_names', ['madgrad', 'lars'])
79-
def test_momentum(optimizer_names):
90+
@pytest.mark.parametrize('optimizer_name', ['madgrad', 'lars'])
91+
def test_momentum(optimizer_name):
92+
optimizer = load_optimizer(optimizer_name)
8093
with pytest.raises(ValueError):
81-
optimizer = load_optimizer(optimizer_names)
8294
optimizer(None, momentum=-1e-3)
8395

8496

85-
@pytest.mark.parametrize('optimizer_names', ['ranger'])
86-
def test_lookahead_k(optimizer_names):
97+
@pytest.mark.parametrize('optimizer_name', ['ranger'])
98+
def test_lookahead_k(optimizer_name):
99+
optimizer = load_optimizer(optimizer_name)
87100
with pytest.raises(ValueError):
88-
optimizer = load_optimizer(optimizer_names)
89101
optimizer(None, k=-1)
90102

91103

92-
@pytest.mark.parametrize('optimizer_names', ['ranger21'])
93-
def test_beta0(optimizer_names):
94-
optimizer = load_optimizer(optimizer_names)
95-
104+
@pytest.mark.parametrize('optimizer_name', ['ranger21'])
105+
def test_beta0(optimizer_name):
106+
optimizer = load_optimizer(optimizer_name)
96107
with pytest.raises(ValueError):
97108
optimizer(None, num_iterations=200, beta0=-0.1)
98109

99110

100-
@pytest.mark.parametrize('optimizer_names', ['nero'])
101-
def test_beta(optimizer_names):
102-
optimizer = load_optimizer(optimizer_names)
103-
111+
@pytest.mark.parametrize('optimizer_name', ['nero'])
112+
def test_beta(optimizer_name):
113+
optimizer = load_optimizer(optimizer_name)
104114
with pytest.raises(ValueError):
105115
optimizer(None, beta=-0.1)
106116

107117

108-
@pytest.mark.parametrize('optimizer_names', BETA_OPTIMIZER_NAMES)
109-
def test_betas(optimizer_names):
110-
optimizer = load_optimizer(optimizer_names)
118+
@pytest.mark.parametrize('optimizer_name', BETA_OPTIMIZER_NAMES)
119+
def test_betas(optimizer_name):
120+
optimizer = load_optimizer(optimizer_name)
111121

112122
with pytest.raises(ValueError):
113-
optimizer(None, betas=(-0.1, 0.1))
123+
if optimizer_name == 'ranger21':
124+
optimizer(None, num_iterations=100, betas=(-0.1, 0.1))
125+
else:
126+
optimizer(None, betas=(-0.1, 0.1))
114127

115128
with pytest.raises(ValueError):
116-
optimizer(None, betas=(0.1, -0.1))
129+
if optimizer_name == 'ranger21':
130+
optimizer(None, num_iterations=100, betas=(0.1, -0.1))
131+
else:
132+
optimizer(None, betas=(0.1, -0.1))
117133

118-
if optimizer_names == 'adapnm':
134+
if optimizer_name == 'adapnm':
119135
with pytest.raises(ValueError):
120136
optimizer(None, betas=(0.1, 0.1, -0.1))
121137

122138

123-
@pytest.mark.parametrize('optimizer_names', ['pcgrad'])
124-
def test_reduction(optimizer_names):
125-
model: nn.Module = Example()
126-
parameters = model.parameters()
139+
def test_reduction():
140+
parameters = Example().parameters()
127141
optimizer = load_optimizer('adamp')(parameters)
128142

129143
with pytest.raises(ValueError):
130144
PCGrad(optimizer, reduction='wrong')
131145

132146

133-
@pytest.mark.parametrize('optimizer_names', ['shampoo'])
134-
def test_update_frequency(optimizer_names):
147+
@pytest.mark.parametrize('optimizer_name', ['shampoo'])
148+
def test_update_frequency(optimizer_name):
149+
optimizer = load_optimizer(optimizer_name)
135150
with pytest.raises(ValueError):
136-
load_optimizer(optimizer_names)(None, update_freq=0)
151+
optimizer(None, update_freq=0)
137152

138153

139154
def test_sam_parameters():

0 commit comments

Comments
 (0)