mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-02-05 19:12:41 +08:00
mm: redefine free memory for Windows
As commented.
This commit is contained in:
parent
5bbd5597fd
commit
cf76b0447a
@ -585,9 +585,15 @@ WINDOWS = any(platform.win32_ver())
|
|||||||
|
|
||||||
EXTRA_RESERVED_VRAM = 400 * 1024 * 1024
|
EXTRA_RESERVED_VRAM = 400 * 1024 * 1024
|
||||||
if WINDOWS:
|
if WINDOWS:
|
||||||
|
import comfy.windows
|
||||||
EXTRA_RESERVED_VRAM = 600 * 1024 * 1024 #Windows is higher because of the shared vram issue
|
EXTRA_RESERVED_VRAM = 600 * 1024 * 1024 #Windows is higher because of the shared vram issue
|
||||||
if total_vram > (15 * 1024): # more extra reserved vram on 16GB+ cards
|
if total_vram > (15 * 1024): # more extra reserved vram on 16GB+ cards
|
||||||
EXTRA_RESERVED_VRAM += 100 * 1024 * 1024
|
EXTRA_RESERVED_VRAM += 100 * 1024 * 1024
|
||||||
|
def get_free_ram():
|
||||||
|
return comfy.windows.get_free_ram()
|
||||||
|
else:
|
||||||
|
def get_free_ram():
|
||||||
|
return psutil.virtual_memory().available
|
||||||
|
|
||||||
if args.reserve_vram is not None:
|
if args.reserve_vram is not None:
|
||||||
EXTRA_RESERVED_VRAM = args.reserve_vram * 1024 * 1024 * 1024
|
EXTRA_RESERVED_VRAM = args.reserve_vram * 1024 * 1024 * 1024
|
||||||
@ -618,7 +624,7 @@ def free_memory(memory_required, device, keep_loaded=[], for_dynamic=False, ram_
|
|||||||
ram_to_free = 1e32
|
ram_to_free = 1e32
|
||||||
if not DISABLE_SMART_MEMORY:
|
if not DISABLE_SMART_MEMORY:
|
||||||
memory_to_free = memory_required - get_free_memory(device)
|
memory_to_free = memory_required - get_free_memory(device)
|
||||||
ram_to_free = ram_required - psutil.virtual_memory().available
|
ram_to_free = ram_required - get_free_ram()
|
||||||
|
|
||||||
if current_loaded_models[i].model.is_dynamic() and for_dynamic:
|
if current_loaded_models[i].model.is_dynamic() and for_dynamic:
|
||||||
#don't actually unload dynamic models for the sake of other dynamic models
|
#don't actually unload dynamic models for the sake of other dynamic models
|
||||||
|
|||||||
52
comfy/windows.py
Normal file
52
comfy/windows.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import ctypes
|
||||||
|
import logging
|
||||||
|
import psutil
|
||||||
|
from ctypes import wintypes
|
||||||
|
|
||||||
|
import comfy_aimdo.control
|
||||||
|
|
||||||
|
psapi = ctypes.WinDLL("psapi")
|
||||||
|
kernel32 = ctypes.WinDLL("kernel32")
|
||||||
|
|
||||||
|
class PERFORMANCE_INFORMATION(ctypes.Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("cb", wintypes.DWORD),
|
||||||
|
("CommitTotal", ctypes.c_size_t),
|
||||||
|
("CommitLimit", ctypes.c_size_t),
|
||||||
|
("CommitPeak", ctypes.c_size_t),
|
||||||
|
("PhysicalTotal", ctypes.c_size_t),
|
||||||
|
("PhysicalAvailable", ctypes.c_size_t),
|
||||||
|
("SystemCache", ctypes.c_size_t),
|
||||||
|
("KernelTotal", ctypes.c_size_t),
|
||||||
|
("KernelPaged", ctypes.c_size_t),
|
||||||
|
("KernelNonpaged", ctypes.c_size_t),
|
||||||
|
("PageSize", ctypes.c_size_t),
|
||||||
|
("HandleCount", wintypes.DWORD),
|
||||||
|
("ProcessCount", wintypes.DWORD),
|
||||||
|
("ThreadCount", wintypes.DWORD),
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_free_ram():
|
||||||
|
#Windows is way too conservative and chalks recently used uncommitted model RAM
|
||||||
|
#as "in-use". So, calculate free RAM for the sake of general use as the greater of:
|
||||||
|
#
|
||||||
|
#1: What psutil says
|
||||||
|
#2: Total Memory - (Committed Memory - VRAM in use)
|
||||||
|
#
|
||||||
|
#We have to subtract VRAM in use from the comitted memory as WDDM creates a naked
|
||||||
|
#commit charge for all VRAM used just incase it wants to page it all out. This just
|
||||||
|
#isn't realistic so "overcommit" on our calculations by just subtracting it off.
|
||||||
|
|
||||||
|
pi = PERFORMANCE_INFORMATION()
|
||||||
|
pi.cb = ctypes.sizeof(pi)
|
||||||
|
|
||||||
|
if not psapi.GetPerformanceInfo(ctypes.byref(pi), pi.cb):
|
||||||
|
logging.warning("WARNING: Failed to query windows performance info. RAM usage may be sub optimal")
|
||||||
|
return psutil.virtual_memory().available
|
||||||
|
|
||||||
|
committed = pi.CommitTotal * pi.PageSize
|
||||||
|
total = pi.PhysicalTotal * pi.PageSize
|
||||||
|
|
||||||
|
return max(psutil.virtual_memory().available,
|
||||||
|
total - (committed - comfy_aimdo.control.get_total_vram_usage()))
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user