From c695c4af7f78b5b8a37251b720ec48615ed28106 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" <4000772+mcmonkey4eva@users.noreply.github.com> Date: Wed, 16 Oct 2024 00:35:37 -0700 Subject: [PATCH 1/4] Frontend Manager: avoid redundant gh calls for static versions (#5152) * Frontend Manager: avoid redundant gh calls for static versions * actually, removing old tmpdir isn't needed I tested - downloader code handles this case well already (also rmdir was wrong func anyway, needed shutil.rmtree if it had content) * add code comment --- app/frontend_management.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/app/frontend_management.py b/app/frontend_management.py index 9c832e46d..191408aca 100644 --- a/app/frontend_management.py +++ b/app/frontend_management.py @@ -151,6 +151,15 @@ class FrontendManager: return cls.DEFAULT_FRONTEND_PATH repo_owner, repo_name, version = cls.parse_version_string(version_string) + + if version.startswith("v"): + expected_path = str(Path(cls.CUSTOM_FRONTENDS_ROOT) / f"{repo_owner}_{repo_name}" / version.lstrip("v")) + if os.path.exists(expected_path): + logging.info(f"Using existing copy of specific frontend version tag: {repo_owner}/{repo_name}@{version}") + return expected_path + + logging.info(f"Initializing frontend: {repo_owner}/{repo_name}@{version}, requesting version details from GitHub...") + provider = provider or FrontEndProvider(repo_owner, repo_name) release = provider.get_release(version) @@ -159,16 +168,20 @@ class FrontendManager: Path(cls.CUSTOM_FRONTENDS_ROOT) / provider.folder_name / semantic_version ) if not os.path.exists(web_root): + # Use tmp path until complete to avoid path exists check passing from interrupted downloads + tmp_path = web_root + ".tmp" try: - os.makedirs(web_root, exist_ok=True) + os.makedirs(tmp_path, exist_ok=True) logging.info( "Downloading frontend(%s) version(%s) to (%s)", provider.folder_name, semantic_version, - web_root, + tmp_path, ) logging.debug(release) - download_release_asset_zip(release, destination_path=web_root) + download_release_asset_zip(release, destination_path=tmp_path) + if os.listdir(tmp_path): + os.rename(tmp_path, web_root) finally: # Clean up the directory if it is empty, i.e. the download failed if not os.listdir(web_root): From f71cfd2687e9af758e0da3f477d3ef07506d429c Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 16 Oct 2024 05:25:31 -0400 Subject: [PATCH 2/4] Add an experimental node to sharpen latents. Can be used with LatentApplyOperationCFG for interesting results. --- comfy_extras/nodes_latent.py | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/comfy_extras/nodes_latent.py b/comfy_extras/nodes_latent.py index 1c271b827..952db753a 100644 --- a/comfy_extras/nodes_latent.py +++ b/comfy_extras/nodes_latent.py @@ -221,6 +221,55 @@ class LatentOperationTonemapReinhard: return normalized_latent * new_magnitude return (tonemap_reinhard,) +class LatentOperationSharpen: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "sharpen_radius": ("INT", { + "default": 9, + "min": 1, + "max": 31, + "step": 1 + }), + "sigma": ("FLOAT", { + "default": 1.0, + "min": 0.1, + "max": 10.0, + "step": 0.1 + }), + "alpha": ("FLOAT", { + "default": 0.1, + "min": 0.0, + "max": 5.0, + "step": 0.01 + }), + }} + + RETURN_TYPES = ("LATENT_OPERATION",) + FUNCTION = "op" + + CATEGORY = "latent/advanced/operations" + EXPERIMENTAL = True + + def op(self, sharpen_radius, sigma, alpha): + def sharpen(latent, **kwargs): + luminance = (torch.linalg.vector_norm(latent, dim=(1)) + 1e-6)[:,None] + normalized_latent = latent / luminance + channels = latent.shape[1] + + kernel_size = sharpen_radius * 2 + 1 + kernel = comfy_extras.nodes_post_processing.gaussian_kernel(kernel_size, sigma, device=luminance.device) + center = kernel_size // 2 + + kernel *= alpha * -10 + kernel[center, center] = kernel[center, center] - kernel.sum() + 1.0 + + padded_image = torch.nn.functional.pad(normalized_latent, (sharpen_radius,sharpen_radius,sharpen_radius,sharpen_radius), 'reflect') + sharpened = torch.nn.functional.conv2d(padded_image, kernel.repeat(channels, 1, 1).unsqueeze(1), padding=kernel_size // 2, groups=channels)[:,:,sharpen_radius:-sharpen_radius, sharpen_radius:-sharpen_radius] + + return luminance * sharpened + return (sharpen,) + NODE_CLASS_MAPPINGS = { "LatentAdd": LatentAdd, "LatentSubtract": LatentSubtract, @@ -231,4 +280,5 @@ NODE_CLASS_MAPPINGS = { "LatentApplyOperation": LatentApplyOperation, "LatentApplyOperationCFG": LatentApplyOperationCFG, "LatentOperationTonemapReinhard": LatentOperationTonemapReinhard, + "LatentOperationSharpen": LatentOperationSharpen, } From 0bedfb26af436ce2150779cd03dfd69501a0cc74 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 16 Oct 2024 12:36:19 -0400 Subject: [PATCH 3/4] Revert "Fix Transformers FutureWarning (#5140)" This reverts commit 95b7cf9bbe0d1c0de34c630cf5209840b273d37c. --- comfy/sd1_clip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comfy/sd1_clip.py b/comfy/sd1_clip.py index 6f574900f..bb240526f 100644 --- a/comfy/sd1_clip.py +++ b/comfy/sd1_clip.py @@ -405,7 +405,7 @@ class SDTokenizer: def __init__(self, tokenizer_path=None, max_length=77, pad_with_end=True, embedding_directory=None, embedding_size=768, embedding_key='clip_l', tokenizer_class=CLIPTokenizer, has_start_token=True, pad_to_max_length=True, min_length=None, pad_token=None, tokenizer_data={}): if tokenizer_path is None: tokenizer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sd1_tokenizer") - self.tokenizer = tokenizer_class.from_pretrained(tokenizer_path, clean_up_tokenization_spaces=True) # Fix Transformers FutureWarning by explicitly setting clean_up_tokenization_spaces to True + self.tokenizer = tokenizer_class.from_pretrained(tokenizer_path) self.max_length = max_length self.min_length = min_length From 7390ff3b1ec2e15017ba4a52d6eaabc4aa4636e3 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 16 Oct 2024 14:58:30 -0400 Subject: [PATCH 4/4] Add missing import. --- comfy_extras/nodes_latent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/comfy_extras/nodes_latent.py b/comfy_extras/nodes_latent.py index 952db753a..af2736818 100644 --- a/comfy_extras/nodes_latent.py +++ b/comfy_extras/nodes_latent.py @@ -1,4 +1,5 @@ import comfy.utils +import comfy_extras.nodes_post_processing import torch def reshape_latent_to(target_shape, latent):