mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-04-12 11:32:37 +08:00
Fix device mismatch: update LoadedModel.device when _switch_parent swaps to parent patcher
When a multigpu clone ModelPatcher is garbage collected, LoadedModel._switch_parent switches the weakref to point at the parent (main) ModelPatcher. However, it was not updating LoadedModel.device, leaving it with the old clone's device (e.g., cuda:1). On subsequent runs, this stale device was passed to ModelPatcherDynamic.load(), causing an assertion failure (device_to != self.load_device). Amp-Thread-ID: https://ampcode.com/threads/T-019d3f5c-28c5-72c9-abed-34681f1b54ba Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
parent
20803749c3
commit
b418fb1582
@ -577,6 +577,7 @@ class LoadedModel:
|
|||||||
model = self._parent_model()
|
model = self._parent_model()
|
||||||
if model is not None:
|
if model is not None:
|
||||||
self._set_model(model)
|
self._set_model(model)
|
||||||
|
self.device = model.load_device
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def model(self):
|
def model(self):
|
||||||
@ -639,8 +640,6 @@ class LoadedModel:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def model_use_more_vram(self, extra_memory, force_patch_weights=False):
|
def model_use_more_vram(self, extra_memory, force_patch_weights=False):
|
||||||
if self.device != self.model.load_device:
|
|
||||||
logging.error(f"LoadedModel device mismatch: self.device={self.device}, model.load_device={self.model.load_device}, model_class={self.model.model.__class__.__name__}, is_multigpu={getattr(self.model, 'is_multigpu_base_clone', False)}, id(model)={id(self.model)}")
|
|
||||||
return self.model.partially_load(self.device, extra_memory, force_patch_weights=force_patch_weights)
|
return self.model.partially_load(self.device, extra_memory, force_patch_weights=force_patch_weights)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
@ -780,19 +779,16 @@ def load_models_gpu(models, memory_required=0, force_patch_weights=False, minimu
|
|||||||
if loaded_model_index is not None:
|
if loaded_model_index is not None:
|
||||||
loaded = current_loaded_models[loaded_model_index]
|
loaded = current_loaded_models[loaded_model_index]
|
||||||
loaded.currently_used = True
|
loaded.currently_used = True
|
||||||
logging.info(f"[MULTIGPU_DBG] Reusing LoadedModel for {x.model.__class__.__name__}: LoadedModel.device={loaded.device}, model.load_device={loaded.model.load_device}, is_multigpu={getattr(loaded.model, 'is_multigpu_base_clone', False)}, id(patcher)={id(loaded.model)}, id(inner)={id(loaded.model.model)}")
|
|
||||||
models_to_load.append(loaded)
|
models_to_load.append(loaded)
|
||||||
else:
|
else:
|
||||||
if hasattr(x, "model"):
|
if hasattr(x, "model"):
|
||||||
logging.info(f"Requested to load {x.model.__class__.__name__}")
|
logging.info(f"Requested to load {x.model.__class__.__name__}")
|
||||||
logging.info(f"[MULTIGPU_DBG] New LoadedModel for {x.model.__class__.__name__}: LoadedModel.device={loaded_model.device}, model.load_device={x.load_device}, is_multigpu={getattr(x, 'is_multigpu_base_clone', False)}, id(patcher)={id(x)}, id(inner)={id(x.model)}")
|
|
||||||
models_to_load.append(loaded_model)
|
models_to_load.append(loaded_model)
|
||||||
|
|
||||||
for loaded_model in models_to_load:
|
for loaded_model in models_to_load:
|
||||||
to_unload = []
|
to_unload = []
|
||||||
for i in range(len(current_loaded_models)):
|
for i in range(len(current_loaded_models)):
|
||||||
if loaded_model.model.is_clone(current_loaded_models[i].model):
|
if loaded_model.model.is_clone(current_loaded_models[i].model):
|
||||||
logging.info(f"[MULTIGPU_DBG] is_clone match: unloading idx={i}, LoadedModel.device={current_loaded_models[i].device}, model.load_device={current_loaded_models[i].model.load_device}, id(inner)={id(current_loaded_models[i].model.model)}")
|
|
||||||
to_unload = [i] + to_unload
|
to_unload = [i] + to_unload
|
||||||
for i in to_unload:
|
for i in to_unload:
|
||||||
model_to_unload = current_loaded_models.pop(i)
|
model_to_unload = current_loaded_models.pop(i)
|
||||||
|
|||||||
@ -1646,8 +1646,6 @@ class ModelPatcherDynamic(ModelPatcher):
|
|||||||
#now.
|
#now.
|
||||||
assert not full_load
|
assert not full_load
|
||||||
|
|
||||||
if device_to != self.load_device:
|
|
||||||
logging.error(f"ModelPatcherDynamic.load device mismatch: device_to={device_to}, self.load_device={self.load_device}, model_class={self.model.__class__.__name__}, is_multigpu_base_clone={getattr(self, 'is_multigpu_base_clone', False)}, id(self)={id(self)}")
|
|
||||||
assert device_to == self.load_device
|
assert device_to == self.load_device
|
||||||
|
|
||||||
num_patches = 0
|
num_patches = 0
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user