From 06edb7118cee6f26796048b78e07d58dade04fe3 Mon Sep 17 00:00:00 2001 From: Crystian Date: Wed, 27 Mar 2024 15:51:27 +0100 Subject: [PATCH] temperature is added --- __init__.py | 2 +- core/version.py | 2 +- general/gpu.py | 21 ++++++++- server/monitor.py | 6 +++ version | 2 +- web/monitor.js | 83 ++++++++++++++++++++++++++++++----- web/monitor.ts | 99 +++++++++++++++++++++++++++++++++++------- web/monitor.types.d.ts | 4 ++ 8 files changed, 189 insertions(+), 30 deletions(-) diff --git a/__init__.py b/__init__.py index b78c574..55bde3b 100644 --- a/__init__.py +++ b/__init__.py @@ -2,7 +2,7 @@ @author: Crystian @title: Crystools @nickname: Crystools -@version: 1.11.0 +@version: 1.12.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 b6d4831..6f73501 100644 --- a/core/version.py +++ b/core/version.py @@ -1 +1 @@ -version = "1.11.0" +version = "1.12.0" diff --git a/general/gpu.py b/general/gpu.py index e652a5d..0298085 100644 --- a/general/gpu.py +++ b/general/gpu.py @@ -17,9 +17,11 @@ class CGPUInfo: cudaDevicesFound = 0 switchGPU = True switchVRAM = True + switchTemperature = True gpus = [] gpusUtilization = [] gpusVRAM = [] + gpusTemperature = [] def __init__(self): try: @@ -52,6 +54,7 @@ class CGPUInfo: # same index as gpus, with default values self.gpusUtilization.append(True) self.gpusVRAM.append(True) + self.gpusTemperature.append(True) self.cuda = True logger.info(f'NVIDIA Driver: {pynvml.nvmlSystemGetDriverVersion()}') @@ -76,6 +79,7 @@ class CGPUInfo: def getStatus(self): # logger.debug('CGPUInfo getStatus') gpuUtilization = -1 + gpuTemperature = -1 vramUsed = -1 vramTotal = -1 vramPercent = -1 @@ -87,6 +91,7 @@ class CGPUInfo: gpuType = 'cpu' gpus.append({ 'gpu_utilization': 0, + 'gpu_temperature': 0, 'vram_total': 0, 'vram_used': 0, 'vram_used_percent': 0, @@ -102,9 +107,14 @@ class CGPUInfo: for deviceIndex in range(self.cudaDevicesFound): deviceHandle = pynvml.nvmlDeviceGetHandleByIndex(deviceIndex) + gpuUtilization = 0 + vramPercent = 0 + vramUsed = 0 + vramTotal = 0 + gpuTemperature = 0 + # GPU Utilization if self.switchGPU and self.gpusUtilization[deviceIndex]: - gpuUtilization = 0 try: utilization = pynvml.nvmlDeviceGetUtilizationRates(deviceHandle) gpuUtilization = utilization.gpu @@ -130,8 +140,17 @@ class CGPUInfo: vramPercent = vramUsed / vramTotal * 100 + # Temperature + if self.switchTemperature and self.gpusTemperature[deviceIndex]: + try: + gpuTemperature = pynvml.nvmlDeviceGetTemperature(deviceHandle, 0) + except Exception as e: + logger.error('Could not get GPU temperature. Turning off this feature. ' + str(e)) + self.switchTemperature = False + gpus.append({ 'gpu_utilization': gpuUtilization, + 'gpu_temperature': gpuTemperature, 'vram_total': vramTotal, 'vram_used': vramUsed, 'vram_used_percent': vramPercent, diff --git a/server/monitor.py b/server/monitor.py index b77144d..5e0accd 100644 --- a/server/monitor.py +++ b/server/monitor.py @@ -113,6 +113,12 @@ async def getGPUs(request): cmonitor.hardwareInfo.GPUInfo.gpusVRAM[int(index)] = settings['vram'] + if 'temperature' in settings is not None: + if type(settings['temperature']) is not bool: + raise Exception('temperature must be an boolean.') + + cmonitor.hardwareInfo.GPUInfo.gpusTemperature[int(index)] = settings['temperature'] + return web.Response(status=200) except Exception as e: logger.error(e) diff --git a/version b/version index 1cac385..0eed1a2 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.11.0 +1.12.0 diff --git a/web/monitor.js b/web/monitor.js index 7e02709..2d09b49 100644 --- a/web/monitor.js +++ b/web/monitor.js @@ -63,6 +63,12 @@ class CrystoolsMonitor { writable: true, value: [] }); + Object.defineProperty(this, "monitorTemperatureSettings", { + enumerable: true, + configurable: true, + writable: true, + value: [] + }); Object.defineProperty(this, "monitorCPUElement", { enumerable: true, configurable: true, @@ -72,6 +78,7 @@ class CrystoolsMonitor { name: this.menuPrefix + ' [monitor] CPU Usage', type: 'boolean', label: 'CPU', + symbol: '%', defaultValue: true, htmlMonitorRef: undefined, htmlMonitorSliderRef: undefined, @@ -94,6 +101,7 @@ class CrystoolsMonitor { name: this.menuPrefix + ' [monitor] RAM Used', type: 'boolean', label: 'RAM', + symbol: '%', defaultValue: true, htmlMonitorRef: undefined, htmlMonitorSliderRef: undefined, @@ -116,6 +124,7 @@ class CrystoolsMonitor { name: this.menuPrefix + ' [monitor] HDD Used', type: 'boolean', label: 'HDD', + symbol: '%', tooltip: 'See Partition to show (HDD)', defaultValue: true, htmlMonitorRef: undefined, @@ -177,6 +186,7 @@ class CrystoolsMonitor { gpus: [ { gpu_utilization: 0, + gpu_temperature: 0, vram_total: 0, vram_used: 0, vram_used_percent: 0, @@ -224,15 +234,18 @@ class CrystoolsMonitor { } let label = 'GPU'; let labelVRAM = 'VRAM'; + let labelTemperature = 'Temp'; if (moreThanOneGPU) { label = 'GPU ' + index; labelVRAM = 'VRAM' + index; + labelTemperature = 'Temp ' + index; } const monitorGPUNElement = { id: 'Crystools.switchGPU' + index, - name: this.menuPrefix + `[menu] Display GPU monitor\r\n[${index}] ${name}`, + name: this.menuPrefix + `[menu] Display GPU\r\n[${index}] ${name}`, type: 'boolean', label, + symbol: '%', title: `${index}: ${name}`, defaultValue: true, htmlMonitorRef: undefined, @@ -248,9 +261,10 @@ class CrystoolsMonitor { }; const monitorVRAMNElement = { id: 'Crystools.switchVRAM' + index, - name: this.menuPrefix + `[menu] Display GPU VRAM monitor\r\n[${index}] ${name}`, + name: this.menuPrefix + `[menu] Display GPU VRAM\r\n[${index}] ${name}`, type: 'boolean', label: labelVRAM, + symbol: '%', title: `${index}: ${name}`, defaultValue: true, htmlMonitorRef: undefined, @@ -264,10 +278,32 @@ class CrystoolsMonitor { }); }, }; + const monitorTemperatureNElement = { + id: 'Crystools.switchTemperature' + index, + name: this.menuPrefix + `[menu] Display GPU Temperature\r\n[${index}] ${name}`, + type: 'boolean', + label: labelTemperature, + symbol: '°', + title: `${index}: ${name}`, + defaultValue: true, + htmlMonitorRef: undefined, + htmlMonitorSliderRef: undefined, + htmlMonitorLabelRef: undefined, + cssColor: '#00ff00', + cssColorFinal: '#ff0000', + onChange: async (value) => { + this.updateWidget(monitorTemperatureNElement); + void await this.updateServerGPU(index, { + temperature: value + }); + }, + }; this.monitorGPUSettings[index] = monitorGPUNElement; this.monitorVRAMSettings[index] = monitorVRAMNElement; + this.monitorTemperatureSettings[index] = monitorTemperatureNElement; app.ui.settings.addSetting(this.monitorGPUSettings[index]); app.ui.settings.addSetting(this.monitorVRAMSettings[index]); + app.ui.settings.addSetting(this.monitorTemperatureSettings[index]); }); }); } @@ -349,6 +385,9 @@ class CrystoolsMonitor { this.monitorVRAMSettings.forEach((monitorSettings) => { monitorSettings && this.updateWidget(monitorSettings); }); + this.monitorTemperatureSettings.forEach((monitorSettings) => { + monitorSettings && this.updateWidget(monitorSettings); + }); } }); Object.defineProperty(this, "updateWidget", { @@ -396,6 +435,21 @@ class CrystoolsMonitor { else { } }); + this.monitorTemperatureSettings.forEach((monitorSettings, index) => { + if (data.gpus[index]) { + const gpu = data.gpus[index]; + if (gpu === undefined) { + return; + } + this.updateMonitor(monitorSettings, gpu.gpu_temperature); + if (monitorSettings.cssColorFinal && monitorSettings.htmlMonitorSliderRef) { + monitorSettings.htmlMonitorSliderRef.style.backgroundColor = + `color-mix(in srgb, ${monitorSettings.cssColorFinal} ${gpu.gpu_temperature}%, ${monitorSettings.cssColor})`; + } + } + else { + } + }); } }); Object.defineProperty(this, "updateMonitor", { @@ -406,8 +460,8 @@ class CrystoolsMonitor { if (!(monitorSettings.htmlMonitorSliderRef && monitorSettings.htmlMonitorLabelRef)) { return; } - monitorSettings.htmlMonitorLabelRef.innerHTML = `${Math.floor(percent)}%`; - monitorSettings.htmlMonitorSliderRef.style.width = monitorSettings.htmlMonitorLabelRef.innerHTML; + monitorSettings.htmlMonitorLabelRef.innerHTML = `${Math.floor(percent)}${monitorSettings.symbol}`; + monitorSettings.htmlMonitorSliderRef.style.width = `${Math.floor(percent)}%`; } }); Object.defineProperty(this, "updateAllAnimationDuration", { @@ -424,6 +478,9 @@ class CrystoolsMonitor { this.monitorVRAMSettings.forEach((monitorSettings) => { monitorSettings && this.updatedAnimationDuration(monitorSettings, value); }); + this.monitorTemperatureSettings.forEach((monitorSettings) => { + monitorSettings && this.updatedAnimationDuration(monitorSettings, value); + }); } }); Object.defineProperty(this, "updatedAnimationDuration", { @@ -473,7 +530,13 @@ class CrystoolsMonitor { htmlMonitorSlider.style.position = 'absolute'; htmlMonitorSlider.style.height = '100%'; htmlMonitorSlider.style.width = '0'; - htmlMonitorSlider.style.backgroundColor = monitorSettings.cssColor; + if (monitorSettings.cssColorFinal) { + htmlMonitorSlider.style.backgroundColor = + `color-mix(in srgb, ${monitorSettings.cssColorFinal} 0%, ${monitorSettings.cssColor})`; + } + else { + htmlMonitorSlider.style.backgroundColor = monitorSettings.cssColor; + } monitorSettings.htmlMonitorSliderRef = htmlMonitorSlider; htmlMonitorContent.append(htmlMonitorSlider); const htmlMonitorLabel = document.createElement('div'); @@ -522,11 +585,11 @@ class CrystoolsMonitor { ctoolsRoot.append(htmlContainer); htmlContainer.append(this.createMonitor(this.monitorCPUElement)); htmlContainer.append(this.createMonitor(this.monitorRAMElement)); - this.monitorGPUSettings.forEach((monitorSettings) => { - monitorSettings && htmlContainer.append(this.createMonitor(monitorSettings)); - }); - this.monitorVRAMSettings.forEach((monitorSettings) => { - monitorSettings && htmlContainer.append(this.createMonitor(monitorSettings)); + this.monitorGPUSettings.forEach((_monitorSettings, index) => { + this.monitorGPUSettings[index] && htmlContainer.append(this.createMonitor(this.monitorGPUSettings[index])); + this.monitorVRAMSettings[index] && htmlContainer.append(this.createMonitor(this.monitorVRAMSettings[index])); + this.monitorTemperatureSettings[index] && + htmlContainer.append(this.createMonitor(this.monitorTemperatureSettings[index])); }); htmlContainer.append(this.createMonitor(this.monitorHDDElement)); const currentRate = parseFloat(app.ui.settings.getSettingValue(this.idInputRate, this.defaultRate)); diff --git a/web/monitor.ts b/web/monitor.ts index e107ee7..09f70a2 100644 --- a/web/monitor.ts +++ b/web/monitor.ts @@ -14,6 +14,7 @@ class CrystoolsMonitor { defaultWhichHDD = '/'; monitorGPUSettings: TMonitorSettings[] = []; monitorVRAMSettings: TMonitorSettings[] = []; + monitorTemperatureSettings: TMonitorSettings[] = []; // CPU Variables monitorCPUElement: TMonitorSettings = { @@ -21,6 +22,7 @@ class CrystoolsMonitor { name: this.menuPrefix + ' [monitor] CPU Usage', type: 'boolean', label: 'CPU', + symbol: '%', defaultValue: true, htmlMonitorRef: undefined, htmlMonitorSliderRef: undefined, @@ -40,6 +42,7 @@ class CrystoolsMonitor { name: this.menuPrefix + ' [monitor] RAM Used', type: 'boolean', label: 'RAM', + symbol: '%', defaultValue: true, htmlMonitorRef: undefined, htmlMonitorSliderRef: undefined, @@ -59,6 +62,7 @@ class CrystoolsMonitor { name: this.menuPrefix + ' [monitor] HDD Used', type: 'boolean', label: 'HDD', + symbol: '%', tooltip: 'See Partition to show (HDD)', defaultValue: true, htmlMonitorRef: undefined, @@ -122,6 +126,7 @@ class CrystoolsMonitor { gpus: [ { gpu_utilization: 0, + gpu_temperature: 0, vram_total: 0, vram_used: 0, vram_used_percent: 0, @@ -179,17 +184,20 @@ class CrystoolsMonitor { let label = 'GPU'; let labelVRAM = 'VRAM'; + let labelTemperature = 'Temp'; if (moreThanOneGPU) { label = 'GPU '+index; labelVRAM = 'VRAM'+index; + labelTemperature = 'Temp '+index; } // GPU Utilization Variables const monitorGPUNElement: TMonitorSettings = { id: 'Crystools.switchGPU' + index, - name: this.menuPrefix + `[menu] Display GPU monitor\r\n[${index}] ${name}`, + name: this.menuPrefix + `[menu] Display GPU\r\n[${index}] ${name}`, type: 'boolean', label, + symbol: '%', title: `${index}: ${name}`, defaultValue: true, htmlMonitorRef: undefined, @@ -207,9 +215,10 @@ class CrystoolsMonitor { // GPU VRAM Variables const monitorVRAMNElement: TMonitorSettings = { id: 'Crystools.switchVRAM' + index, - name: this.menuPrefix + `[menu] Display GPU VRAM monitor\r\n[${index}] ${name}`, + name: this.menuPrefix + `[menu] Display GPU VRAM\r\n[${index}] ${name}`, type: 'boolean', label: labelVRAM, + symbol: '%', title: `${index}: ${name}`, defaultValue: true, htmlMonitorRef: undefined, @@ -224,12 +233,37 @@ class CrystoolsMonitor { }, }; + // GPU Temperature Variables + const monitorTemperatureNElement: TMonitorSettings = { + id: 'Crystools.switchTemperature' + index, + name: this.menuPrefix + `[menu] Display GPU Temperature\r\n[${index}] ${name}`, + type: 'boolean', + label: labelTemperature, + symbol: '°', + title: `${index}: ${name}`, + defaultValue: true, + htmlMonitorRef: undefined, + htmlMonitorSliderRef: undefined, + htmlMonitorLabelRef: undefined, + cssColor: '#00ff00', + cssColorFinal: '#ff0000', + onChange: async(value: boolean) => { + this.updateWidget(monitorTemperatureNElement); + void await this.updateServerGPU(index,{ + temperature: value + }); + }, + }; + this.monitorGPUSettings[index] = monitorGPUNElement; this.monitorVRAMSettings[index] = monitorVRAMNElement; + this.monitorTemperatureSettings[index] = monitorTemperatureNElement; // @ts-ignore app.ui.settings.addSetting(this.monitorGPUSettings[index]); // @ts-ignore app.ui.settings.addSetting(this.monitorVRAMSettings[index]); + // @ts-ignore + app.ui.settings.addSetting(this.monitorTemperatureSettings[index]); }); }); }; @@ -289,6 +323,9 @@ class CrystoolsMonitor { this.monitorVRAMSettings.forEach((monitorSettings) => { monitorSettings && this.updateWidget(monitorSettings); }); + this.monitorTemperatureSettings.forEach((monitorSettings) => { + monitorSettings && this.updateWidget(monitorSettings); + }); }; updateWidget = (monitorSettings: TMonitorSettings): void => { @@ -310,7 +347,6 @@ class CrystoolsMonitor { return; } - this.monitorGPUSettings.forEach((monitorSettings, index) => { if (data.gpus[index]) { const gpu = data.gpus[index]; @@ -338,6 +374,24 @@ class CrystoolsMonitor { // console.error('UpdateAllMonitors: no GPU VRAM data for index', index); } }); + + this.monitorTemperatureSettings.forEach((monitorSettings, index) => { + if (data.gpus[index]) { + const gpu = data.gpus[index]; + if (gpu === undefined) { + // console.error('UpdateAllMonitors: no GPU VRAM data for index', index); + return; + } + + this.updateMonitor(monitorSettings, gpu.gpu_temperature); + if(monitorSettings.cssColorFinal && monitorSettings.htmlMonitorSliderRef){ + monitorSettings.htmlMonitorSliderRef.style.backgroundColor = + `color-mix(in srgb, ${monitorSettings.cssColorFinal} ${gpu.gpu_temperature}%, ${monitorSettings.cssColor})`; + } + } else { + // console.error('UpdateAllMonitors: no GPU VRAM data for index', index); + } + }); }; updateMonitor = (monitorSettings: TMonitorSettings, percent: number): void => { @@ -345,8 +399,8 @@ class CrystoolsMonitor { return; } - monitorSettings.htmlMonitorLabelRef.innerHTML = `${Math.floor(percent)}%`; - monitorSettings.htmlMonitorSliderRef.style.width = monitorSettings.htmlMonitorLabelRef.innerHTML; + monitorSettings.htmlMonitorLabelRef.innerHTML = `${Math.floor(percent)}${monitorSettings.symbol}`; + monitorSettings.htmlMonitorSliderRef.style.width = `${Math.floor(percent)}%`; }; updateAllAnimationDuration = (value: number): void => { @@ -359,6 +413,9 @@ class CrystoolsMonitor { this.monitorVRAMSettings.forEach((monitorSettings) => { monitorSettings && this.updatedAnimationDuration(monitorSettings, value); }); + this.monitorTemperatureSettings.forEach((monitorSettings) => { + monitorSettings && this.updatedAnimationDuration(monitorSettings, value); + }); }; updatedAnimationDuration = (monitorSettings: TMonitorSettings, value: number): void => { @@ -395,18 +452,23 @@ class CrystoolsMonitor { htmlContainer.append(this.createMonitor(this.monitorRAMElement)); // gpu0 > gpu1 > vram0 > vram1 - this.monitorGPUSettings.forEach((monitorSettings) => { - monitorSettings && htmlContainer.append(this.createMonitor(monitorSettings)); - }); - this.monitorVRAMSettings.forEach((monitorSettings) => { - monitorSettings && htmlContainer.append(this.createMonitor(monitorSettings)); - }); + // this.monitorGPUSettings.forEach((monitorSettings) => { + // monitorSettings && htmlContainer.append(this.createMonitor(monitorSettings)); + // }); + // this.monitorVRAMSettings.forEach((monitorSettings) => { + // monitorSettings && htmlContainer.append(this.createMonitor(monitorSettings)); + // }); + // this.monitorTemperatureSettings.forEach((monitorSettings) => { + // monitorSettings && htmlContainer.append(this.createMonitor(monitorSettings)); + // }); // gpu0 > vram0 > gpu1 > vram1 - // this.monitorGPUSettings.forEach((_monitorSettings, index) => { - // this.monitorGPUSettings[index] && htmlContainer.append(this.createMonitor(this.monitorGPUSettings[index])); - // this.monitorVRAMSettings[index] && htmlContainer.append(this.createMonitor(this.monitorVRAMSettings[index])); - // }); + this.monitorGPUSettings.forEach((_monitorSettings, index) => { + this.monitorGPUSettings[index] && htmlContainer.append(this.createMonitor(this.monitorGPUSettings[index])); + this.monitorVRAMSettings[index] && htmlContainer.append(this.createMonitor(this.monitorVRAMSettings[index])); + this.monitorTemperatureSettings[index] && + htmlContainer.append(this.createMonitor(this.monitorTemperatureSettings[index])); + }); htmlContainer.append(this.createMonitor(this.monitorHDDElement)); @@ -452,7 +514,12 @@ class CrystoolsMonitor { htmlMonitorSlider.style.position = 'absolute'; htmlMonitorSlider.style.height = '100%'; htmlMonitorSlider.style.width = '0'; - htmlMonitorSlider.style.backgroundColor = monitorSettings.cssColor; + if(monitorSettings.cssColorFinal){ + htmlMonitorSlider.style.backgroundColor = + `color-mix(in srgb, ${monitorSettings.cssColorFinal} 0%, ${monitorSettings.cssColor})`; + } else { + htmlMonitorSlider.style.backgroundColor = monitorSettings.cssColor; + } monitorSettings.htmlMonitorSliderRef = htmlMonitorSlider; htmlMonitorContent.append(htmlMonitorSlider); diff --git a/web/monitor.types.d.ts b/web/monitor.types.d.ts index 2160da5..77d96cf 100644 --- a/web/monitor.types.d.ts +++ b/web/monitor.types.d.ts @@ -1,5 +1,6 @@ type TGpuStatData = { gpu_utilization: number, + gpu_temperature: number, vram_total: number, vram_used: number, vram_used_percent: number, @@ -8,6 +9,7 @@ type TGpuStatData = { type TGpuSettings = { utilization?: boolean, vram?: boolean, + temperature?: boolean, } type TGpuName = { @@ -41,6 +43,7 @@ type TMonitorSettings = { id: string, name: string, label: string, // on monitor + symbol: string, // on monitor title?: string, // on monitor tooltip?: string, // on settings type: 'boolean' | 'number' | 'string', @@ -50,4 +53,5 @@ type TMonitorSettings = { htmlMonitorSliderRef?: HTMLDivElement, htmlMonitorLabelRef?: HTMLDivElement, cssColor: string, + cssColorFinal?: string, }