Skip to content

Commit e7b6f0f

Browse files
committed
Merge branch 'master' into refactor/epoch-end-hook-removal
2 parents cc1d2ca + 8fc4fb1 commit e7b6f0f

File tree

9 files changed

+298
-241
lines changed

9 files changed

+298
-241
lines changed

src/lightning_app/cli/lightning_cli.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,8 @@ def run_app(
389389
)
390390

391391

392-
if RequirementCache("lightning-fabric>=1.9.0.dev0") or RequirementCache("lightning>=1.9.0.dev0"):
393-
# lightning.fabric.cli may not be available when installing only standalone lightning-app package
392+
if RequirementCache("lightning-fabric>=1.9.0") or RequirementCache("lightning>=1.9.0"):
393+
# note it is automatically replaced to `from lightning.fabric.cli` when building monolithic/mirror package
394394
from lightning_fabric.cli import _run_model
395395

396396
run.add_command(_run_model)

src/version.info

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.9.0
1+
2.0.0dev

tests/tests_pytorch/accelerators/test_hpu.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,6 @@
2929
from tests_pytorch.helpers.simple_models import ClassificationModel
3030

3131

32-
class HPUTestModel(BoringModel):
33-
def configure_optimizers(self):
34-
opt_a = torch.optim.Adam(self.layer.parameters(), lr=0.001)
35-
opt_b = torch.optim.SGD(self.layer.parameters(), lr=0.001)
36-
return opt_a, opt_b
37-
38-
3932
@RunIf(hpu=True)
4033
def test_availability():
4134
assert HPUAccelerator.is_available()
@@ -277,17 +270,26 @@ def test_strategy_params_with_hpu_parallel_strategy():
277270

278271
@RunIf(hpu=True)
279272
def test_multi_optimizers_with_hpu(tmpdir):
280-
class TestModel(HPUTestModel):
281-
282-
optims = [False, False]
283-
284-
def training_step(self, batch, batch_idx, optimizer_idx):
285-
self.optims[optimizer_idx] = True
286-
return super().training_step(batch, batch_idx)
273+
class MultiOptimizerModel(BoringModel):
274+
def configure_optimizers(self):
275+
opt_a = torch.optim.Adam(self.layer.parameters(), lr=0.001)
276+
opt_b = torch.optim.SGD(self.layer.parameters(), lr=0.001)
277+
return opt_a, opt_b
287278

288-
model = TestModel()
279+
def training_step(self, batch, batch_idx):
280+
opt1, opt2 = self.optimizers()
281+
loss = self.loss(self.step(batch))
282+
opt1.zero_grad()
283+
self.manual_backward(loss)
284+
opt1.step()
285+
loss = self.loss(self.step(batch))
286+
opt2.zero_grad()
287+
self.manual_backward(loss)
288+
opt2.step()
289+
290+
model = MultiOptimizerModel()
291+
model.automatic_optimization = False
289292
model.val_dataloader = None
290-
291293
trainer = Trainer(
292294
default_root_dir=tmpdir,
293295
accelerator="hpu",
@@ -300,11 +302,9 @@ def training_step(self, batch, batch_idx, optimizer_idx):
300302
)
301303
trainer.fit(model)
302304

303-
assert all(model.optims)
304-
305305

306306
@RunIf(hpu=True)
307-
def test_hpu_device_stats_monitor(tmpdir):
307+
def test_hpu_device_stats_monitor():
308308

309309
hpu_stats = HPUAccelerator().get_device_stats("hpu")
310310
fields = [

tests/tests_pytorch/callbacks/test_lr_monitor.py

Lines changed: 82 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,27 @@ def test_lr_monitor_multi_lrs(tmpdir, logging_interval: str):
218218
"""Test that learning rates are extracted and logged for multi lr schedulers."""
219219

220220
class CustomBoringModel(BoringModel):
221-
def training_step(self, batch, batch_idx, optimizer_idx):
222-
return super().training_step(batch, batch_idx)
221+
def __init__(self):
222+
super().__init__()
223+
self.automatic_optimization = False
224+
225+
def training_step(self, batch, batch_idx):
226+
opt1, opt2 = self.optimizers()
227+
228+
loss = self.loss(self.step(batch))
229+
opt1.zero_grad()
230+
self.manual_backward(loss)
231+
opt1.step()
232+
233+
loss = self.loss(self.step(batch))
234+
opt2.zero_grad()
235+
self.manual_backward(loss)
236+
opt2.step()
237+
238+
def on_train_epoch_end(self):
239+
scheduler1, scheduler2 = self.lr_schedulers()
240+
scheduler1.step()
241+
scheduler2.step()
223242

224243
def configure_optimizers(self):
225244
optimizer1 = optim.Adam(self.parameters(), lr=1e-2)
@@ -262,8 +281,22 @@ def test_lr_monitor_no_lr_scheduler_multi_lrs(tmpdir, logging_interval: str):
262281
"""Test that learning rates are extracted and logged for multi optimizers but no lr scheduler."""
263282

264283
class CustomBoringModel(BoringModel):
265-
def training_step(self, batch, batch_idx, optimizer_idx):
266-
return super().training_step(batch, batch_idx)
284+
def __init__(self):
285+
super().__init__()
286+
self.automatic_optimization = False
287+
288+
def training_step(self, batch, batch_idx):
289+
opt1, opt2 = self.optimizers()
290+
291+
loss = self.loss(self.step(batch))
292+
opt1.zero_grad()
293+
self.manual_backward(loss)
294+
opt1.step()
295+
296+
loss = self.loss(self.step(batch))
297+
opt2.zero_grad()
298+
self.manual_backward(loss)
299+
opt2.step()
267300

268301
def configure_optimizers(self):
269302
optimizer1 = optim.Adam(self.parameters(), lr=1e-2)
@@ -421,22 +454,46 @@ def test_multiple_optimizers_basefinetuning(tmpdir):
421454
class TestModel(BoringModel):
422455
def __init__(self):
423456
super().__init__()
457+
self.automatic_optimization = False
424458
self.backbone = torch.nn.Sequential(
425459
torch.nn.Linear(32, 32), torch.nn.Linear(32, 32), torch.nn.Linear(32, 32), torch.nn.ReLU(True)
426460
)
427461
self.layer = torch.nn.Linear(32, 2)
428462

429-
def training_step(self, batch, batch_idx, optimizer_idx):
430-
return super().training_step(batch, batch_idx)
463+
def training_step(self, batch, batch_idx):
464+
opt1, opt2, opt3 = self.optimizers()
465+
466+
# optimizer 1
467+
loss = self.step(batch)
468+
self.manual_backward(loss)
469+
opt1.step()
470+
opt1.zero_grad()
471+
472+
# optimizer 2
473+
loss = self.step(batch)
474+
self.manual_backward(loss)
475+
opt2.step()
476+
opt2.zero_grad()
477+
478+
# optimizer 3
479+
loss = self.step(batch)
480+
self.manual_backward(loss)
481+
opt3.step()
482+
opt3.zero_grad()
483+
484+
def on_train_epoch_end(self) -> None:
485+
lr_sched1, lr_sched2 = self.lr_schedulers()
486+
lr_sched1.step()
487+
lr_sched2.step()
431488

432489
def forward(self, x):
433490
return self.layer(self.backbone(x))
434491

435492
def configure_optimizers(self):
436493
parameters = list(filter(lambda p: p.requires_grad, self.parameters()))
437-
opt = optim.Adam(parameters, lr=0.1)
494+
opt = optim.SGD(parameters, lr=0.1)
438495
opt_2 = optim.Adam(parameters, lr=0.1)
439-
opt_3 = optim.Adam(parameters, lr=0.1)
496+
opt_3 = optim.AdamW(parameters, lr=0.1)
440497
optimizers = [opt, opt_2, opt_3]
441498
schedulers = [
442499
optim.lr_scheduler.StepLR(opt, step_size=1, gamma=0.5),
@@ -452,24 +509,24 @@ def on_train_epoch_start(self, trainer, pl_module) -> None:
452509
assert num_param_groups == 3
453510
elif trainer.current_epoch == 1:
454511
assert num_param_groups == 4
455-
assert list(lr_monitor.lrs) == ["lr-Adam-1", "lr-Adam-2", "lr-Adam/pg1", "lr-Adam/pg2"]
512+
assert list(lr_monitor.lrs) == ["lr-Adam", "lr-AdamW", "lr-SGD/pg1", "lr-SGD/pg2"]
456513
elif trainer.current_epoch == 2:
457514
assert num_param_groups == 5
458515
assert list(lr_monitor.lrs) == [
459-
"lr-Adam-2",
516+
"lr-AdamW",
517+
"lr-SGD/pg1",
518+
"lr-SGD/pg2",
460519
"lr-Adam/pg1",
461520
"lr-Adam/pg2",
462-
"lr-Adam-1/pg1",
463-
"lr-Adam-1/pg2",
464521
]
465522
else:
466523
expected = [
467-
"lr-Adam-2",
524+
"lr-AdamW",
525+
"lr-SGD/pg1",
526+
"lr-SGD/pg2",
468527
"lr-Adam/pg1",
469528
"lr-Adam/pg2",
470-
"lr-Adam-1/pg1",
471-
"lr-Adam-1/pg2",
472-
"lr-Adam-1/pg3",
529+
"lr-Adam/pg3",
473530
]
474531
assert list(lr_monitor.lrs) == expected
475532

@@ -481,12 +538,12 @@ def freeze_before_training(self, pl_module):
481538

482539
def finetune_function(self, pl_module, epoch: int, optimizer, opt_idx: int):
483540
"""Called when the epoch begins."""
484-
if epoch == 1 and opt_idx == 0:
541+
if epoch == 1 and isinstance(optimizer, torch.optim.SGD):
485542
self.unfreeze_and_add_param_group(pl_module.backbone[0], optimizer, lr=0.1)
486-
if epoch == 2 and opt_idx == 1:
543+
if epoch == 2 and isinstance(optimizer, torch.optim.Adam):
487544
self.unfreeze_and_add_param_group(pl_module.layer, optimizer, lr=0.1)
488545

489-
if epoch == 3 and opt_idx == 1:
546+
if epoch == 3 and isinstance(optimizer, torch.optim.Adam):
490547
assert len(optimizer.param_groups) == 2
491548
self.unfreeze_and_add_param_group(pl_module.backbone[1], optimizer, lr=0.1)
492549
assert len(optimizer.param_groups) == 3
@@ -507,22 +564,22 @@ def finetune_function(self, pl_module, epoch: int, optimizer, opt_idx: int):
507564
trainer.fit(model)
508565

509566
expected = [0.1, 0.1, 0.1, 0.1, 0.1]
510-
assert lr_monitor.lrs["lr-Adam-2"] == expected
567+
assert lr_monitor.lrs["lr-AdamW"] == expected
511568

512569
expected = [0.1, 0.05, 0.025, 0.0125, 0.00625]
513-
assert lr_monitor.lrs["lr-Adam/pg1"] == expected
570+
assert lr_monitor.lrs["lr-SGD/pg1"] == expected
514571

515572
expected = [0.1, 0.05, 0.025, 0.0125]
516-
assert lr_monitor.lrs["lr-Adam/pg2"] == expected
573+
assert lr_monitor.lrs["lr-SGD/pg2"] == expected
517574

518575
expected = [0.1, 0.05, 0.025, 0.0125, 0.00625]
519-
assert lr_monitor.lrs["lr-Adam-1/pg1"] == expected
576+
assert lr_monitor.lrs["lr-Adam/pg1"] == expected
520577

521578
expected = [0.1, 0.05, 0.025]
522-
assert lr_monitor.lrs["lr-Adam-1/pg2"] == expected
579+
assert lr_monitor.lrs["lr-Adam/pg2"] == expected
523580

524581
expected = [0.1, 0.05]
525-
assert lr_monitor.lrs["lr-Adam-1/pg3"] == expected
582+
assert lr_monitor.lrs["lr-Adam/pg3"] == expected
526583

527584

528585
def test_lr_monitor_multiple_param_groups_no_lr_scheduler(tmpdir):

0 commit comments

Comments
 (0)