From 5524980e17c69bc2d6f4c92beb8e3f639a422f5e Mon Sep 17 00:00:00 2001 From: Gulsum Gudukbay Date: Thu, 4 Aug 2022 16:35:43 -0400 Subject: [PATCH 1/7] added 'CUDARequirement' to the SUPPORTED_TOOL_REQUIREMENTS variable and added import cwltool.cuda to cwltool_deps.py --- lib/galaxy/tool_util/cwl/cwltool_deps.py | 10 ++++++++++ lib/galaxy/tool_util/cwl/parser.py | 1 + 2 files changed, 11 insertions(+) diff --git a/lib/galaxy/tool_util/cwl/cwltool_deps.py b/lib/galaxy/tool_util/cwl/cwltool_deps.py index 9d0bba1d539..3aa48d5c802 100644 --- a/lib/galaxy/tool_util/cwl/cwltool_deps.py +++ b/lib/galaxy/tool_util/cwl/cwltool_deps.py @@ -18,6 +18,7 @@ try: pathmapper, process, workflow, + cuda, ) except ImportError: main = None # type: ignore[assignment] @@ -25,6 +26,7 @@ except ImportError: job = None # type: ignore[assignment] process = None # type: ignore[assignment] pathmapper = None # type: ignore[assignment] + cuda = None # type: ignore[assignment] try: from cwltool.context import ( @@ -70,6 +72,13 @@ except ImportError: visit_class = None # type: ignore[assignment] normalizeFilesDirs = None # type: ignore[assignment] +try: + from cwltool.cuda import ( + cuda_version_and_device_count, + ) +except ImportError: + cuda_version_and_device_count = None # type: ignore[assignment] + try: import shellescape except ImportError: @@ -141,5 +150,6 @@ __all__ = ( "StdFsAccess", "visit_class", "workflow", + "cuda", "yaml_no_ts", ) diff --git a/lib/galaxy/tool_util/cwl/parser.py b/lib/galaxy/tool_util/cwl/parser.py index 97d79c1fc98..be0b28631df 100644 --- a/lib/galaxy/tool_util/cwl/parser.py +++ b/lib/galaxy/tool_util/cwl/parser.py @@ -81,6 +81,7 @@ SUPPORTED_TOOL_REQUIREMENTS = [ "SubworkflowFeatureRequirement", "StepInputExpressionRequirement", "MultipleInputFeatureRequirement", + "CUDARequirement", ] From 443ada748da2be0b6bcc453a62cfe3f1c5898e0f Mon Sep 17 00:00:00 2001 From: Gulsum Gudukbay Date: Wed, 24 Aug 2022 10:50:43 -0400 Subject: [PATCH 2/7] Revert "added 'CUDARequirement' to the SUPPORTED_TOOL_REQUIREMENTS variable and added import cwltool.cuda to cwltool_deps.py" This reverts commit b9a1a749b6274819d1478f82e928cdd51d4ac97b. --- lib/galaxy/tool_util/cwl/cwltool_deps.py | 10 ---------- lib/galaxy/tool_util/cwl/parser.py | 1 - 2 files changed, 11 deletions(-) diff --git a/lib/galaxy/tool_util/cwl/cwltool_deps.py b/lib/galaxy/tool_util/cwl/cwltool_deps.py index 3aa48d5c802..9d0bba1d539 100644 --- a/lib/galaxy/tool_util/cwl/cwltool_deps.py +++ b/lib/galaxy/tool_util/cwl/cwltool_deps.py @@ -18,7 +18,6 @@ try: pathmapper, process, workflow, - cuda, ) except ImportError: main = None # type: ignore[assignment] @@ -26,7 +25,6 @@ except ImportError: job = None # type: ignore[assignment] process = None # type: ignore[assignment] pathmapper = None # type: ignore[assignment] - cuda = None # type: ignore[assignment] try: from cwltool.context import ( @@ -72,13 +70,6 @@ except ImportError: visit_class = None # type: ignore[assignment] normalizeFilesDirs = None # type: ignore[assignment] -try: - from cwltool.cuda import ( - cuda_version_and_device_count, - ) -except ImportError: - cuda_version_and_device_count = None # type: ignore[assignment] - try: import shellescape except ImportError: @@ -150,6 +141,5 @@ __all__ = ( "StdFsAccess", "visit_class", "workflow", - "cuda", "yaml_no_ts", ) diff --git a/lib/galaxy/tool_util/cwl/parser.py b/lib/galaxy/tool_util/cwl/parser.py index be0b28631df..97d79c1fc98 100644 --- a/lib/galaxy/tool_util/cwl/parser.py +++ b/lib/galaxy/tool_util/cwl/parser.py @@ -81,7 +81,6 @@ SUPPORTED_TOOL_REQUIREMENTS = [ "SubworkflowFeatureRequirement", "StepInputExpressionRequirement", "MultipleInputFeatureRequirement", - "CUDARequirement", ] From 3140130e830e9a87d8f0d75db36a85b4086e4511 Mon Sep 17 00:00:00 2001 From: Gulsum Gudukbay Date: Thu, 25 Aug 2022 16:54:06 -0400 Subject: [PATCH 3/7] added CUDA and GPU requirement enumerations under simpleType ResourceType in galaxy.xsd and parser in requirements.py --- lib/galaxy/tool_util/deps/requirements.py | 6 ++++++ lib/galaxy/tool_util/xsd/galaxy.xsd | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/galaxy/tool_util/deps/requirements.py b/lib/galaxy/tool_util/deps/requirements.py index 7f59be7fa47..1932f592e5e 100644 --- a/lib/galaxy/tool_util/deps/requirements.py +++ b/lib/galaxy/tool_util/deps/requirements.py @@ -233,6 +233,9 @@ ResourceType = Literal[ "ram_max", "tmpdir_min", "tmpdir_max", + "cuda_runtime_min", + "cuda_compute_capability", + "gpu_memory_min", ] VALID_RESOURCE_TYPES = get_args(ResourceType) @@ -272,6 +275,9 @@ def resource_requirements_from_list(requirements) -> List[ResourceRequirement]: "ramMax": "ram_max", "tmpdirMin": "tmpdir_min", "tmpdirMax": "tmpdir_max", + "cudaRuntimeMin": "cuda_runtime_min", + "cudaComputeCapability": "cuda_compute_capability", + "gpuMemoryMin": "gpu_memory_min", } rr = [] for r in requirements: diff --git a/lib/galaxy/tool_util/xsd/galaxy.xsd b/lib/galaxy/tool_util/xsd/galaxy.xsd index 4410ba89bf8..105041e9372 100644 --- a/lib/galaxy/tool_util/xsd/galaxy.xsd +++ b/lib/galaxy/tool_util/xsd/galaxy.xsd @@ -6793,6 +6793,21 @@ and ``bibtex`` are the only supported options. Maximum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20 bytes), if runtime allows it (not yet implemented in Galaxy). + + + Minimum CUDA (runtime link library) runtime version, if runtime allows it (not yet implemented in Galaxy). + + + + + Minimum NVIDIA (hardware+driver) Compute capabilities (major, minor (can be a range or a list), if runtime allows it (not yet implemented in Galaxy). + + + + + Minimum Memory of the GPU in mebibytes, if runtime allows it (not yet implemented in Galaxy). + + From 32ac295e2c5f5bc53022f5f562b0f1c1c4726211 Mon Sep 17 00:00:00 2001 From: Gulsum Gudukbay Akbulut Date: Mon, 17 Oct 2022 13:10:40 -0400 Subject: [PATCH 4/7] Updated requirements.py Updated requirements.py with the cudaDeviceCountMin and cudaDeviceCountMax --- lib/galaxy/tool_util/deps/requirements.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/galaxy/tool_util/deps/requirements.py b/lib/galaxy/tool_util/deps/requirements.py index 1932f592e5e..10f2c082928 100644 --- a/lib/galaxy/tool_util/deps/requirements.py +++ b/lib/galaxy/tool_util/deps/requirements.py @@ -236,6 +236,8 @@ ResourceType = Literal[ "cuda_runtime_min", "cuda_compute_capability", "gpu_memory_min", + "cuda_device_count_min", + "cuda_device_count_max" ] VALID_RESOURCE_TYPES = get_args(ResourceType) @@ -278,6 +280,8 @@ def resource_requirements_from_list(requirements) -> List[ResourceRequirement]: "cudaRuntimeMin": "cuda_runtime_min", "cudaComputeCapability": "cuda_compute_capability", "gpuMemoryMin": "gpu_memory_min", + "cudaDeviceCountMin": "cuda_device_count_min", + "cudaDeviceCountMax": "cuda_device_count_max" } rr = [] for r in requirements: From 67e203e3b5ea087d7f392c4237c24ecbe32c4c9a Mon Sep 17 00:00:00 2001 From: Gulsum Gudukbay Akbulut Date: Mon, 17 Oct 2022 13:13:03 -0400 Subject: [PATCH 5/7] Update galaxy.xsd --- lib/galaxy/tool_util/xsd/galaxy.xsd | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/galaxy/tool_util/xsd/galaxy.xsd b/lib/galaxy/tool_util/xsd/galaxy.xsd index 105041e9372..af940ae3f8d 100644 --- a/lib/galaxy/tool_util/xsd/galaxy.xsd +++ b/lib/galaxy/tool_util/xsd/galaxy.xsd @@ -6808,6 +6808,16 @@ and ``bibtex`` are the only supported options. Minimum Memory of the GPU in mebibytes, if runtime allows it (not yet implemented in Galaxy). + + + Minimum CUDA device count, if runtime allows it (not yet implemented in Galaxy). + + + + + Maximum CUDA device count, if runtime allows it (not yet implemented in Galaxy). + + From 75d14cb6364d7e9ca3957dc5f48ee08ec51b152e Mon Sep 17 00:00:00 2001 From: Gulsum Gudukbay Date: Mon, 5 Dec 2022 00:58:36 -0500 Subject: [PATCH 6/7] adding test extensions for GPU --- lib/galaxy/tool_util/deps/requirements.py | 4 +-- lib/galaxy/tool_util/xsd/galaxy.xsd | 2 +- .../tools/resource_requirements.xml | 5 ++++ test/unit/tool_util/test_parsing.py | 27 ++++++++++++++++++- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/tool_util/deps/requirements.py b/lib/galaxy/tool_util/deps/requirements.py index 10f2c082928..1724001902f 100644 --- a/lib/galaxy/tool_util/deps/requirements.py +++ b/lib/galaxy/tool_util/deps/requirements.py @@ -233,7 +233,7 @@ ResourceType = Literal[ "ram_max", "tmpdir_min", "tmpdir_max", - "cuda_runtime_min", + "cuda_version_min", "cuda_compute_capability", "gpu_memory_min", "cuda_device_count_min", @@ -277,7 +277,7 @@ def resource_requirements_from_list(requirements) -> List[ResourceRequirement]: "ramMax": "ram_max", "tmpdirMin": "tmpdir_min", "tmpdirMax": "tmpdir_max", - "cudaRuntimeMin": "cuda_runtime_min", + "cudaVersionMin": "cuda_version_min", "cudaComputeCapability": "cuda_compute_capability", "gpuMemoryMin": "gpu_memory_min", "cudaDeviceCountMin": "cuda_device_count_min", diff --git a/lib/galaxy/tool_util/xsd/galaxy.xsd b/lib/galaxy/tool_util/xsd/galaxy.xsd index af940ae3f8d..498b3a320b8 100644 --- a/lib/galaxy/tool_util/xsd/galaxy.xsd +++ b/lib/galaxy/tool_util/xsd/galaxy.xsd @@ -6793,7 +6793,7 @@ and ``bibtex`` are the only supported options. Maximum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20 bytes), if runtime allows it (not yet implemented in Galaxy). - + Minimum CUDA (runtime link library) runtime version, if runtime allows it (not yet implemented in Galaxy). diff --git a/test/functional/tools/resource_requirements.xml b/test/functional/tools/resource_requirements.xml index 5ad4ccc06fd..96a5641f720 100644 --- a/test/functional/tools/resource_requirements.xml +++ b/test/functional/tools/resource_requirements.xml @@ -6,6 +6,11 @@ 2> + 10.2 + 6.1 + 4042 + 1 + 2 $output diff --git a/test/unit/tool_util/test_parsing.py b/test/unit/tool_util/test_parsing.py index a5d709119a4..b87dab14f2a 100644 --- a/test/unit/tool_util/test_parsing.py +++ b/test/unit/tool_util/test_parsing.py @@ -31,6 +31,11 @@ TOOL_XML_1 = """ mycool/bwa bwa 1 + 10.2 + 6.1 + 4042 + 1 + 2 @@ -125,6 +130,16 @@ requirements: version: 1.0.1 - type: resource cores_min: 1 + - type: resource + cuda_version_min: 10.2 + - type: resource + cuda_compute_capability: 6.1 + - type: resource + gpu_memory_min: 4042 + - type: resource + cuda_device_count_min: 1 + - type: resource + cuda_device_count_max: 2 containers: - type: docker identifier: "awesome/bowtie" @@ -311,6 +326,11 @@ class TestXmlLoader(BaseLoaderTestCase): assert requirements[0].type == "package" assert list(containers)[0].identifier == "mycool/bwa" assert resource_requirements[0].resource_type == "cores_min" + assert resource_requirements[1].resource_type == "cuda_version_min" + assert resource_requirements[2].resource_type == "cuda_compute_capability" + assert resource_requirements[3].resource_type == "gpu_memory_min" + assert resource_requirements[4].resource_type == "cuda_device_count_min" + assert resource_requirements[5].resource_type == "cuda_device_count_max" assert not resource_requirements[0].runtime_required def test_outputs(self): @@ -486,8 +506,13 @@ class TestYamlLoader(BaseLoaderTestCase): "resolve_dependencies": False, "shell": "/bin/sh", } - assert len(resource_requirements) == 1 + assert len(resource_requirements) == 6 assert resource_requirements[0].to_dict() == {"resource_type": "cores_min", "value_or_expression": 1} + assert resource_requirements[1].to_dict() == {"resource_type": "cuda_version_min", "value_or_expression": 10.2} + assert resource_requirements[2].to_dict() == {"resource_type": "cuda_compute_capability", "value_or_expression": 6.1} + assert resource_requirements[3].to_dict() == {"resource_type": "gpu_memory_min", "value_or_expression": 4042} + assert resource_requirements[4].to_dict() == {"resource_type": "cuda_device_count_min", "value_or_expression": 1} + assert resource_requirements[5].to_dict() == {"resource_type": "cuda_device_count_max", "value_or_expression": 2} def test_outputs(self): outputs, output_collections = self._tool_source.parse_outputs(object()) From 36a632672ea2f5019cdc4241d527eeee7ef29fea Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 8 Dec 2022 18:10:16 +0100 Subject: [PATCH 7/7] Linting fixes --- lib/galaxy/tool_util/deps/requirements.py | 4 ++-- test/unit/tool_util/test_parsing.py | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/galaxy/tool_util/deps/requirements.py b/lib/galaxy/tool_util/deps/requirements.py index 1724001902f..e787dc4e403 100644 --- a/lib/galaxy/tool_util/deps/requirements.py +++ b/lib/galaxy/tool_util/deps/requirements.py @@ -237,7 +237,7 @@ ResourceType = Literal[ "cuda_compute_capability", "gpu_memory_min", "cuda_device_count_min", - "cuda_device_count_max" + "cuda_device_count_max", ] VALID_RESOURCE_TYPES = get_args(ResourceType) @@ -281,7 +281,7 @@ def resource_requirements_from_list(requirements) -> List[ResourceRequirement]: "cudaComputeCapability": "cuda_compute_capability", "gpuMemoryMin": "gpu_memory_min", "cudaDeviceCountMin": "cuda_device_count_min", - "cudaDeviceCountMax": "cuda_device_count_max" + "cudaDeviceCountMax": "cuda_device_count_max", } rr = [] for r in requirements: diff --git a/test/unit/tool_util/test_parsing.py b/test/unit/tool_util/test_parsing.py index b87dab14f2a..9ef3a3a2389 100644 --- a/test/unit/tool_util/test_parsing.py +++ b/test/unit/tool_util/test_parsing.py @@ -509,10 +509,19 @@ class TestYamlLoader(BaseLoaderTestCase): assert len(resource_requirements) == 6 assert resource_requirements[0].to_dict() == {"resource_type": "cores_min", "value_or_expression": 1} assert resource_requirements[1].to_dict() == {"resource_type": "cuda_version_min", "value_or_expression": 10.2} - assert resource_requirements[2].to_dict() == {"resource_type": "cuda_compute_capability", "value_or_expression": 6.1} + assert resource_requirements[2].to_dict() == { + "resource_type": "cuda_compute_capability", + "value_or_expression": 6.1, + } assert resource_requirements[3].to_dict() == {"resource_type": "gpu_memory_min", "value_or_expression": 4042} - assert resource_requirements[4].to_dict() == {"resource_type": "cuda_device_count_min", "value_or_expression": 1} - assert resource_requirements[5].to_dict() == {"resource_type": "cuda_device_count_max", "value_or_expression": 2} + assert resource_requirements[4].to_dict() == { + "resource_type": "cuda_device_count_min", + "value_or_expression": 1, + } + assert resource_requirements[5].to_dict() == { + "resource_type": "cuda_device_count_max", + "value_or_expression": 2, + } def test_outputs(self): outputs, output_collections = self._tool_source.parse_outputs(object())