lightning/tests/trainer/test_progress.py

109 lines
3.6 KiB
Python
Raw Normal View History

# Copyright The PyTorch Lightning team.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from copy import deepcopy
import pytest
from pytorch_lightning.trainer.progress import (
BaseProgress,
OptimizerProgress,
ProcessedTracker,
Progress,
ReadyCompletedTracker,
StartedTracker,
)
def test_tracker_reset():
p = StartedTracker(ready=1, started=2)
p.reset()
assert p == StartedTracker()
def test_tracker_reset_on_restart():
t = StartedTracker(ready=3, started=3, completed=2)
t.reset_on_restart()
assert t == StartedTracker(ready=2, started=2, completed=2)
t = ProcessedTracker(ready=4, started=4, processed=3, completed=2)
t.reset_on_restart()
assert t == ProcessedTracker(ready=2, started=2, processed=2, completed=2)
@pytest.mark.parametrize("attr", ("ready", "started", "processed", "completed"))
def test_progress_increment(attr):
p = Progress()
fn = getattr(p, f"increment_{attr}")
fn()
expected = ProcessedTracker(**{attr: 1})
assert p.total == expected
assert p.current == expected
def test_progress_from_defaults():
actual = Progress.from_defaults(StartedTracker, completed=5)
expected = Progress(total=StartedTracker(completed=5), current=StartedTracker(completed=5))
assert actual == expected
def test_progress_increment_sequence():
"""Test sequence for incrementing."""
Add progress tracking on Loops - 2/n (#8362) * resolve issues * update * update * update * add more exceptions * resolve bug * update * update * update changelog * resolve bug * resolve comments * update * update * update changelog * update * update * remove space * update * add progress tracking to loops * validate json * update * convert to dict for better readability * validate reload * update * update * update on comments * remove deadcode * clean changelog * clean changelog * update * update on comments * CHANGELOG * CHANGELOG * Update pytorch_lightning/loops/base.py Co-authored-by: Carlos Mocholí <carlossmocholi@gmail.com> * whitespace suggestions * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * make fault_tolerant_enabled protected * whitespace fixes around Args * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * update * typo it's -> its * fix copy-paste typo in progress docstring * Delete classes * Minor change * docs * protected get_loops_state * merge restore_loops with restore_progress * Fix tests after removals * explicit save with trainer.save_checkpoint() * handle optimization restart based on optimizer_idx * update increments * update val batch progress and remove iteration count * update progress tracking for dataloader loops * remove self.dataloader_idx from eval_epoch_loop * add batch progress to predict loop * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * incorporate progress tracking for current_epoch * Fix test * Actually remove it * Remove unused TrainingEpochProgress * Fix optimization progress - missing scheduler * Restarting changes * Scheduler progress * Unused property, reset on epoch * Resolve FIXME * Remove FIXME * fix test_progress (wip) * fix batch_progress.current.reset * Hold off on split progress. Out of scope of this PR * Unnecessary if * fix structure in test_progress * structure * clean up unused variables in test_progress * refactor naming and organization in test_progress * Unnecessary variable * Remove unnecessary diff * Improve comment * Undo typing change to avoid polluting everything with mypy fixes * Fix and improve test_loops.py * Fix and organize `test_loop_state_dict` * Remove unnecessary checks in test * Update test after disallowing updates on None attributes * Typing * Minor test cleanup * Fix and move loop test * Move test from progress to loops * Reset the scheduler progress * SchedulerProgress fix * Consistent whitespace * Fix final test * Minor test changes * One test to rule them all * Formatting * Rename and clean variables * Shorter names * Shorter scheduler name * Fix optimizer step calculation for stop_batch=2 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Remove empty connects * Update CHANGELOG * Holy shit finally got the formula right * Fix final thing!!! * Do not check state dicts * parametrize multiple_dataloader progress test * Update CHANGELOG.md Co-authored-by: Carlos Mocholi <carlossmocholi@gmail.com> Co-authored-by: Adrian Wälchli <aedu.waelchli@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Justus Schock <justus.schock@posteo.de>
2021-07-19 08:31:45 +00:00
batch = Progress()
batch.increment_ready()
assert batch.total == ProcessedTracker(ready=1)
assert batch.current == ProcessedTracker(ready=1)
batch.increment_started()
assert batch.total == ProcessedTracker(ready=1, started=1)
assert batch.current == ProcessedTracker(ready=1, started=1)
batch.increment_processed()
assert batch.total == ProcessedTracker(ready=1, started=1, processed=1)
assert batch.current == ProcessedTracker(ready=1, started=1, processed=1)
batch.increment_completed()
assert batch.total == ProcessedTracker(ready=1, started=1, processed=1, completed=1)
assert batch.current == ProcessedTracker(ready=1, started=1, processed=1, completed=1)
def test_progress_raises():
with pytest.raises(ValueError, match="instances should be of the same class"):
Progress(ReadyCompletedTracker(), ProcessedTracker())
p = Progress(ReadyCompletedTracker(), ReadyCompletedTracker())
with pytest.raises(TypeError, match="ReadyCompletedTracker` doesn't have a `started` attribute"):
p.increment_started()
with pytest.raises(TypeError, match="ReadyCompletedTracker` doesn't have a `processed` attribute"):
p.increment_processed()
def test_optimizer_progress_default_factory():
2022-02-17 01:27:51 +00:00
"""Ensure that the defaults are created appropriately.
If `default_factory` was not used, the default would be shared between instances.
"""
p1 = OptimizerProgress()
p2 = OptimizerProgress()
p1.step.increment_completed()
assert p1.step.total.completed == p1.step.current.completed
assert p1.step.total.completed == 1
assert p2.step.total.completed == 0
Add progress tracking on Loops - 2/n (#8362) * resolve issues * update * update * update * add more exceptions * resolve bug * update * update * update changelog * resolve bug * resolve comments * update * update * update changelog * update * update * remove space * update * add progress tracking to loops * validate json * update * convert to dict for better readability * validate reload * update * update * update on comments * remove deadcode * clean changelog * clean changelog * update * update on comments * CHANGELOG * CHANGELOG * Update pytorch_lightning/loops/base.py Co-authored-by: Carlos Mocholí <carlossmocholi@gmail.com> * whitespace suggestions * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * make fault_tolerant_enabled protected * whitespace fixes around Args * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * update * typo it's -> its * fix copy-paste typo in progress docstring * Delete classes * Minor change * docs * protected get_loops_state * merge restore_loops with restore_progress * Fix tests after removals * explicit save with trainer.save_checkpoint() * handle optimization restart based on optimizer_idx * update increments * update val batch progress and remove iteration count * update progress tracking for dataloader loops * remove self.dataloader_idx from eval_epoch_loop * add batch progress to predict loop * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * incorporate progress tracking for current_epoch * Fix test * Actually remove it * Remove unused TrainingEpochProgress * Fix optimization progress - missing scheduler * Restarting changes * Scheduler progress * Unused property, reset on epoch * Resolve FIXME * Remove FIXME * fix test_progress (wip) * fix batch_progress.current.reset * Hold off on split progress. Out of scope of this PR * Unnecessary if * fix structure in test_progress * structure * clean up unused variables in test_progress * refactor naming and organization in test_progress * Unnecessary variable * Remove unnecessary diff * Improve comment * Undo typing change to avoid polluting everything with mypy fixes * Fix and improve test_loops.py * Fix and organize `test_loop_state_dict` * Remove unnecessary checks in test * Update test after disallowing updates on None attributes * Typing * Minor test cleanup * Fix and move loop test * Move test from progress to loops * Reset the scheduler progress * SchedulerProgress fix * Consistent whitespace * Fix final test * Minor test changes * One test to rule them all * Formatting * Rename and clean variables * Shorter names * Shorter scheduler name * Fix optimizer step calculation for stop_batch=2 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Remove empty connects * Update CHANGELOG * Holy shit finally got the formula right * Fix final thing!!! * Do not check state dicts * parametrize multiple_dataloader progress test * Update CHANGELOG.md Co-authored-by: Carlos Mocholi <carlossmocholi@gmail.com> Co-authored-by: Adrian Wälchli <aedu.waelchli@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Justus Schock <justus.schock@posteo.de>
2021-07-19 08:31:45 +00:00
def test_deepcopy():
_ = deepcopy(BaseProgress())
_ = deepcopy(Progress())
_ = deepcopy(ProcessedTracker())