From cbc1a215b29e1470fcc8d96749b861190517e2fb Mon Sep 17 00:00:00 2001 From: Richard Brown <33289025+rijobro@users.noreply.github.com> Date: Tue, 11 May 2021 14:11:03 +0000 Subject: [PATCH 1/6] fix set visible devices Signed-off-by: Richard Brown <33289025+rijobro@users.noreply.github.com> --- monai/data/test_time_augmentation.py | 4 ++-- tests/test_set_visible_devices.py | 35 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 tests/test_set_visible_devices.py diff --git a/monai/data/test_time_augmentation.py b/monai/data/test_time_augmentation.py index 49b6c774e2..fdfc80c25f 100644 --- a/monai/data/test_time_augmentation.py +++ b/monai/data/test_time_augmentation.py @@ -89,7 +89,7 @@ def __init__( batch_size: int, num_workers: int, inferrer_fn: Callable, - device: Optional[Union[str, torch.device]] = "cuda" if torch.cuda.is_available() else "cpu", + device: Optional[Union[str, torch.device]] = None, image_key=CommonKeys.IMAGE, label_key=CommonKeys.LABEL, meta_key_postfix="meta_dict", @@ -100,7 +100,7 @@ def __init__( self.batch_size = batch_size self.num_workers = num_workers self.inferrer_fn = inferrer_fn - self.device = device + self.device = device or "cuda" if torch.cuda.is_available() else "cpu" self.image_key = image_key self.label_key = label_key self.meta_key_postfix = meta_key_postfix diff --git a/tests/test_set_visible_devices.py b/tests/test_set_visible_devices.py new file mode 100644 index 0000000000..ad992ed09b --- /dev/null +++ b/tests/test_set_visible_devices.py @@ -0,0 +1,35 @@ +# Copyright 2020 - 2021 MONAI Consortium +# 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. + +import unittest +from unittest.case import skipUnless +import os +import torch + +class TestVisibleDevices(unittest.TestCase): + @staticmethod + def run_process_and_get_exit_code(code_to_execute): + value = os.system(code_to_execute) + return int(bin(value).replace("0b", "").rjust(16, '0')[:8], 2) + + @skipUnless(torch.cuda.device_count() > 1, "Requires at least 2 CUDA devices") + def test_visible_devices(self): + num_gpus_before = self.run_process_and_get_exit_code( + "python -c \"import os; import torch; os.environ['CUDA_VISIBLE_DEVICES'] = '0'; exit(torch.cuda.device_count())\"" + ) + num_gpus_after = self.run_process_and_get_exit_code( + "python -c \"import os; import monai; import torch; os.environ['CUDA_VISIBLE_DEVICES'] = '0'; exit(torch.cuda.device_count())\"" + ) + self.assertEqual(num_gpus_before, num_gpus_after) + + +if __name__ == "__main__": + unittest.main() From 35797e19f24c84b594e1261d46e1ec8aeeaf6969 Mon Sep 17 00:00:00 2001 From: Richard Brown <33289025+rijobro@users.noreply.github.com> Date: Tue, 11 May 2021 14:14:30 +0000 Subject: [PATCH 2/6] only need 1 gpu Signed-off-by: Richard Brown <33289025+rijobro@users.noreply.github.com> --- tests/test_set_visible_devices.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/test_set_visible_devices.py b/tests/test_set_visible_devices.py index ad992ed09b..923cbda82c 100644 --- a/tests/test_set_visible_devices.py +++ b/tests/test_set_visible_devices.py @@ -9,10 +9,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +from tests.utils import skip_if_no_cuda import unittest -from unittest.case import skipUnless import os -import torch class TestVisibleDevices(unittest.TestCase): @staticmethod @@ -20,13 +19,13 @@ def run_process_and_get_exit_code(code_to_execute): value = os.system(code_to_execute) return int(bin(value).replace("0b", "").rjust(16, '0')[:8], 2) - @skipUnless(torch.cuda.device_count() > 1, "Requires at least 2 CUDA devices") + @skip_if_no_cuda def test_visible_devices(self): num_gpus_before = self.run_process_and_get_exit_code( - "python -c \"import os; import torch; os.environ['CUDA_VISIBLE_DEVICES'] = '0'; exit(torch.cuda.device_count())\"" + "python -c \"import os; import torch; os.environ['CUDA_VISIBLE_DEVICES'] = ''; exit(torch.cuda.device_count())\"" ) num_gpus_after = self.run_process_and_get_exit_code( - "python -c \"import os; import monai; import torch; os.environ['CUDA_VISIBLE_DEVICES'] = '0'; exit(torch.cuda.device_count())\"" + "python -c \"import os; import monai; import torch; os.environ['CUDA_VISIBLE_DEVICES'] = ''; exit(torch.cuda.device_count())\"" ) self.assertEqual(num_gpus_before, num_gpus_after) From 3fcf2ffea95afc9cacd25c5e9e5805c7fbf2790f Mon Sep 17 00:00:00 2001 From: Richard Brown <33289025+rijobro@users.noreply.github.com> Date: Tue, 11 May 2021 15:25:42 +0100 Subject: [PATCH 3/6] autofixes Signed-off-by: Richard Brown <33289025+rijobro@users.noreply.github.com> --- tests/test_set_visible_devices.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/test_set_visible_devices.py b/tests/test_set_visible_devices.py index 923cbda82c..b6da879f4b 100644 --- a/tests/test_set_visible_devices.py +++ b/tests/test_set_visible_devices.py @@ -9,23 +9,27 @@ # See the License for the specific language governing permissions and # limitations under the License. -from tests.utils import skip_if_no_cuda -import unittest import os +import unittest + +from tests.utils import skip_if_no_cuda + class TestVisibleDevices(unittest.TestCase): @staticmethod def run_process_and_get_exit_code(code_to_execute): value = os.system(code_to_execute) - return int(bin(value).replace("0b", "").rjust(16, '0')[:8], 2) + return int(bin(value).replace("0b", "").rjust(16, "0")[:8], 2) @skip_if_no_cuda def test_visible_devices(self): num_gpus_before = self.run_process_and_get_exit_code( - "python -c \"import os; import torch; os.environ['CUDA_VISIBLE_DEVICES'] = ''; exit(torch.cuda.device_count())\"" + 'python -c "import os; import torch; ' + + "os.environ['CUDA_VISIBLE_DEVICES'] = ''; exit(torch.cuda.device_count())\"" ) num_gpus_after = self.run_process_and_get_exit_code( - "python -c \"import os; import monai; import torch; os.environ['CUDA_VISIBLE_DEVICES'] = ''; exit(torch.cuda.device_count())\"" + 'python -c "import os; import monai; import torch; ' + + "os.environ['CUDA_VISIBLE_DEVICES'] = ''; exit(torch.cuda.device_count())\"" ) self.assertEqual(num_gpus_before, num_gpus_after) From 95ed34192663d20b7cd7a1e9218b9c0379acbe7a Mon Sep 17 00:00:00 2001 From: Richard Brown <33289025+rijobro@users.noreply.github.com> Date: Tue, 11 May 2021 15:36:36 +0100 Subject: [PATCH 4/6] use default device = cpu Signed-off-by: Richard Brown <33289025+rijobro@users.noreply.github.com> --- monai/data/test_time_augmentation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monai/data/test_time_augmentation.py b/monai/data/test_time_augmentation.py index fdfc80c25f..8eafebb689 100644 --- a/monai/data/test_time_augmentation.py +++ b/monai/data/test_time_augmentation.py @@ -89,7 +89,7 @@ def __init__( batch_size: int, num_workers: int, inferrer_fn: Callable, - device: Optional[Union[str, torch.device]] = None, + device: Union[str, torch.device] = torch.device("cpu"), image_key=CommonKeys.IMAGE, label_key=CommonKeys.LABEL, meta_key_postfix="meta_dict", @@ -100,7 +100,7 @@ def __init__( self.batch_size = batch_size self.num_workers = num_workers self.inferrer_fn = inferrer_fn - self.device = device or "cuda" if torch.cuda.is_available() else "cpu" + self.device = device self.image_key = image_key self.label_key = label_key self.meta_key_postfix = meta_key_postfix From 1726a64128b1197c200ab65a649ed956ab79a775 Mon Sep 17 00:00:00 2001 From: Richard Brown <33289025+rijobro@users.noreply.github.com> Date: Wed, 12 May 2021 15:09:39 +0100 Subject: [PATCH 5/6] remove unused import Optional Signed-off-by: Richard Brown <33289025+rijobro@users.noreply.github.com> --- monai/data/test_time_augmentation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/data/test_time_augmentation.py b/monai/data/test_time_augmentation.py index 8eafebb689..03067825ef 100644 --- a/monai/data/test_time_augmentation.py +++ b/monai/data/test_time_augmentation.py @@ -9,7 +9,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Tuple, Union import numpy as np import torch From 76cfeedf43cda98f9a32d1a618e51c8819d986f5 Mon Sep 17 00:00:00 2001 From: Richard Brown <33289025+rijobro@users.noreply.github.com> Date: Wed, 12 May 2021 15:35:50 +0100 Subject: [PATCH 6/6] cpu string Signed-off-by: Richard Brown <33289025+rijobro@users.noreply.github.com> --- monai/data/test_time_augmentation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/data/test_time_augmentation.py b/monai/data/test_time_augmentation.py index 03067825ef..c8ca4369f1 100644 --- a/monai/data/test_time_augmentation.py +++ b/monai/data/test_time_augmentation.py @@ -89,7 +89,7 @@ def __init__( batch_size: int, num_workers: int, inferrer_fn: Callable, - device: Union[str, torch.device] = torch.device("cpu"), + device: Union[str, torch.device] = "cpu", image_key=CommonKeys.IMAGE, label_key=CommonKeys.LABEL, meta_key_postfix="meta_dict",