Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions invokeai/backend/model_management/model_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,25 @@ def _make_cache_room(self, model_size):

refs = sys.getrefcount(cache_entry.model)

# manualy clear local variable references of just finished function calls
# for some reason python don't want to collect it even by gc.collect() immidiately
if refs > 2:
while True:
cleared = False
for referrer in gc.get_referrers(cache_entry.model):
if type(referrer).__name__ == "frame":
# RuntimeError: cannot clear an executing frame
with suppress(RuntimeError):
referrer.clear()
cleared = True
#break

# repeat if referrers changes(due to frame clear), else exit loop
if cleared:
gc.collect()
else:
break

device = cache_entry.model.device if hasattr(cache_entry.model, "device") else None
self.logger.debug(f"Model: {model_key}, locks: {cache_entry._locks}, device: {device}, loaded: {cache_entry.loaded}, refs: {refs}")

Expand Down Expand Up @@ -363,6 +382,9 @@ def _offload_unlocked_models(self, size_needed: int=0):
self.logger.debug(f'GPU VRAM freed: {(mem.vram_used/GIG):.2f} GB')
vram_in_use += mem.vram_used # note vram_used is negative
self.logger.debug(f'{(vram_in_use/GIG):.2f}GB VRAM used for models; max allowed={(reserved/GIG):.2f}GB')

gc.collect()
torch.cuda.empty_cache()

def _local_model_hash(self, model_path: Union[str, Path]) -> str:
sha = hashlib.sha256()
Expand Down