From 4dfbbbee48fb92927dacb1905dc77bb5ed7382e4 Mon Sep 17 00:00:00 2001 From: mauriliogenovese <125388969+mauriliogenovese@users.noreply.github.com> Date: Tue, 4 Mar 2025 18:43:14 +0100 Subject: [PATCH 1/3] reimplementation of gpu_count --- nipype/pipeline/plugins/multiproc.py | 2 +- nipype/pipeline/plugins/tools.py | 10 ----- nipype/utils/gpu_count.py | 55 ++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 nipype/utils/gpu_count.py diff --git a/nipype/pipeline/plugins/multiproc.py b/nipype/pipeline/plugins/multiproc.py index b403749ff9..be0e006229 100644 --- a/nipype/pipeline/plugins/multiproc.py +++ b/nipype/pipeline/plugins/multiproc.py @@ -21,7 +21,7 @@ from ...utils.profiler import get_system_total_memory_gb from ..engine import MapNode from .base import DistributedPluginBase -from .tools import gpu_count +from ...utils.gpu_count import gpu_count try: from textwrap import indent diff --git a/nipype/pipeline/plugins/tools.py b/nipype/pipeline/plugins/tools.py index 37c841a208..7e066b0ea3 100644 --- a/nipype/pipeline/plugins/tools.py +++ b/nipype/pipeline/plugins/tools.py @@ -175,13 +175,3 @@ def create_pyscript(node, updatehash=False, store_exception=True): with open(pyscript, "w") as fp: fp.writelines(cmdstr) return pyscript - - -def gpu_count(): - n_gpus = 1 - try: - import GPUtil - except ImportError: - return 1 - else: - return len(GPUtil.getGPUs()) diff --git a/nipype/utils/gpu_count.py b/nipype/utils/gpu_count.py new file mode 100644 index 0000000000..57f749baa2 --- /dev/null +++ b/nipype/utils/gpu_count.py @@ -0,0 +1,55 @@ +# -*- DISCLAIMER: this file contains code derived from gputil (https://github.com/anderskm/gputil) +# and therefore is distributed under to the following license: +# +# MIT License +# +# Copyright (c) 2017 anderskm +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import platform +import shutil +from subprocess import Popen, PIPE +import os + + +def gpu_count(): + try: + if platform.system() == "Windows": + nvidia_smi = shutil.which('nvidia-smi') + if nvidia_smi is None: + nvidia_smi = ( + "%s\\Program Files\\NVIDIA Corporation\\NVSMI\\nvidia-smi.exe" + % os.environ['systemdrive'] + ) + else: + nvidia_smi = "nvidia-smi" + + p = Popen( + [nvidia_smi, "--query-gpu=name", "--format=csv,noheader,nounits"], + stdout=PIPE, + ) + stdout, stderror = p.communicate() + + output = stdout.decode('UTF-8') + lines = output.split(os.linesep) + num_devices = len(lines) - 1 + return num_devices + except: + return 0 From 151facd7ad97615a6ebe1c5907cec87dada7dffa Mon Sep 17 00:00:00 2001 From: mauriliogenovese <125388969+mauriliogenovese@users.noreply.github.com> Date: Wed, 5 Mar 2025 19:41:20 +0100 Subject: [PATCH 2/3] remove gputil requirement --- nipype/info.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nipype/info.py b/nipype/info.py index 072a0330ef..729689ae5d 100644 --- a/nipype/info.py +++ b/nipype/info.py @@ -149,7 +149,6 @@ def get_nipype_gitversion(): "acres", "etelemetry>=0.3.1", "looseversion!=1.2", - "gputil>=1.4.0", "puremagic", ] From c18991264169a3787df7d16a072d5fbb23b79acf Mon Sep 17 00:00:00 2001 From: mauriliogenovese <125388969+mauriliogenovese@users.noreply.github.com> Date: Fri, 7 Mar 2025 08:15:38 +0100 Subject: [PATCH 3/3] code cleanup --- nipype/utils/gpu_count.py | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/nipype/utils/gpu_count.py b/nipype/utils/gpu_count.py index 57f749baa2..70eb6d724e 100644 --- a/nipype/utils/gpu_count.py +++ b/nipype/utils/gpu_count.py @@ -25,31 +25,22 @@ import platform import shutil -from subprocess import Popen, PIPE +import subprocess import os def gpu_count(): + nvidia_smi = shutil.which('nvidia-smi') + if nvidia_smi is None and platform.system() == "Windows": + nvidia_smi = f'{os.environ["systemdrive"]}\\Program Files\\NVIDIA Corporation\\NVSMI\\nvidia-smi.exe' + if nvidia_smi is None: + return 0 try: - if platform.system() == "Windows": - nvidia_smi = shutil.which('nvidia-smi') - if nvidia_smi is None: - nvidia_smi = ( - "%s\\Program Files\\NVIDIA Corporation\\NVSMI\\nvidia-smi.exe" - % os.environ['systemdrive'] - ) - else: - nvidia_smi = "nvidia-smi" - - p = Popen( + p = subprocess.run( [nvidia_smi, "--query-gpu=name", "--format=csv,noheader,nounits"], - stdout=PIPE, + stdout=subprocess.PIPE, + text=True, ) - stdout, stderror = p.communicate() - - output = stdout.decode('UTF-8') - lines = output.split(os.linesep) - num_devices = len(lines) - 1 - return num_devices - except: + except (OSError, UnicodeDecodeError): return 0 + return len(p.stdout.splitlines())