mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-02 13:41:03 +01:00
155 lines
4.7 KiB
Python
155 lines
4.7 KiB
Python
# pylint: disable=import-outside-toplevel,logging-fstring-interpolation,protected-access
|
|
# Isolation utilities and serializers for ModelPatcherProxy
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
import os
|
|
from typing import Any
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def maybe_wrap_model_for_isolation(model_patcher: Any) -> Any:
|
|
from comfy.isolation.model_patcher_proxy_registry import ModelPatcherRegistry
|
|
from comfy.isolation.model_patcher_proxy import ModelPatcherProxy
|
|
|
|
isolation_active = os.environ.get("PYISOLATE_ISOLATION_ACTIVE") == "1"
|
|
is_child = os.environ.get("PYISOLATE_CHILD") == "1"
|
|
|
|
if not isolation_active:
|
|
return model_patcher
|
|
if is_child:
|
|
return model_patcher
|
|
if isinstance(model_patcher, ModelPatcherProxy):
|
|
return model_patcher
|
|
|
|
registry = ModelPatcherRegistry()
|
|
model_id = registry.register(model_patcher)
|
|
logger.debug(f"Isolated ModelPatcher: {model_id}")
|
|
return ModelPatcherProxy(model_id, registry, manage_lifecycle=True)
|
|
|
|
|
|
def register_hooks_serializers(registry=None):
|
|
from pyisolate._internal.serialization_registry import SerializerRegistry
|
|
import comfy.hooks
|
|
|
|
if registry is None:
|
|
registry = SerializerRegistry.get_instance()
|
|
|
|
def serialize_enum(obj):
|
|
return {"__enum__": f"{type(obj).__name__}.{obj.name}"}
|
|
|
|
def deserialize_enum(data):
|
|
cls_name, val_name = data["__enum__"].split(".")
|
|
cls = getattr(comfy.hooks, cls_name)
|
|
return cls[val_name]
|
|
|
|
registry.register("EnumHookType", serialize_enum, deserialize_enum)
|
|
registry.register("EnumHookScope", serialize_enum, deserialize_enum)
|
|
registry.register("EnumHookMode", serialize_enum, deserialize_enum)
|
|
registry.register("EnumWeightTarget", serialize_enum, deserialize_enum)
|
|
|
|
def serialize_hook_group(obj):
|
|
return {"__type__": "HookGroup", "hooks": obj.hooks}
|
|
|
|
def deserialize_hook_group(data):
|
|
hg = comfy.hooks.HookGroup()
|
|
for h in data["hooks"]:
|
|
hg.add(h)
|
|
return hg
|
|
|
|
registry.register("HookGroup", serialize_hook_group, deserialize_hook_group)
|
|
|
|
def serialize_dict_state(obj):
|
|
d = obj.__dict__.copy()
|
|
d["__type__"] = type(obj).__name__
|
|
if "custom_should_register" in d:
|
|
del d["custom_should_register"]
|
|
return d
|
|
|
|
def deserialize_dict_state_generic(cls):
|
|
def _deserialize(data):
|
|
h = cls()
|
|
h.__dict__.update(data)
|
|
return h
|
|
|
|
return _deserialize
|
|
|
|
def deserialize_hook_keyframe(data):
|
|
h = comfy.hooks.HookKeyframe(strength=data.get("strength", 1.0))
|
|
h.__dict__.update(data)
|
|
return h
|
|
|
|
registry.register("HookKeyframe", serialize_dict_state, deserialize_hook_keyframe)
|
|
|
|
def deserialize_hook_keyframe_group(data):
|
|
h = comfy.hooks.HookKeyframeGroup()
|
|
h.__dict__.update(data)
|
|
return h
|
|
|
|
registry.register(
|
|
"HookKeyframeGroup", serialize_dict_state, deserialize_hook_keyframe_group
|
|
)
|
|
|
|
def deserialize_hook(data):
|
|
h = comfy.hooks.Hook()
|
|
h.__dict__.update(data)
|
|
return h
|
|
|
|
registry.register("Hook", serialize_dict_state, deserialize_hook)
|
|
|
|
def deserialize_weight_hook(data):
|
|
h = comfy.hooks.WeightHook()
|
|
h.__dict__.update(data)
|
|
return h
|
|
|
|
registry.register("WeightHook", serialize_dict_state, deserialize_weight_hook)
|
|
|
|
def serialize_set(obj):
|
|
return {"__set__": list(obj)}
|
|
|
|
def deserialize_set(data):
|
|
return set(data["__set__"])
|
|
|
|
registry.register("set", serialize_set, deserialize_set)
|
|
|
|
try:
|
|
from comfy.weight_adapter.lora import LoRAAdapter
|
|
|
|
def serialize_lora(obj):
|
|
return {"weights": {}, "loaded_keys": list(obj.loaded_keys)}
|
|
|
|
def deserialize_lora(data):
|
|
return LoRAAdapter(set(data["loaded_keys"]), data["weights"])
|
|
|
|
registry.register("LoRAAdapter", serialize_lora, deserialize_lora)
|
|
except Exception:
|
|
pass
|
|
|
|
try:
|
|
from comfy.hooks import _HookRef
|
|
import uuid
|
|
|
|
def serialize_hook_ref(obj):
|
|
return {
|
|
"__hook_ref__": True,
|
|
"id": getattr(obj, "_pyisolate_id", str(uuid.uuid4())),
|
|
}
|
|
|
|
def deserialize_hook_ref(data):
|
|
h = _HookRef()
|
|
h._pyisolate_id = data.get("id", str(uuid.uuid4()))
|
|
return h
|
|
|
|
registry.register("_HookRef", serialize_hook_ref, deserialize_hook_ref)
|
|
except ImportError:
|
|
pass
|
|
except Exception as e:
|
|
logger.warning(f"Failed to register _HookRef: {e}")
|
|
|
|
|
|
try:
|
|
register_hooks_serializers()
|
|
except Exception as e:
|
|
logger.error(f"Failed to initialize hook serializers: {e}")
|