From 4b374c4866ed14eb5b20bb8ff8abb3c5e536c342 Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 3 Dec 2021 22:03:07 +0530 Subject: [PATCH 01/11] Fix frozen dataclass instance error in apply_to_collection function --- pytorch_lightning/utilities/apply_func.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index aeefc048fe5f4..c776d37ad1769 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -144,7 +144,7 @@ def apply_to_collection( ) if not field_init or (not include_none and v is None): # retain old value v = getattr(data, field_name) - setattr(result, field_name, v) + object.__setattr__(result, field_name, v) return result # data is neither of dtype, nor a collection From 7ba3ecabf296786b75ddbd4ef74310bcb8572190 Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 10 Dec 2021 20:53:40 +0530 Subject: [PATCH 02/11] fix: remove object.__setattr__ and raise error instead --- pytorch_lightning/utilities/apply_func.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index c776d37ad1769..4bcdc8e2334e8 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -144,7 +144,10 @@ def apply_to_collection( ) if not field_init or (not include_none and v is None): # retain old value v = getattr(data, field_name) - object.__setattr__(result, field_name, v) + try: + setattr(result, field_name, v) + except: + raise dataclasses.FrozenInstanceError("Cannot apply function to Frozen dataclass instance") return result # data is neither of dtype, nor a collection From 7f3b9447cc4a8c31d9bb6784fb4d665ea0c154a9 Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 10 Dec 2021 15:32:33 +0530 Subject: [PATCH 03/11] fix: remove bare except --- pytorch_lightning/utilities/apply_func.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index 4bcdc8e2334e8..e643ef6c97f44 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -16,7 +16,7 @@ from abc import ABC from collections import defaultdict, OrderedDict from collections.abc import Mapping, Sequence -from copy import copy, deepcopy +from copy import Error, copy, deepcopy from functools import partial from typing import Any, Callable, List, Optional, Tuple, Union @@ -146,7 +146,7 @@ def apply_to_collection( v = getattr(data, field_name) try: setattr(result, field_name, v) - except: + except Exception: raise dataclasses.FrozenInstanceError("Cannot apply function to Frozen dataclass instance") return result From ee9445a8f020764dc492b1f2e836319812fc1899 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 10 Dec 2021 10:04:55 +0000 Subject: [PATCH 04/11] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pytorch_lightning/utilities/apply_func.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index e643ef6c97f44..235e65c4a263b 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -16,7 +16,7 @@ from abc import ABC from collections import defaultdict, OrderedDict from collections.abc import Mapping, Sequence -from copy import Error, copy, deepcopy +from copy import copy, deepcopy, Error from functools import partial from typing import Any, Callable, List, Optional, Tuple, Union From 8ae6eef62229ce4fdf45695f7dedda23a4765642 Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 10 Dec 2021 15:39:04 +0530 Subject: [PATCH 05/11] fix: remove unused imports --- pytorch_lightning/utilities/apply_func.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index e643ef6c97f44..eff1e6a12b744 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -16,7 +16,7 @@ from abc import ABC from collections import defaultdict, OrderedDict from collections.abc import Mapping, Sequence -from copy import Error, copy, deepcopy +from copy import copy, deepcopy from functools import partial from typing import Any, Callable, List, Optional, Tuple, Union From fb376bbd05c964df5ddae15c0688cb06fee0b07c Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 10 Dec 2021 15:51:37 +0530 Subject: [PATCH 06/11] fix: remove unused imports --- pytorch_lightning/utilities/apply_func.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index 235e65c4a263b..eff1e6a12b744 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -16,7 +16,7 @@ from abc import ABC from collections import defaultdict, OrderedDict from collections.abc import Mapping, Sequence -from copy import copy, deepcopy, Error +from copy import copy, deepcopy from functools import partial from typing import Any, Callable, List, Optional, Tuple, Union From 05803f1e8208a0bbdbdb5f35a133a45e8da0b314 Mon Sep 17 00:00:00 2001 From: Abhishek Saroha Date: Fri, 10 Dec 2021 22:43:28 +0530 Subject: [PATCH 07/11] Update pytorch_lightning/utilities/apply_func.py Co-authored-by: Justus Schock <12886177+justusschock@users.noreply.github.com> --- pytorch_lightning/utilities/apply_func.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index eff1e6a12b744..f6ca5806fbd9e 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -146,7 +146,7 @@ def apply_to_collection( v = getattr(data, field_name) try: setattr(result, field_name, v) - except Exception: + except dataclasses.FrozenInstanceError: raise dataclasses.FrozenInstanceError("Cannot apply function to Frozen dataclass instance") return result From b79b3e5a5e2ddb20a429b645c619843182f00fdb Mon Sep 17 00:00:00 2001 From: Carlos Mocholi Date: Wed, 5 Jan 2022 22:05:35 +0100 Subject: [PATCH 08/11] Use Misconfig --- pytorch_lightning/utilities/apply_func.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index f6ca5806fbd9e..6308f0ce9d3db 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -23,6 +23,7 @@ import numpy as np import torch +from pytorch_lightning.utilities.exceptions import MisconfigurationException from pytorch_lightning.utilities.imports import _compare_version, _TORCHTEXT_LEGACY from pytorch_lightning.utilities.warnings import rank_zero_deprecation @@ -146,8 +147,11 @@ def apply_to_collection( v = getattr(data, field_name) try: setattr(result, field_name, v) - except dataclasses.FrozenInstanceError: - raise dataclasses.FrozenInstanceError("Cannot apply function to Frozen dataclass instance") + except dataclasses.FrozenInstanceError as e: + raise MisconfigurationException( + "A frozen dataclass was passed to `apply_to_collection`, This is not supported." + " HINT: is your batch a frozen dataclass?" + ) from e return result # data is neither of dtype, nor a collection From 1d8a1bfedb3ee9a023664f0d4bed50ce9388e4ca Mon Sep 17 00:00:00 2001 From: Carlos Mocholi Date: Wed, 5 Jan 2022 22:05:43 +0100 Subject: [PATCH 09/11] Add test --- tests/utilities/test_apply_func.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/utilities/test_apply_func.py b/tests/utilities/test_apply_func.py index 9b0fcbd643744..869a3bb619ad5 100644 --- a/tests/utilities/test_apply_func.py +++ b/tests/utilities/test_apply_func.py @@ -22,6 +22,7 @@ import torch from pytorch_lightning.utilities.apply_func import apply_to_collection, apply_to_collections, move_data_to_device +from pytorch_lightning.utilities.exceptions import MisconfigurationException def test_recursive_application_to_collection(): @@ -302,6 +303,17 @@ def fn(a, b): assert reduced is None +def test_apply_to_collection_frozen_dataclass(): + @dataclasses.dataclass(frozen=True) + class Foo: + input: torch.Tensor + + foo = Foo(torch.tensor(0)) + + with pytest.raises(MisconfigurationException, match="frozen dataclass was passed"): + apply_to_collection(foo, torch.Tensor, lambda t: t.to(torch.int)) + + @pytest.mark.parametrize("should_return", [False, True]) def test_wrongly_implemented_transferable_data_type(should_return): class TensorObject: From cef750e82440f3b19b140b0d5009773b0eab5f4a Mon Sep 17 00:00:00 2001 From: Carlos Mocholi Date: Wed, 5 Jan 2022 22:06:53 +0100 Subject: [PATCH 10/11] Reword --- pytorch_lightning/utilities/apply_func.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytorch_lightning/utilities/apply_func.py b/pytorch_lightning/utilities/apply_func.py index 6308f0ce9d3db..77086126b627c 100644 --- a/pytorch_lightning/utilities/apply_func.py +++ b/pytorch_lightning/utilities/apply_func.py @@ -149,7 +149,7 @@ def apply_to_collection( setattr(result, field_name, v) except dataclasses.FrozenInstanceError as e: raise MisconfigurationException( - "A frozen dataclass was passed to `apply_to_collection`, This is not supported." + "A frozen dataclass was passed to `apply_to_collection` but this is not allowed." " HINT: is your batch a frozen dataclass?" ) from e return result From 4405bc957dbf31bb54071de7e8413a58773602b4 Mon Sep 17 00:00:00 2001 From: Carlos Mocholi Date: Wed, 5 Jan 2022 22:08:23 +0100 Subject: [PATCH 11/11] CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ed0408bfbb15..c07b29958a6bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Show a better error message when a custom `DataLoader` implementation is not well implemented and we need to reconstruct it ([#10719](https://github.com/PyTorchLightning/pytorch-lightning/issues/10719)) +- Show a better error message when frozen dataclass is used as a batch ([#10927](https://github.com/PyTorchLightning/pytorch-lightning/issues/10927)) + + - Added support for `--lr_scheduler=ReduceLROnPlateau` to the `LightningCLI` ([#10860](https://github.com/PyTorchLightning/pytorch-lightning/issues/10860))