aboutsummaryrefslogtreecommitdiff
path: root/modules/memmon.py
diff options
context:
space:
mode:
authorJashoBell <JoshuaDB@gmail.com>2022-09-17 11:16:35 -0700
committerJashoBell <JoshuaDB@gmail.com>2022-09-17 11:16:35 -0700
commitd2c7ad2fec09d89d1348d6d40640259b5a02b8ad (patch)
tree90f4f6695f318aed33dea72cc340c0f5ff628ae8 /modules/memmon.py
parent5a797a5612924e50d5b60d2aa1eddfae4c3e157e (diff)
parent23a0ec04c005957091ab35c26c4c31485e75d146 (diff)
Merge branch 'master' of https://github.com/AUTOMATIC1111/stable-diffusion-webui into Base
Diffstat (limited to 'modules/memmon.py')
-rw-r--r--modules/memmon.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/modules/memmon.py b/modules/memmon.py
new file mode 100644
index 00000000..f2cac841
--- /dev/null
+++ b/modules/memmon.py
@@ -0,0 +1,77 @@
+import threading
+import time
+from collections import defaultdict
+
+import torch
+
+
+class MemUsageMonitor(threading.Thread):
+ run_flag = None
+ device = None
+ disabled = False
+ opts = None
+ data = None
+
+ def __init__(self, name, device, opts):
+ threading.Thread.__init__(self)
+ self.name = name
+ self.device = device
+ self.opts = opts
+
+ self.daemon = True
+ self.run_flag = threading.Event()
+ self.data = defaultdict(int)
+
+ def run(self):
+ if self.disabled:
+ return
+
+ while True:
+ self.run_flag.wait()
+
+ torch.cuda.reset_peak_memory_stats()
+ self.data.clear()
+
+ if self.opts.memmon_poll_rate <= 0:
+ self.run_flag.clear()
+ continue
+
+ self.data["min_free"] = torch.cuda.mem_get_info()[0]
+
+ while self.run_flag.is_set():
+ free, total = torch.cuda.mem_get_info() # calling with self.device errors, torch bug?
+ self.data["min_free"] = min(self.data["min_free"], free)
+
+ time.sleep(1 / self.opts.memmon_poll_rate)
+
+ def dump_debug(self):
+ print(self, 'recorded data:')
+ for k, v in self.read().items():
+ print(k, -(v // -(1024 ** 2)))
+
+ print(self, 'raw torch memory stats:')
+ tm = torch.cuda.memory_stats(self.device)
+ for k, v in tm.items():
+ if 'bytes' not in k:
+ continue
+ print('\t' if 'peak' in k else '', k, -(v // -(1024 ** 2)))
+
+ print(torch.cuda.memory_summary())
+
+ def monitor(self):
+ self.run_flag.set()
+
+ def read(self):
+ free, total = torch.cuda.mem_get_info()
+ self.data["total"] = total
+
+ torch_stats = torch.cuda.memory_stats(self.device)
+ self.data["active_peak"] = torch_stats["active_bytes.all.peak"]
+ self.data["reserved_peak"] = torch_stats["reserved_bytes.all.peak"]
+ self.data["system_peak"] = total - self.data["min_free"]
+
+ return self.data
+
+ def stop(self):
+ self.run_flag.clear()
+ return self.read()