From 447b25c7745e3136893cdf2ab62eab8f4460a9de Mon Sep 17 00:00:00 2001 From: aszc-dev Date: Mon, 30 Oct 2023 11:49:07 +0100 Subject: [PATCH] Add model adapter for unstable compatibility --- README.md | 17 ++++++++++++++ __init__.py | 4 +++- assets/adapter.png | Bin 0 -> 35067 bytes coreml_suite/nodes.py | 53 ++++++++++++++++++++++++++++++------------ 4 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 assets/adapter.png diff --git a/README.md b/README.md index 39da520..b530bd9 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,23 @@ resulting latent as you normally would in your workflow. - **LATENT**: The latent image output by the Core ML model. This can be decoded using a VAE Decoder or used as input to the next node in your workflow. +#### Core ML Adapter (Experimental) (`CoreMLModelAdapter`) + +![CoreMLModelAdapter](./assets/adapter.png?raw=true) + +This node allows you to use a Core ML as a standard ComfyUI model. This is an experimental node and may not work with +all models and nodes. Please use with caution and pay attention to the expected inputs of the model. + +- **Input**: + - **coreml_model**: The Core ML model to use as a ComfyUI model. +- **Output**: + - **MODEL**: The Core ML model wrapped in a ComfyUI model. + +> [!NOTE] +> While this approach allows you to use Core ML models with many ComfyUI nodes (both standard and custom), the +> expected inputs of the model will not be checked, which may cause errors. Please make sure to use a model compatible +> with the expected parameters. + ### Example Workflows > [!NOTE] diff --git a/__init__.py b/__init__.py index b259a08..8a0d5c9 100644 --- a/__init__.py +++ b/__init__.py @@ -3,13 +3,15 @@ import sys sys.path.append(os.path.dirname(__file__)) -from coreml_suite.nodes import CoreMLLoaderUNet, CoreMLSampler +from coreml_suite.nodes import CoreMLLoaderUNet, CoreMLSampler, CoreMLModelAdapter NODE_CLASS_MAPPINGS = { "CoreMLUNetLoader": CoreMLLoaderUNet, "CoreMLSampler": CoreMLSampler, + "CoreMLModelAdapter": CoreMLModelAdapter, } NODE_DISPLAY_NAME_MAPPINGS = { "CoreMLUNetLoader": "Load Core ML UNet", "CoreMLSampler": "Core ML Sampler", + "CoreMLModelAdapter": "Core ML Adapter (Experimental)", } diff --git a/assets/adapter.png b/assets/adapter.png new file mode 100644 index 0000000000000000000000000000000000000000..df21d92786c50ffc6b7e4ba24facd1a775edc57d GIT binary patch literal 35067 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 z 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 literal 0 HcmV?d00001 diff --git a/coreml_suite/nodes.py b/coreml_suite/nodes.py index 7246a6f..d1e58bb 100644 --- a/coreml_suite/nodes.py +++ b/coreml_suite/nodes.py @@ -28,24 +28,24 @@ class CoreMLSampler(KSampler): CATEGORY = "Core ML Suite" def sample( - self, - coreml_model, - seed, - steps, - cfg, - sampler_name, - scheduler, - positive, - negative, - latent_image=None, - denoise=1.0, + self, + coreml_model, + seed, + steps, + cfg, + sampler_name, + scheduler, + positive, + negative, + latent_image=None, + denoise=1.0, ): sample_shape = coreml_model.expected_inputs["sample"]["shape"] latent_image = reshape_latent_image(latent_image, sample_shape) latent_image["samples"] = latent_image["samples"][0:1] model_config = get_model_config() - wrapped_model = CoreMLModelWrapper(model_config, coreml_model) + wrapped_model = CoreMLModelAdapter(model_config, coreml_model) model = ModelPatcher(wrapped_model, get_torch_device(), None) return super().sample( @@ -99,9 +99,6 @@ class CoreMLLoader: sources = "compiled" if coreml_name.endswith(".mlmodelc") else "packages" - return self._load(coreml_path, compute_unit, sources) - - def _load(self, coreml_path, compute_unit, sources): return (CoreMLModel(coreml_path, compute_unit, sources),) @@ -109,3 +106,29 @@ class CoreMLLoaderUNet(CoreMLLoader): PACKAGE_DIRNAME = "unet" RETURN_TYPES = ("COREML_UNET",) RETURN_NAMES = ("coreml_model",) + + +class CoreMLModelAdapter: + """ + Adapter Node to use CoreML models as Comfy models. This is an experimental + feature and may not work as expected. + """ + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "coreml_model": ("COREML_UNET",), + } + } + + RETURN_TYPES = ("MODEL",) + + FUNCTION = "wrap" + CATEGORY = "Core ML Suite" + + def wrap(self, coreml_model): + model_config = get_model_config() + wrapped_model = CoreMLModelWrapper(model_config, coreml_model) + patched_model = ModelPatcher(wrapped_model, get_torch_device(), None) + return (patched_model,)