From 08106a5bdfc4656e99cb8f13e49e0e8413432e5f Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 1 Nov 2024 23:26:48 +0100 Subject: [PATCH 01/23] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index d61acb5..7e9de0d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ Pillow>=9.5.0 pynvml py-cpuinfo piexif +"jtop; platform_machine == 'aarch64'", From 50ac4edeb40a5990751c8a9497359241d91b954d Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 1 Nov 2024 23:27:42 +0100 Subject: [PATCH 02/23] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7e9de0d..2447b88 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ Pillow>=9.5.0 pynvml py-cpuinfo piexif -"jtop; platform_machine == 'aarch64'", +jtop; platform_machine == 'aarch64'" From ac05bf0da6f7d6e2606bc93fb6e3dfae922b2c08 Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 1 Nov 2024 23:28:51 +0100 Subject: [PATCH 03/23] Update gpu.py --- general/gpu.py | 205 +++++++++++++++++++++++++++---------------------- 1 file changed, 113 insertions(+), 92 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index 786a3af..a25674f 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -1,9 +1,26 @@ import torch -import pynvml import comfy.model_management from ..core import logger -# from ctypes import * -# from pyrsmi import rocml +import os + +def is_jetson() -> bool: + """ + Determines if the Python environment is running on a Jetson device by checking the device model + information. + + Returns: + (bool): True if running on a Jetson device, False otherwise. + """ + PROC_DEVICE_MODEL = '' + try: + with open('/proc/device-tree/model', 'r') as f: + PROC_DEVICE_MODEL = f.read() + except Exception: + pass + + return "NVIDIA Jetson" in PROC_DEVICE_MODEL + +IS_JETSON = is_jetson() class CGPUInfo: """ @@ -11,8 +28,7 @@ class CGPUInfo: """ cuda = False pynvmlLoaded = False - # pyamdLoaded = False - # anygpuLoaded = False + jtopLoaded = False cudaAvailable = False torchDevice = 'cpu' cudaDevice = 'cpu' @@ -26,78 +42,84 @@ class CGPUInfo: gpusTemperature = [] def __init__(self): - try: - pynvml.nvmlInit() - self.pynvmlLoaded = True - logger.info('Pynvml (Nvidia) initialized.') - except Exception as e: - logger.error('Could not init pynvml (Nvidia).' + str(e)) + if IS_JETSON: + # Try to import jtop for Jetson devices + try: + from jtop import jtop + self.jtop = jtop + self.jtopInstance = None + self.jtopLoaded = True + logger.info('jtop initialized on Jetson device.') + except ImportError as e: + logger.error('jtop is not installed. ' + str(e)) + else: + # Try to import pynvml for non-Jetson devices + try: + import pynvml + self.pynvml = pynvml + self.pynvml.nvmlInit() + self.pynvmlLoaded = True + logger.info('pynvml (NVIDIA) initialized.') + except ImportError as e: + logger.error('pynvml is not installed. ' + str(e)) + except Exception as e: + logger.error('Could not init pynvml (NVIDIA). ' + str(e)) - # if not self.pynvmlLoaded: - # try: - # rocml.smi_initialize() - # self.pyamdLoaded = True - # logger.info('Pyrsmi (AMD) initialized.') - # except Exception as e: - # logger.error('Could not init pyrsmi (AMD).' + str(e)) - - # self.anygpuLoaded = self.pynvmlLoaded or self.pyamdLoaded - self.anygpuLoaded = self.pynvmlLoaded + self.anygpuLoaded = self.pynvmlLoaded or self.jtopLoaded try: self.torchDevice = comfy.model_management.get_torch_device_name(comfy.model_management.get_torch_device()) except Exception as e: - logger.error('Could not pick default device.' + str(e)) + logger.error('Could not pick default device. ' + str(e)) - # ZLUDA Check, self.torchDevice has 'ZLUDA' in it. - if 'zluda' in self.torchDevice or 'ZLUDA' in self.torchDevice or 'Zluda' in self.torchDevice: - logger.warn('ZLUDA detected. GPU monitoring will be disabled.') + # ZLUDA Check + if 'zluda' in self.torchDevice.lower(): + logger.warning('ZLUDA detected. GPU monitoring will be disabled.') self.anygpuLoaded = False - # self.pyamdLoaded = False self.pynvmlLoaded = False + self.jtopLoaded = False - if self.anygpuLoaded and self.deviceGetCount() > 0: - self.cudaDevicesFound = self.deviceGetCount() + if self.anygpuLoaded: + if self.deviceGetCount() > 0: + self.cudaDevicesFound = self.deviceGetCount() - logger.info(f"GPU/s:") + logger.info(f"GPU/s:") - # for simulate multiple GPUs (for testing) interchange these comments: - # for deviceIndex in range(3): - # deviceHandle = pynvml.nvmlDeviceGetHandleByIndex(0) - for deviceIndex in range(self.cudaDevicesFound): - deviceHandle = self.deviceGetHandleByIndex(deviceIndex) + for deviceIndex in range(self.cudaDevicesFound): + deviceHandle = self.deviceGetHandleByIndex(deviceIndex) - gpuName = self.deviceGetName(deviceHandle, deviceIndex) + gpuName = self.deviceGetName(deviceHandle, deviceIndex) - logger.info(f"{deviceIndex}) {gpuName}") + logger.info(f"{deviceIndex}) {gpuName}") - self.gpus.append({ - 'index': deviceIndex, - 'name': gpuName, - }) + self.gpus.append({ + 'index': deviceIndex, + 'name': gpuName, + }) - # same index as gpus, with default values - self.gpusUtilization.append(True) - self.gpusVRAM.append(True) - self.gpusTemperature.append(True) + # Same index as gpus, with default values + self.gpusUtilization.append(True) + self.gpusVRAM.append(True) + self.gpusTemperature.append(True) - self.cuda = True - logger.info(self.systemGetDriverVersion()) + self.cuda = True + logger.info(self.systemGetDriverVersion()) + else: + logger.warning('No GPU with CUDA detected.') else: - logger.warn('No GPU with CUDA detected.') + logger.warning('No GPU monitoring libraries available.') self.cudaDevice = 'cpu' if self.torchDevice == 'cpu' else 'cuda' self.cudaAvailable = torch.cuda.is_available() if self.cuda and self.cudaAvailable and self.torchDevice == 'cpu': - logger.warn('CUDA is available, but torch is using CPU.') + logger.warning('CUDA is available, but torch is using CPU.') def getInfo(self): logger.debug('Getting GPUs info...') return self.gpus def getStatus(self): - # logger.debug('CGPUInfo getStatus') gpuUtilization = -1 gpuTemperature = -1 vramUsed = -1 @@ -120,9 +142,6 @@ class CGPUInfo: gpuType = self.cudaDevice if self.anygpuLoaded and self.cuda and self.cudaAvailable: - # for simulate multiple GPUs (for testing) interchange these comments: - # for deviceIndex in range(3): - # deviceHandle = self.deviceGetHandleByIndex(0) for deviceIndex in range(self.cudaDevicesFound): deviceHandle = self.deviceGetHandleByIndex(deviceIndex) @@ -137,26 +156,17 @@ class CGPUInfo: try: gpuUtilization = self.deviceGetUtilizationRates(deviceHandle) except Exception as e: - if str(e) == "Unknown Error": - logger.error('For some reason, pynvml is not working in a laptop with only battery, try to connect and turn on the monitor') - else: - logger.error('Could not get GPU utilization.' + str(e)) - - logger.error('Monitor of GPU is turning off (not on UI!)') + logger.error('Could not get GPU utilization. ' + str(e)) + logger.error('Monitor of GPU is turning off.') self.switchGPU = False # VRAM if self.switchVRAM and self.gpusVRAM[deviceIndex]: - # Torch or pynvml?, pynvml is more accurate with the system, torch is more accurate with comfyUI memory = self.deviceGetMemoryInfo(deviceHandle) vramUsed = memory['used'] vramTotal = memory['total'] - # device = torch.device(gpuType) - # vramUsed = torch.cuda.memory_allocated(device) - # vramTotal = torch.cuda.get_device_properties(device).total_memory - - # check if vramTotal is not zero or None + # Check if vramTotal is not zero or None if vramTotal and vramTotal != 0: vramPercent = vramUsed / vramTotal * 100 @@ -183,17 +193,18 @@ class CGPUInfo: def deviceGetCount(self): if self.pynvmlLoaded: - return pynvml.nvmlDeviceGetCount() - # elif self.pyamdLoaded: - # return rocml.smi_get_device_count() + return self.pynvml.nvmlDeviceGetCount() + elif self.jtopLoaded: + # For Jetson devices, we assume there's one GPU + return 1 else: return 0 def deviceGetHandleByIndex(self, index): if self.pynvmlLoaded: - return pynvml.nvmlDeviceGetHandleByIndex(index) - # elif self.pyamdLoaded: - # return index + return self.pynvml.nvmlDeviceGetHandleByIndex(index) + elif self.jtopLoaded: + return index # On Jetson, index acts as handle else: return 0 @@ -202,10 +213,10 @@ class CGPUInfo: gpuName = 'Unknown GPU' try: - gpuName = pynvml.nvmlDeviceGetName(deviceHandle) + gpuName = self.pynvml.nvmlDeviceGetName(deviceHandle) try: gpuName = gpuName.decode('utf-8', errors='ignore') - except AttributeError as e: + except AttributeError: pass except UnicodeDecodeError as e: @@ -213,46 +224,56 @@ class CGPUInfo: print(f"UnicodeDecodeError: {e}") return gpuName - # elif self.pyamdLoaded: - # return rocml.smi_get_device_name(deviceIndex) + elif self.jtopLoaded: + if self.jtopInstance is None: + self.jtopInstance = self.jtop() + self.jtopInstance.start() + return self.jtopInstance.jetson.gpu['name'] else: return '' def systemGetDriverVersion(self): if self.pynvmlLoaded: - return f'NVIDIA Driver: {pynvml.nvmlSystemGetDriverVersion()}' - # elif self.pyamdLoaded: - # ver_str = create_string_buffer(256) - # rocml.rocm_lib.rsmi_version_str_get(0, ver_str, 256) - # return f'AMD Driver: {ver_str.value.decode()}' + return f'NVIDIA Driver: {self.pynvml.nvmlSystemGetDriverVersion()}' + elif self.jtopLoaded: + # jtop does not provide driver version directly + return 'NVIDIA Driver: (version unknown)' else: return 'Driver unknown' def deviceGetUtilizationRates(self, deviceHandle): if self.pynvmlLoaded: - return pynvml.nvmlDeviceGetUtilizationRates(deviceHandle).gpu - # elif self.pyamdLoaded: - # return rocml.smi_get_device_utilization(deviceHandle) + return self.pynvml.nvmlDeviceGetUtilizationRates(deviceHandle).gpu + elif self.jtopLoaded: + if self.jtopInstance is None: + self.jtopInstance = self.jtop() + self.jtopInstance.start() + return self.jtopInstance.stats['GPU'] else: return 0 def deviceGetMemoryInfo(self, deviceHandle): if self.pynvmlLoaded: - mem = pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) + mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) return {'total': mem.total, 'used': mem.used} - # elif self.pyamdLoaded: - # mem_used = rocml.smi_get_device_memory_used(deviceHandle) - # mem_total = rocml.smi_get_device_memory_total(deviceHandle) - # return {'total': mem_total, 'used': mem_used} + elif self.jtopLoaded: + if self.jtopInstance is None: + self.jtopInstance = self.jtop() + self.jtopInstance.start() + ram_info = self.jtopInstance.jetson.ram + total = ram_info['total'] * 1024 * 1024 # Convert MB to bytes + used = ram_info['used'] * 1024 * 1024 + return {'total': total, 'used': used} else: return {'total': 1, 'used': 1} def deviceGetTemperature(self, deviceHandle): if self.pynvmlLoaded: - return pynvml.nvmlDeviceGetTemperature(deviceHandle, pynvml.NVML_TEMPERATURE_GPU) - # elif self.pyamdLoaded: - # temp = c_int64(0) - # rocml.rocm_lib.rsmi_dev_temp_metric_get(deviceHandle, 1, 0, byref(temp)) - # return temp.value / 1000 + return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) + elif self.jtopLoaded: + if self.jtopInstance is None: + self.jtopInstance = self.jtop() + self.jtopInstance.start() + return self.jtopInstance.stats['Temp GPU'] else: return 0 From 3457ad5c5230c138f3ded509a0d7cda74d2bff0b Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 1 Nov 2024 23:30:47 +0100 Subject: [PATCH 04/23] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2447b88..e25b39c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ Pillow>=9.5.0 pynvml py-cpuinfo piexif -jtop; platform_machine == 'aarch64'" +jtop; platform_machine == 'aarch64' From a74f801b00fa16ad0374732bb2f24c80a8914c12 Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 1 Nov 2024 23:36:05 +0100 Subject: [PATCH 05/23] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e25b39c..6fb7fc9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ Pillow>=9.5.0 pynvml py-cpuinfo piexif -jtop; platform_machine == 'aarch64' +jetson-stats; platform_machine == 'aarch64' From 994cd090d7ed10ad9723a09065df3299e2508686 Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 1 Nov 2024 23:37:06 +0100 Subject: [PATCH 06/23] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6fb7fc9..7df80a5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ deepdiff torch numpy Pillow>=9.5.0 -pynvml +pynvml; platform_machine != 'aarch64' py-cpuinfo piexif jetson-stats; platform_machine == 'aarch64' From a2360215d03ce19bfd37a90bdcf8b049580c8779 Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 1 Nov 2024 23:39:22 +0100 Subject: [PATCH 07/23] Update gpu.py --- general/gpu.py | 47 +++++++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index a25674f..e036927 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -7,9 +7,6 @@ def is_jetson() -> bool: """ Determines if the Python environment is running on a Jetson device by checking the device model information. - - Returns: - (bool): True if running on a Jetson device, False otherwise. """ PROC_DEVICE_MODEL = '' try: @@ -47,11 +44,14 @@ class CGPUInfo: try: from jtop import jtop self.jtop = jtop - self.jtopInstance = None + self.jtopInstance = self.jtop() + self.jtopInstance.start() self.jtopLoaded = True logger.info('jtop initialized on Jetson device.') except ImportError as e: logger.error('jtop is not installed. ' + str(e)) + except Exception as e: + logger.error('Could not initialize jtop. ' + str(e)) else: # Try to import pynvml for non-Jetson devices try: @@ -162,13 +162,17 @@ class CGPUInfo: # VRAM if self.switchVRAM and self.gpusVRAM[deviceIndex]: - memory = self.deviceGetMemoryInfo(deviceHandle) - vramUsed = memory['used'] - vramTotal = memory['total'] + try: + memory = self.deviceGetMemoryInfo(deviceHandle) + vramUsed = memory['used'] + vramTotal = memory['total'] - # Check if vramTotal is not zero or None - if vramTotal and vramTotal != 0: - vramPercent = vramUsed / vramTotal * 100 + # Check if vramTotal is not zero or None + if vramTotal and vramTotal != 0: + vramPercent = vramUsed / vramTotal * 100 + except Exception as e: + logger.error('Could not get GPU memory info. ' + str(e)) + self.switchVRAM = False # Temperature if self.switchTemperature and self.gpusTemperature[deviceIndex]: @@ -225,9 +229,6 @@ class CGPUInfo: return gpuName elif self.jtopLoaded: - if self.jtopInstance is None: - self.jtopInstance = self.jtop() - self.jtopInstance.start() return self.jtopInstance.jetson.gpu['name'] else: return '' @@ -237,7 +238,7 @@ class CGPUInfo: return f'NVIDIA Driver: {self.pynvml.nvmlSystemGetDriverVersion()}' elif self.jtopLoaded: # jtop does not provide driver version directly - return 'NVIDIA Driver: (version unknown)' + return f'NVIDIA Driver: {self.jtopInstance.jetson.software["NV Power Mode"]}' else: return 'Driver unknown' @@ -245,24 +246,17 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetUtilizationRates(deviceHandle).gpu elif self.jtopLoaded: - if self.jtopInstance is None: - self.jtopInstance = self.jtop() - self.jtopInstance.start() return self.jtopInstance.stats['GPU'] else: return 0 def deviceGetMemoryInfo(self, deviceHandle): if self.pynvmlLoaded: - mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) - return {'total': mem.total, 'used': mem.used} + return self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) elif self.jtopLoaded: - if self.jtopInstance is None: - self.jtopInstance = self.jtop() - self.jtopInstance.start() - ram_info = self.jtopInstance.jetson.ram - total = ram_info['total'] * 1024 * 1024 # Convert MB to bytes - used = ram_info['used'] * 1024 * 1024 + gpu_info = self.jtopInstance.jetson.gpu + total = gpu_info['freq']['max'] * 1024 * 1024 # Assuming max freq as total memory (adjust as needed) + used = gpu_info['freq']['cur'] * 1024 * 1024 # Assuming current freq as used memory (adjust as needed) return {'total': total, 'used': used} else: return {'total': 1, 'used': 1} @@ -271,9 +265,6 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: - if self.jtopInstance is None: - self.jtopInstance = self.jtop() - self.jtopInstance.start() return self.jtopInstance.stats['Temp GPU'] else: return 0 From 940291cb91969f94327cd109076ffcc440fa8f51 Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 1 Nov 2024 23:49:27 +0100 Subject: [PATCH 08/23] Update gpu.py --- general/gpu.py | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index e036927..774023e 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -7,15 +7,20 @@ def is_jetson() -> bool: """ Determines if the Python environment is running on a Jetson device by checking the device model information. + + Returns: + bool: True if running on a Jetson device, False otherwise. """ PROC_DEVICE_MODEL = '' try: with open('/proc/device-tree/model', 'r') as f: - PROC_DEVICE_MODEL = f.read() - except Exception: - pass + PROC_DEVICE_MODEL = f.read().strip() + logger.info(f"Device model: {PROC_DEVICE_MODEL}") + except Exception as e: + logger.error(f"Could not read /proc/device-tree/model: {e}") + return False - return "NVIDIA Jetson" in PROC_DEVICE_MODEL + return "NVIDIA" in PROC_DEVICE_MODEL IS_JETSON = is_jetson() @@ -225,7 +230,7 @@ class CGPUInfo: except UnicodeDecodeError as e: gpuName = 'Unknown GPU (decoding error)' - print(f"UnicodeDecodeError: {e}") + logger.error(f"UnicodeDecodeError: {e}") return gpuName elif self.jtopLoaded: @@ -237,8 +242,7 @@ class CGPUInfo: if self.pynvmlLoaded: return f'NVIDIA Driver: {self.pynvml.nvmlSystemGetDriverVersion()}' elif self.jtopLoaded: - # jtop does not provide driver version directly - return f'NVIDIA Driver: {self.jtopInstance.jetson.software["NV Power Mode"]}' + return f'NVIDIA Driver: {self.jtopInstance.jetson.software.get("NV Power Mode", "unknown")}' else: return 'Driver unknown' @@ -246,18 +250,20 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetUtilizationRates(deviceHandle).gpu elif self.jtopLoaded: - return self.jtopInstance.stats['GPU'] + return self.jtopInstance.stats.get('GPU', -1) else: return 0 def deviceGetMemoryInfo(self, deviceHandle): if self.pynvmlLoaded: - return self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) + mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) + return {'total': mem.total, 'used': mem.used} elif self.jtopLoaded: + # Adjust according to jtop's actual data structure gpu_info = self.jtopInstance.jetson.gpu - total = gpu_info['freq']['max'] * 1024 * 1024 # Assuming max freq as total memory (adjust as needed) - used = gpu_info['freq']['cur'] * 1024 * 1024 # Assuming current freq as used memory (adjust as needed) - return {'total': total, 'used': used} + vramTotal = gpu_info['freq'].get('max', 0) * 1024 * 1024 # Assuming freq in MHz, converting to bytes + vramUsed = gpu_info['freq'].get('cur', 0) * 1024 * 1024 + return {'total': vramTotal, 'used': vramUsed} else: return {'total': 1, 'used': 1} @@ -265,6 +271,10 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: - return self.jtopInstance.stats['Temp GPU'] + return self.jtopInstance.stats.get('Temp GPU', -1) else: return 0 + + def close(self): + if self.jtopLoaded and self.jtopInstance is not None: + self.jtopInstance.close() From ffccab2d70391f1f49916113ba8c8f7d7414745c Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 2 Nov 2024 00:03:32 +0100 Subject: [PATCH 09/23] Update gpu.py --- general/gpu.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index 774023e..cbc3ba3 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -2,11 +2,12 @@ import torch import comfy.model_management from ..core import logger import os +import platform def is_jetson() -> bool: """ Determines if the Python environment is running on a Jetson device by checking the device model - information. + information or the platform release. Returns: bool: True if running on a Jetson device, False otherwise. @@ -16,11 +17,18 @@ def is_jetson() -> bool: with open('/proc/device-tree/model', 'r') as f: PROC_DEVICE_MODEL = f.read().strip() logger.info(f"Device model: {PROC_DEVICE_MODEL}") + return "NVIDIA" in PROC_DEVICE_MODEL except Exception as e: logger.error(f"Could not read /proc/device-tree/model: {e}") - return False - - return "NVIDIA" in PROC_DEVICE_MODEL + # If /proc/device-tree/model is not available, check platform.release() + platform_release = platform.release() + logger.info(f"Platform release: {platform_release}") + if 'tegra' in platform_release.lower(): + logger.info("Detected 'tegra' in platform release. Assuming Jetson device.") + return True + else: + logger.warning("Could not detect Jetson device.") + return False IS_JETSON = is_jetson() From 615055eda7b2aad417579f2da9fc71e052ce3cd7 Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 2 Nov 2024 00:06:44 +0100 Subject: [PATCH 10/23] Update gpu.py --- general/gpu.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index cbc3ba3..7b42bc8 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -56,8 +56,7 @@ class CGPUInfo: # Try to import jtop for Jetson devices try: from jtop import jtop - self.jtop = jtop - self.jtopInstance = self.jtop() + self.jtopInstance = jtop() self.jtopInstance.start() self.jtopLoaded = True logger.info('jtop initialized on Jetson device.') @@ -242,7 +241,9 @@ class CGPUInfo: return gpuName elif self.jtopLoaded: - return self.jtopInstance.jetson.gpu['name'] + self.jtopInstance.update() + gpu_name = self.jtopInstance.gpu.get('name', 'Unknown GPU') + return gpu_name else: return '' @@ -250,7 +251,8 @@ class CGPUInfo: if self.pynvmlLoaded: return f'NVIDIA Driver: {self.pynvml.nvmlSystemGetDriverVersion()}' elif self.jtopLoaded: - return f'NVIDIA Driver: {self.jtopInstance.jetson.software.get("NV Power Mode", "unknown")}' + # No direct method to get driver version from jtop + return 'NVIDIA Driver: unknown' else: return 'Driver unknown' @@ -258,6 +260,7 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetUtilizationRates(deviceHandle).gpu elif self.jtopLoaded: + self.jtopInstance.update() return self.jtopInstance.stats.get('GPU', -1) else: return 0 @@ -267,8 +270,10 @@ class CGPUInfo: mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) return {'total': mem.total, 'used': mem.used} elif self.jtopLoaded: - # Adjust according to jtop's actual data structure - gpu_info = self.jtopInstance.jetson.gpu + self.jtopInstance.update() + gpu_info = self.jtopInstance.gpu + # Since Jetson devices share memory with system, this might not be accurate + # Adjust according to actual data provided by jtop vramTotal = gpu_info['freq'].get('max', 0) * 1024 * 1024 # Assuming freq in MHz, converting to bytes vramUsed = gpu_info['freq'].get('cur', 0) * 1024 * 1024 return {'total': vramTotal, 'used': vramUsed} @@ -279,6 +284,7 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: + self.jtopInstance.update() return self.jtopInstance.stats.get('Temp GPU', -1) else: return 0 From 61cb37c875af21f630932543efa260a195665902 Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 2 Nov 2024 00:12:47 +0100 Subject: [PATCH 11/23] Update gpu.py --- general/gpu.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index 7b42bc8..5488dac 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -57,7 +57,6 @@ class CGPUInfo: try: from jtop import jtop self.jtopInstance = jtop() - self.jtopInstance.start() self.jtopLoaded = True logger.info('jtop initialized on Jetson device.') except ImportError as e: @@ -241,8 +240,8 @@ class CGPUInfo: return gpuName elif self.jtopLoaded: - self.jtopInstance.update() - gpu_name = self.jtopInstance.gpu.get('name', 'Unknown GPU') + with self.jtopInstance: + gpu_name = self.jtopInstance.gpu['name'] return gpu_name else: return '' @@ -260,8 +259,9 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetUtilizationRates(deviceHandle).gpu elif self.jtopLoaded: - self.jtopInstance.update() - return self.jtopInstance.stats.get('GPU', -1) + with self.jtopInstance: + utilization = self.jtopInstance.stats['GPU'] + return utilization else: return 0 @@ -270,13 +270,12 @@ class CGPUInfo: mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) return {'total': mem.total, 'used': mem.used} elif self.jtopLoaded: - self.jtopInstance.update() - gpu_info = self.jtopInstance.gpu - # Since Jetson devices share memory with system, this might not be accurate - # Adjust according to actual data provided by jtop - vramTotal = gpu_info['freq'].get('max', 0) * 1024 * 1024 # Assuming freq in MHz, converting to bytes - vramUsed = gpu_info['freq'].get('cur', 0) * 1024 * 1024 - return {'total': vramTotal, 'used': vramUsed} + with self.jtopInstance: + # Jetson devices have unified memory; adjust as needed + ram_info = self.jtopInstance.ram + total = ram_info['tot'] * 1024 * 1024 # Convert MB to bytes + used = ram_info['use'] * 1024 * 1024 + return {'total': total, 'used': used} else: return {'total': 1, 'used': 1} @@ -284,8 +283,9 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: - self.jtopInstance.update() - return self.jtopInstance.stats.get('Temp GPU', -1) + with self.jtopInstance: + temperature = self.jtopInstance.stats['Temp GPU'] + return temperature else: return 0 From 5eebdbadad0ef81efeb144762b21ca4c45dbfb94 Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 2 Nov 2024 00:16:30 +0100 Subject: [PATCH 12/23] Update gpu.py --- general/gpu.py | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index 5488dac..3296c59 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -8,9 +8,6 @@ def is_jetson() -> bool: """ Determines if the Python environment is running on a Jetson device by checking the device model information or the platform release. - - Returns: - bool: True if running on a Jetson device, False otherwise. """ PROC_DEVICE_MODEL = '' try: @@ -57,6 +54,7 @@ class CGPUInfo: try: from jtop import jtop self.jtopInstance = jtop() + self.jtopInstance.start() self.jtopLoaded = True logger.info('jtop initialized on Jetson device.') except ImportError as e: @@ -240,8 +238,8 @@ class CGPUInfo: return gpuName elif self.jtopLoaded: - with self.jtopInstance: - gpu_name = self.jtopInstance.gpu['name'] + # Access the GPU name from self.jtopInstance.board + gpu_name = self.jtopInstance.board.get('GPU', 'Unknown GPU') return gpu_name else: return '' @@ -259,8 +257,8 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetUtilizationRates(deviceHandle).gpu elif self.jtopLoaded: - with self.jtopInstance: - utilization = self.jtopInstance.stats['GPU'] + # GPU utilization from jtop stats + utilization = self.jtopInstance.stats.get('GPU', -1) return utilization else: return 0 @@ -270,12 +268,11 @@ class CGPUInfo: mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) return {'total': mem.total, 'used': mem.used} elif self.jtopLoaded: - with self.jtopInstance: - # Jetson devices have unified memory; adjust as needed - ram_info = self.jtopInstance.ram - total = ram_info['tot'] * 1024 * 1024 # Convert MB to bytes - used = ram_info['use'] * 1024 * 1024 - return {'total': total, 'used': used} + # On Jetson devices, GPU shares memory with RAM + ram_info = self.jtopInstance.stats.get('RAM', {}) + total = ram_info.get('tot', -1) * 1024 * 1024 # Convert MB to bytes + used = ram_info.get('use', -1) * 1024 * 1024 + return {'total': total, 'used': used} else: return {'total': 1, 'used': 1} @@ -283,8 +280,7 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: - with self.jtopInstance: - temperature = self.jtopInstance.stats['Temp GPU'] + temperature = self.jtopInstance.stats.get('Temp GPU', -1) return temperature else: return 0 From f07b9fd19718cbbf5f771035dce0b75ef8d8f34a Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 2 Nov 2024 00:20:01 +0100 Subject: [PATCH 13/23] Update gpu.py --- general/gpu.py | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index 3296c59..c9d2cc1 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -238,9 +238,14 @@ class CGPUInfo: return gpuName elif self.jtopLoaded: - # Access the GPU name from self.jtopInstance.board - gpu_name = self.jtopInstance.board.get('GPU', 'Unknown GPU') - return gpu_name + # Access the GPU name from self.jtopInstance.gpu + try: + gpu_info = self.jtopInstance.gpu + gpu_name = next(iter(gpu_info.keys())) + return gpu_name + except Exception as e: + logger.error('Could not get GPU name. ' + str(e)) + return 'Unknown GPU' else: return '' @@ -258,8 +263,12 @@ class CGPUInfo: return self.pynvml.nvmlDeviceGetUtilizationRates(deviceHandle).gpu elif self.jtopLoaded: # GPU utilization from jtop stats - utilization = self.jtopInstance.stats.get('GPU', -1) - return utilization + try: + gpu_util = self.jtopInstance.stats.get('GPU', -1) + return gpu_util + except Exception as e: + logger.error('Could not get GPU utilization. ' + str(e)) + return -1 else: return 0 @@ -268,11 +277,15 @@ class CGPUInfo: mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) return {'total': mem.total, 'used': mem.used} elif self.jtopLoaded: - # On Jetson devices, GPU shares memory with RAM - ram_info = self.jtopInstance.stats.get('RAM', {}) - total = ram_info.get('tot', -1) * 1024 * 1024 # Convert MB to bytes - used = ram_info.get('use', -1) * 1024 * 1024 - return {'total': total, 'used': used} + # On Jetson devices, use self.jtopInstance.memory + try: + ram_info = self.jtopInstance.memory + total = ram_info.get('total', -1) # in bytes + used = ram_info.get('used', -1) # in bytes + return {'total': total, 'used': used} + except Exception as e: + logger.error('Could not get memory info from jtop. ' + str(e)) + return {'total': -1, 'used': -1} else: return {'total': 1, 'used': 1} @@ -280,8 +293,12 @@ class CGPUInfo: if self.pynvmlLoaded: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: - temperature = self.jtopInstance.stats.get('Temp GPU', -1) - return temperature + try: + temperature = self.jtopInstance.stats.get('Temp GPU', -1) + return temperature + except Exception as e: + logger.error('Could not get GPU temperature. ' + str(e)) + return -1 else: return 0 From 04ad589e9dd6cac7afb1a9dc944f4d54f2e1dd12 Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 2 Nov 2024 00:30:34 +0100 Subject: [PATCH 14/23] Update gpu.py --- general/gpu.py | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index c9d2cc1..f241188 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -170,18 +170,25 @@ class CGPUInfo: self.switchGPU = False # VRAM - if self.switchVRAM and self.gpusVRAM[deviceIndex]: - try: - memory = self.deviceGetMemoryInfo(deviceHandle) - vramUsed = memory['used'] - vramTotal = memory['total'] + if IS_JETSON: + # On Jetson devices, VRAM metrics are not applicable + vramUsed = None + vramTotal = None + vramPercent = None + self.switchVRAM = False + else: + if self.switchVRAM and self.gpusVRAM[deviceIndex]: + try: + memory = self.deviceGetMemoryInfo(deviceHandle) + vramUsed = memory['used'] + vramTotal = memory['total'] - # Check if vramTotal is not zero or None - if vramTotal and vramTotal != 0: - vramPercent = vramUsed / vramTotal * 100 - except Exception as e: - logger.error('Could not get GPU memory info. ' + str(e)) - self.switchVRAM = False + # Check if vramTotal is not zero or None + if vramTotal and vramTotal != 0: + vramPercent = vramUsed / vramTotal * 100 + except Exception as e: + logger.error('Could not get GPU memory info. ' + str(e)) + self.switchVRAM = False # Temperature if self.switchTemperature and self.gpusTemperature[deviceIndex]: @@ -277,15 +284,8 @@ class CGPUInfo: mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) return {'total': mem.total, 'used': mem.used} elif self.jtopLoaded: - # On Jetson devices, use self.jtopInstance.memory - try: - ram_info = self.jtopInstance.memory - total = ram_info.get('total', -1) # in bytes - used = ram_info.get('used', -1) # in bytes - return {'total': total, 'used': used} - except Exception as e: - logger.error('Could not get memory info from jtop. ' + str(e)) - return {'total': -1, 'used': -1} + # On Jetson devices, VRAM metrics are not applicable + return {'total': None, 'used': None} else: return {'total': 1, 'used': 1} From 59d33f25c50b60953a9d7900a10133c3a4bd9666 Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 2 Nov 2024 22:01:34 +0100 Subject: [PATCH 15/23] Update gpu.py --- general/gpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/gpu.py b/general/gpu.py index f241188..3b4a7f2 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -294,7 +294,7 @@ class CGPUInfo: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: try: - temperature = self.jtopInstance.stats.get('Temp GPU', -1) + temperature = self.jtopInstance.temperature.get('GPU', -1) return temperature except Exception as e: logger.error('Could not get GPU temperature. ' + str(e)) From 1d054df52a33d3f492723dbd7f8c5c62728154c3 Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 11 Mar 2025 16:25:14 +0100 Subject: [PATCH 16/23] Update gpu.py --- general/gpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/gpu.py b/general/gpu.py index 3b4a7f2..e758939 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -294,7 +294,7 @@ class CGPUInfo: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: try: - temperature = self.jtopInstance.temperature.get('GPU', -1) + temperature = self.jtopInstance.temperature.get('Temp gpu', -1) return temperature except Exception as e: logger.error('Could not get GPU temperature. ' + str(e)) From 82f6e34a27a53c78d132ba2b17ea105313025757 Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 11 Mar 2025 17:52:02 +0100 Subject: [PATCH 17/23] Update gpu.py --- general/gpu.py | 1 + 1 file changed, 1 insertion(+) diff --git a/general/gpu.py b/general/gpu.py index e758939..14077b3 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -295,6 +295,7 @@ class CGPUInfo: elif self.jtopLoaded: try: temperature = self.jtopInstance.temperature.get('Temp gpu', -1) + print(temperature) return temperature except Exception as e: logger.error('Could not get GPU temperature. ' + str(e)) From 0ec9a1bd1280cd567895507cfcecde9ca2826d00 Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 11 Mar 2025 18:26:16 +0100 Subject: [PATCH 18/23] Update gpu.py --- general/gpu.py | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index 14077b3..8bc7e48 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -169,26 +169,18 @@ class CGPUInfo: logger.error('Monitor of GPU is turning off.') self.switchGPU = False - # VRAM - if IS_JETSON: - # On Jetson devices, VRAM metrics are not applicable - vramUsed = None - vramTotal = None - vramPercent = None - self.switchVRAM = False - else: - if self.switchVRAM and self.gpusVRAM[deviceIndex]: - try: - memory = self.deviceGetMemoryInfo(deviceHandle) - vramUsed = memory['used'] - vramTotal = memory['total'] + if self.switchVRAM and self.gpusVRAM[deviceIndex]: + try: + memory = self.deviceGetMemoryInfo(deviceHandle) + vramUsed = memory['used'] + vramTotal = memory['total'] - # Check if vramTotal is not zero or None - if vramTotal and vramTotal != 0: - vramPercent = vramUsed / vramTotal * 100 - except Exception as e: - logger.error('Could not get GPU memory info. ' + str(e)) - self.switchVRAM = False + # Check if vramTotal is not zero or None + if vramTotal and vramTotal != 0: + vramPercent = vramUsed / vramTotal * 100 + except Exception as e: + logger.error('Could not get GPU memory info. ' + str(e)) + self.switchVRAM = False # Temperature if self.switchTemperature and self.gpusTemperature[deviceIndex]: @@ -284,8 +276,14 @@ class CGPUInfo: mem = self.pynvml.nvmlDeviceGetMemoryInfo(deviceHandle) return {'total': mem.total, 'used': mem.used} elif self.jtopLoaded: - # On Jetson devices, VRAM metrics are not applicable - return {'total': None, 'used': None} + mem_data = self.jtopInstance.memory['RAM'] + total = mem_data['tot'] + shared = mem_data['shared'] + print(mem_data) + print(total) + print(shared) + + return {'total': total, 'used': shared} else: return {'total': 1, 'used': 1} @@ -294,8 +292,7 @@ class CGPUInfo: return self.pynvml.nvmlDeviceGetTemperature(deviceHandle, self.pynvml.NVML_TEMPERATURE_GPU) elif self.jtopLoaded: try: - temperature = self.jtopInstance.temperature.get('Temp gpu', -1) - print(temperature) + temperature = self.jtopInstance.stats.get('Temp gpu', -1) return temperature except Exception as e: logger.error('Could not get GPU temperature. ' + str(e)) From 9bba9509757d00f9c62e6649474a60bb6acc122b Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 11 Mar 2025 19:02:17 +0100 Subject: [PATCH 19/23] Update gpu.py --- general/gpu.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index 8bc7e48..7e012f1 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -279,10 +279,6 @@ class CGPUInfo: mem_data = self.jtopInstance.memory['RAM'] total = mem_data['tot'] shared = mem_data['shared'] - print(mem_data) - print(total) - print(shared) - return {'total': total, 'used': shared} else: return {'total': 1, 'used': 1} From e0fb13c39170eda8e851d4e7bf829b890218166b Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 11 Mar 2025 19:03:46 +0100 Subject: [PATCH 20/23] Update gpu.py --- general/gpu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index 7e012f1..cd759b7 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -278,8 +278,8 @@ class CGPUInfo: elif self.jtopLoaded: mem_data = self.jtopInstance.memory['RAM'] total = mem_data['tot'] - shared = mem_data['shared'] - return {'total': total, 'used': shared} + used = mem_data['used'] + return {'total': total, 'used': used} else: return {'total': 1, 'used': 1} From 001643462b411a6c30cd23a750e04d9b83433525 Mon Sep 17 00:00:00 2001 From: Crystian Date: Sun, 1 Jun 2025 23:41:53 +0200 Subject: [PATCH 21/23] monitors update by settings on the fly --- general/gpu.py | 4 ++-- web/monitor.js | 13 ++++++------- web/monitor.ts | 14 +++++++------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/general/gpu.py b/general/gpu.py index cd759b7..1b453d6 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -16,7 +16,7 @@ def is_jetson() -> bool: logger.info(f"Device model: {PROC_DEVICE_MODEL}") return "NVIDIA" in PROC_DEVICE_MODEL except Exception as e: - logger.error(f"Could not read /proc/device-tree/model: {e}") + # logger.warning(f"JETSON: Could not read /proc/device-tree/model: {e} (If you're not using Jetson, ignore this warning)") # If /proc/device-tree/model is not available, check platform.release() platform_release = platform.release() logger.info(f"Platform release: {platform_release}") @@ -24,7 +24,7 @@ def is_jetson() -> bool: logger.info("Detected 'tegra' in platform release. Assuming Jetson device.") return True else: - logger.warning("Could not detect Jetson device.") + logger.warning("JETSON: Not detected.") return False IS_JETSON = is_jetson() diff --git a/web/monitor.js b/web/monitor.js index 0ca4176..b1fa1ed 100644 --- a/web/monitor.js +++ b/web/monitor.js @@ -271,8 +271,8 @@ class CrystoolsMonitor { htmlMonitorLabelRef: undefined, cssColor: Colors.CPU, onChange: async (value) => { - this.updateWidget(this.monitorCPUElement); await this.updateServer({ switchCPU: value }); + this.updateWidget(this.monitorCPUElement); }, }; } @@ -295,8 +295,8 @@ class CrystoolsMonitor { htmlMonitorLabelRef: undefined, cssColor: Colors.RAM, onChange: async (value) => { - this.updateWidget(this.monitorRAMElement); await this.updateServer({ switchRAM: value }); + this.updateWidget(this.monitorRAMElement); }, }; } @@ -326,8 +326,8 @@ class CrystoolsMonitor { htmlMonitorLabelRef: undefined, cssColor: Colors.GPU, onChange: async (value) => { + await this.updateServerGPU(index, { utilization: value }); this.updateWidget(monitorGPUNElement); - void await this.updateServerGPU(index, { utilization: value }); }, }; this.monitorGPUSettings[index] = monitorGPUNElement; @@ -360,8 +360,8 @@ class CrystoolsMonitor { htmlMonitorLabelRef: undefined, cssColor: Colors.VRAM, onChange: async (value) => { + await this.updateServerGPU(index, { vram: value }); this.updateWidget(monitorVRAMNElement); - void await this.updateServerGPU(index, { vram: value }); }, }; this.monitorVRAMSettings[index] = monitorVRAMNElement; @@ -395,8 +395,8 @@ class CrystoolsMonitor { cssColor: Colors.TEMP_START, cssColorFinal: Colors.TEMP_END, onChange: async (value) => { + await this.updateServerGPU(index, { temperature: value }); this.updateWidget(monitorTemperatureNElement); - void await this.updateServerGPU(index, { temperature: value }); }, }; this.monitorTemperatureSettings[index] = monitorTemperatureNElement; @@ -422,8 +422,8 @@ class CrystoolsMonitor { htmlMonitorLabelRef: undefined, cssColor: Colors.DISK, onChange: async (value) => { - this.updateWidget(this.monitorHDDElement); await this.updateServer({ switchHDD: value }); + this.updateWidget(this.monitorHDDElement); }, }; this.settingsHDD = { @@ -497,7 +497,6 @@ class CrystoolsMonitor { configurable: true, writable: true, value: (menuPosition) => { - console.log('moveMonitor', menuPosition); let parentElement; switch (menuPosition) { case MenuDisplayOptions.Disabled: diff --git a/web/monitor.ts b/web/monitor.ts index 427ee84..a97a56f 100644 --- a/web/monitor.ts +++ b/web/monitor.ts @@ -211,8 +211,8 @@ class CrystoolsMonitor { cssColor: Colors.CPU, // @ts-ignore onChange: async(value: boolean): Promise => { - this.updateWidget(this.monitorCPUElement); await this.updateServer({switchCPU: value}); + this.updateWidget(this.monitorCPUElement); }, }; }; @@ -233,8 +233,8 @@ class CrystoolsMonitor { cssColor: Colors.RAM, // @ts-ignore onChange: async(value: boolean): Promise => { - this.updateWidget(this.monitorRAMElement); await this.updateServer({switchRAM: value}); + this.updateWidget(this.monitorRAMElement); }, }; }; @@ -263,8 +263,8 @@ class CrystoolsMonitor { cssColor: Colors.GPU, // @ts-ignore onChange: async(value: boolean): Promise => { + await this.updateServerGPU(index, {utilization: value}); this.updateWidget(monitorGPUNElement); - void await this.updateServerGPU(index, {utilization: value}); }, }; @@ -298,8 +298,8 @@ class CrystoolsMonitor { cssColor: Colors.VRAM, // @ts-ignore onChange: async(value: boolean): Promise => { + await this.updateServerGPU(index, {vram: value}); this.updateWidget(monitorVRAMNElement); - void await this.updateServerGPU(index, {vram: value}); }, }; @@ -334,8 +334,8 @@ class CrystoolsMonitor { cssColorFinal: Colors.TEMP_END, // @ts-ignore onChange: async(value: boolean): Promise => { + await this.updateServerGPU(index, {temperature: value}); this.updateWidget(monitorTemperatureNElement); - void await this.updateServerGPU(index, {temperature: value}); }, }; @@ -361,8 +361,8 @@ class CrystoolsMonitor { cssColor: Colors.DISK, // @ts-ignore onChange: async(value: boolean): Promise => { - this.updateWidget(this.monitorHDDElement); await this.updateServer({switchHDD: value}); + this.updateWidget(this.monitorHDDElement); }, }; @@ -429,7 +429,7 @@ class CrystoolsMonitor { }; moveMonitor = (menuPosition: MenuDisplayOptions): void => { - console.log('moveMonitor', menuPosition); + // console.log('moveMonitor', menuPosition); // setTimeout(() => { let parentElement: Element | null | undefined; From 202b9964e21ba1bf149198ac0bc6f3e0f70c2fa0 Mon Sep 17 00:00:00 2001 From: Crystian Date: Sun, 1 Jun 2025 23:42:17 +0200 Subject: [PATCH 22/23] new version --- __init__.py | 2 +- core/version.py | 2 +- pyproject.toml | 2 +- version | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/__init__.py b/__init__.py index ed58d86..23be8be 100644 --- a/__init__.py +++ b/__init__.py @@ -2,7 +2,7 @@ @author: Crystian @title: Crystools @nickname: Crystools -@version: 1.22.1 +@version: 1.23.0 @project: "https://github.com/crystian/ComfyUI-Crystools", @description: Plugins for multiples uses, mainly for debugging, you need them! IG: https://www.instagram.com/crystian.ia """ diff --git a/core/version.py b/core/version.py index 9490aec..ed46ca3 100644 --- a/core/version.py +++ b/core/version.py @@ -1 +1 @@ -version = "1.22.1" +version = "1.23.0" diff --git a/pyproject.toml b/pyproject.toml index 913a335..3af1a4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "ComfyUI-Crystools" description = "With this suit, you can see the resources monitor, progress bar & time elapsed, metadata and compare between two images, compare between two JSONs, show any value to console/display, pipes, and more!\nThis provides better nodes to load/save images, previews, etc, and see \"hidden\" data without loading a new workflow." -version = "1.22.1" +version = "1.23.0" license = { file = "LICENSE" } dependencies = ["deepdiff", "torch", "numpy", "Pillow", "pynvml", "py-cpuinfo"] diff --git a/version b/version index 6245bee..a6c2798 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.22.1 +1.23.0 From c07f691ab41ff9e2eb26db6ebe0d7f2b5b11217f Mon Sep 17 00:00:00 2001 From: Crystian Date: Mon, 2 Jun 2025 00:31:04 +0200 Subject: [PATCH 23/23] new release --- README.md | 4 ++++ general/gpu.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 413eb5a..0243719 100644 --- a/README.md +++ b/README.md @@ -516,6 +516,10 @@ You have predefined switches (string, latent, image, conditioning) but you can u ### Crystools +### 1.23.0 (02/06/2025) +- Jetson support added by @johnnynunez +- some ui fixes + ### 1.20.0 (21/10/2024) - BETA of JSON file reader and extractor, to allow you to read your own JSON files and extract the values to use in your workflow diff --git a/general/gpu.py b/general/gpu.py index 1b453d6..78827f1 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -24,7 +24,7 @@ def is_jetson() -> bool: logger.info("Detected 'tegra' in platform release. Assuming Jetson device.") return True else: - logger.warning("JETSON: Not detected.") + logger.info("JETSON: Not detected.") return False IS_JETSON = is_jetson()