From 9c425066d644f1e185968ceb531b3d18ac759bbe Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+drbeh@users.noreply.github.com> Date: Thu, 12 Aug 2021 20:59:14 +0000 Subject: [PATCH 1/6] Implement Range Signed-off-by: Behrooz <3968947+drbeh@users.noreply.github.com> --- monai/transforms/__init__.py | 4 +++ monai/transforms/nvtx.py | 49 +++++++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/monai/transforms/__init__.py b/monai/transforms/__init__.py index 33d7fba26e..6f9cad98f9 100644 --- a/monai/transforms/__init__.py +++ b/monai/transforms/__init__.py @@ -212,6 +212,10 @@ RandRangePushd, RandRangePushD, RandRangePushDict, + Range, + Ranged, + RangeD, + RangeDict, RangePop, RangePopd, RangePopD, diff --git a/monai/transforms/nvtx.py b/monai/transforms/nvtx.py index 12c03dc028..b24a1285a3 100644 --- a/monai/transforms/nvtx.py +++ b/monai/transforms/nvtx.py @@ -12,6 +12,8 @@ Wrapper around NVIDIA Tools Extension for profiling MONAI transformations """ +from typing import Optional + from monai.transforms.transform import RandomizableTransform, Transform from monai.utils import optional_import @@ -34,6 +36,10 @@ "RandRangePushd", "RandRangePushD", "RandRangePushDict", + "Range", + "Ranged", + "RangeD", + "RangeDict", "RangePop", "RangePopd", "RangePopD", @@ -91,6 +97,36 @@ class RandRangePop(RangePop, RandomizableTransform): """ +class Range(Transform): + """ + Pushes an NVTX range at the before a transfrom, and pops it afterwards. + Stores zero-based depth of the range that is started. + + Args: + msg: ASCII message to associate with range + """ + + def __init__(self, transform: Transform, msg: Optional[str] = None) -> None: + if msg is None: + msg = type(transform).__name__ + self.msg = msg + self.transform = transform + self.depth = None + + def __call__(self, data): + self.depth = _nvtx.rangePushA(self.msg) + data = self.transform(data) + _nvtx.rangePop() + return data + + +class RandRange(Range, RandomizableTransform): + """ + Pushes an NVTX range at the before a transfrom, and pops it afterwards.(RandomizableTransform). + Stores zero-based depth of the range that is ended. + """ + + class Mark(Transform): """ Mark an instantaneous event that occurred at some point. @@ -117,9 +153,14 @@ class RandMark(Mark, RandomizableTransform): """ -MarkDict = MarkD = Markd = Mark -RandMarkDict = RandMarkD = RandMarkd = RandMark -RandRangePopDict = RandRangePopD = RandRangePopd = RandRangePop +RangePushDict = RangePushD = RangePushd = RangePush RandRangePushDict = RandRangePushD = RandRangePushd = RandRangePush + RangePopDict = RangePopD = RangePopd = RangePop -RangePushDict = RangePushD = RangePushd = RangePush +RandRangePopDict = RandRangePopD = RandRangePopd = RandRangePop + +RangeDict = RangeD = Ranged = Range +RandRangeDict = RandRangeD = RandRanged = RandRange + +MarkDict = MarkD = Markd = Mark +RandMarkDict = RandMarkD = RandMarkd = RandMark From 18f704ef0741db7620a1466b3c4b8e5f56551660 Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+drbeh@users.noreply.github.com> Date: Thu, 12 Aug 2021 20:59:31 +0000 Subject: [PATCH 2/6] Add tests for Range Signed-off-by: Behrooz <3968947+drbeh@users.noreply.github.com> --- tests/test_nvtx_transform.py | 88 ++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 13 deletions(-) diff --git a/tests/test_nvtx_transform.py b/tests/test_nvtx_transform.py index d1887377ba..aa66edd390 100644 --- a/tests/test_nvtx_transform.py +++ b/tests/test_nvtx_transform.py @@ -25,6 +25,8 @@ RandRangePopD, RandRangePush, RandRangePushD, + Range, + RangeD, RangePop, RangePopD, RangePush, @@ -62,12 +64,12 @@ class TestNVTXTransforms(unittest.TestCase): def test_nvtx_transfroms_alone(self, input): transforms = Compose( [ - Mark("Mark: Transform Starts!"), + Mark("Mark: Transforms Start!"), RangePush("Range: RandFlipD"), RangePop(), RandRangePush("Range: ToTensorD"), RandRangePop(), - RandMark("Mark: Transform Ends!"), + RandMark("Mark: Transforms End!"), ] ) output = transforms(input) @@ -82,32 +84,33 @@ def test_nvtx_transfroms_alone(self, input): @parameterized.expand([TEST_CASE_ARRAY_0, TEST_CASE_ARRAY_1]) @unittest.skipUnless(has_nvtx, "CUDA is required for NVTX!") def test_nvtx_transfroms_array(self, input): + # with prob == 0.0 transforms = Compose( [ - RandMark("Mark: Transform Starts!"), + RandMark("Mark: Transforms Start!"), RandRangePush("Range: RandFlip"), RandFlip(prob=0.0), RandRangePop(), RangePush("Range: ToTensor"), ToTensor(), RangePop(), - Mark("Mark: Transform Ends!"), + Mark("Mark: Transforms End!"), ] ) output = transforms(input) self.assertIsInstance(output, torch.Tensor) np.testing.assert_array_equal(input, output) - + # with prob == 1.0 transforms = Compose( [ - RandMark("Mark: Transform Starts!"), + RandMark("Mark: Transforms Start!"), RandRangePush("Range: RandFlip"), RandFlip(prob=1.0), RandRangePop(), RangePush("Range: ToTensor"), ToTensor(), RangePop(), - Mark("Mark: Transform Ends!"), + Mark("Mark: Transforms End!"), ] ) output = transforms(input) @@ -116,33 +119,92 @@ def test_nvtx_transfroms_array(self, input): @parameterized.expand([TEST_CASE_DICT_0, TEST_CASE_DICT_1]) @unittest.skipUnless(has_nvtx, "CUDA is required for NVTX!") - def test_nvtx_transfromsd(self, input): + def test_nvtx_transfroms_dict(self, input): + # with prob == 0.0 transforms = Compose( [ - RandMarkD("Mark: Transform Starts!"), + RandMarkD("Mark: Transforms (p=0) Start!"), RandRangePushD("Range: RandFlipD"), RandFlipD(keys="image", prob=0.0), RandRangePopD(), RangePushD("Range: ToTensorD"), ToTensorD(keys=("image")), RangePopD(), - MarkD("Mark: Transform Ends!"), + MarkD("Mark: Transforms (p=0) End!"), ] ) output = transforms(input) self.assertIsInstance(output["image"], torch.Tensor) np.testing.assert_array_equal(input["image"], output["image"]) - + # with prob == 1.0 transforms = Compose( [ - RandMarkD("Mark: Transform Starts!"), + RandMarkD("Mark: Transforms (p=1) Start!"), RandRangePushD("Range: RandFlipD"), RandFlipD(keys="image", prob=1.0), RandRangePopD(), RangePushD("Range: ToTensorD"), ToTensorD(keys=("image")), RangePopD(), - MarkD("Mark: Transform Ends!"), + MarkD("Mark: Transforms (p=1) End!"), + ] + ) + output = transforms(input) + self.assertIsInstance(output["image"], torch.Tensor) + np.testing.assert_array_equal(input["image"], Flip()(output["image"].numpy())) + + # --------------------- + + @parameterized.expand([TEST_CASE_ARRAY_0, TEST_CASE_ARRAY_1]) + @unittest.skipUnless(has_nvtx, "CUDA is required for NVTX!") + def test_nvtx_range_array(self, input): + # with prob == 0.0 + transforms = Compose( + [ + RandMark("Mark: Transforms (p=0) Start!"), + Range(RandFlip(prob=0.0)), + Range(ToTensor()), + Mark("Mark: Transforms (p=0) End!"), + ] + ) + output = transforms(input) + self.assertIsInstance(output, torch.Tensor) + np.testing.assert_array_equal(input, output) + # with prob == 1.0 + transforms = Compose( + [ + RandMark("Mark: Transforms (p=1) Start!"), + Range(RandFlip(prob=1.0)), + Range(ToTensor()), + Mark("Mark: Transforms (p=1) End!"), + ] + ) + output = transforms(input) + self.assertIsInstance(output, torch.Tensor) + np.testing.assert_array_equal(input, Flip()(output.numpy())) + + @parameterized.expand([TEST_CASE_DICT_0, TEST_CASE_DICT_1]) + @unittest.skipUnless(has_nvtx, "CUDA is required for NVTX!") + def test_nvtx_range_dict(self, input): + # with prob == 0.0 + transforms = Compose( + [ + RandMarkD("Mark: Transforms (p=0) Start!"), + RangeD(RandFlipD(keys="image", prob=0.0)), + RangeD(ToTensorD(keys=("image"))), + MarkD("Mark: Transforms (p=0) End!"), + ] + ) + output = transforms(input) + self.assertIsInstance(output["image"], torch.Tensor) + np.testing.assert_array_equal(input["image"], output["image"]) + # with prob == 1.0 + transforms = Compose( + [ + RandMarkD("Mark: Transforms (p=1) Start!"), + RangeD(RandFlipD(keys="image", prob=1.0)), + RangeD(ToTensorD(keys=("image"))), + MarkD("Mark: Transforms (p=1) End!"), ] ) output = transforms(input) From 818ff349e4c93353c1122525af7974152fc6cfe3 Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+drbeh@users.noreply.github.com> Date: Thu, 12 Aug 2021 20:59:44 +0000 Subject: [PATCH 3/6] Update docs for Range Signed-off-by: Behrooz <3968947+drbeh@users.noreply.github.com> --- docs/source/transforms.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/source/transforms.rst b/docs/source/transforms.rst index 7f970dfb15..a1bafaf103 100644 --- a/docs/source/transforms.rst +++ b/docs/source/transforms.rst @@ -361,6 +361,14 @@ NVIDIA Tool Extension (NVTX) """""""""""""" .. autoclass:: RandRangePop +`Range` +""""""" +.. autoclass:: Range + +`RandRange` +""""""""""" +.. autoclass:: RandRange + `Mark` """""" .. autoclass:: Mark From be65b86a157b2f7984be468f19014720884debc5 Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+drbeh@users.noreply.github.com> Date: Thu, 12 Aug 2021 21:05:25 +0000 Subject: [PATCH 4/6] Update docstring Signed-off-by: Behrooz <3968947+drbeh@users.noreply.github.com> --- monai/transforms/nvtx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/transforms/nvtx.py b/monai/transforms/nvtx.py index b24a1285a3..1b20b4ca74 100644 --- a/monai/transforms/nvtx.py +++ b/monai/transforms/nvtx.py @@ -99,7 +99,7 @@ class RandRangePop(RangePop, RandomizableTransform): class Range(Transform): """ - Pushes an NVTX range at the before a transfrom, and pops it afterwards. + Pushes an NVTX range before a transform, and pops it afterwards. Stores zero-based depth of the range that is started. Args: From 2db8c313326101e150701559a288032d42c4420c Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+drbeh@users.noreply.github.com> Date: Thu, 12 Aug 2021 21:44:01 +0000 Subject: [PATCH 5/6] Update imports Signed-off-by: Behrooz <3968947+drbeh@users.noreply.github.com> --- monai/transforms/__init__.py | 4 ++++ monai/transforms/nvtx.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/monai/transforms/__init__.py b/monai/transforms/__init__.py index dc7135fedb..5dbede7ed5 100644 --- a/monai/transforms/__init__.py +++ b/monai/transforms/__init__.py @@ -204,6 +204,10 @@ RandMarkd, RandMarkD, RandMarkDict, + RandRange, + RandRanged, + RandRangeD, + RandRangeDict, RandRangePop, RandRangePopd, RandRangePopD, diff --git a/monai/transforms/nvtx.py b/monai/transforms/nvtx.py index 1b20b4ca74..a500eb3c90 100644 --- a/monai/transforms/nvtx.py +++ b/monai/transforms/nvtx.py @@ -28,6 +28,10 @@ "RandMarkd", "RandMarkD", "RandMarkDict", + "RandRange", + "RandRanged", + "RandRangeD", + "RandRangeDict", "RandRangePop", "RandRangePopd", "RandRangePopD", From 48cadfbf8bc3f9f2b0820570e102df051526bfee Mon Sep 17 00:00:00 2001 From: Behrooz <3968947+drbeh@users.noreply.github.com> Date: Fri, 13 Aug 2021 13:30:39 +0000 Subject: [PATCH 6/6] Add RandRange to tests Signed-off-by: Behrooz <3968947+drbeh@users.noreply.github.com> --- tests/test_nvtx_transform.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_nvtx_transform.py b/tests/test_nvtx_transform.py index aa66edd390..01f2e80d26 100644 --- a/tests/test_nvtx_transform.py +++ b/tests/test_nvtx_transform.py @@ -21,6 +21,8 @@ MarkD, RandMark, RandMarkD, + RandRange, + RandRangeD, RandRangePop, RandRangePopD, RandRangePush, @@ -153,8 +155,6 @@ def test_nvtx_transfroms_dict(self, input): self.assertIsInstance(output["image"], torch.Tensor) np.testing.assert_array_equal(input["image"], Flip()(output["image"].numpy())) - # --------------------- - @parameterized.expand([TEST_CASE_ARRAY_0, TEST_CASE_ARRAY_1]) @unittest.skipUnless(has_nvtx, "CUDA is required for NVTX!") def test_nvtx_range_array(self, input): @@ -162,7 +162,7 @@ def test_nvtx_range_array(self, input): transforms = Compose( [ RandMark("Mark: Transforms (p=0) Start!"), - Range(RandFlip(prob=0.0)), + RandRange(RandFlip(prob=0.0)), Range(ToTensor()), Mark("Mark: Transforms (p=0) End!"), ] @@ -174,7 +174,7 @@ def test_nvtx_range_array(self, input): transforms = Compose( [ RandMark("Mark: Transforms (p=1) Start!"), - Range(RandFlip(prob=1.0)), + RandRange(RandFlip(prob=1.0)), Range(ToTensor()), Mark("Mark: Transforms (p=1) End!"), ] @@ -190,7 +190,7 @@ def test_nvtx_range_dict(self, input): transforms = Compose( [ RandMarkD("Mark: Transforms (p=0) Start!"), - RangeD(RandFlipD(keys="image", prob=0.0)), + RandRangeD(RandFlipD(keys="image", prob=0.0)), RangeD(ToTensorD(keys=("image"))), MarkD("Mark: Transforms (p=0) End!"), ] @@ -202,7 +202,7 @@ def test_nvtx_range_dict(self, input): transforms = Compose( [ RandMarkD("Mark: Transforms (p=1) Start!"), - RangeD(RandFlipD(keys="image", prob=1.0)), + RandRangeD(RandFlipD(keys="image", prob=1.0)), RangeD(ToTensorD(keys=("image"))), MarkD("Mark: Transforms (p=1) End!"), ]