From 83be01cebcdbcf26a7d08d368ae4503c1f017d58 Mon Sep 17 00:00:00 2001 From: traugdor Date: Wed, 30 Oct 2024 09:07:10 -0500 Subject: [PATCH 1/4] Update nodes.py patched VAEDecode if fails due to lack of VRAM fallback to tiled decode method --- nodes.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/nodes.py b/nodes.py index c81a0af1e71..d56d26383a0 100644 --- a/nodes.py +++ b/nodes.py @@ -280,11 +280,14 @@ def INPUT_TYPES(s): CATEGORY = "latent" DESCRIPTION = "Decodes latent images back into pixel space images." - def decode(self, vae, samples): - images = vae.decode(samples["samples"]) - if len(images.shape) == 5: #Combine batches - images = images.reshape(-1, images.shape[-3], images.shape[-2], images.shape[-1]) - return (images, ) + def decode(self, vae, samples, tile_size=512): + try: + images = vae.decode(samples["samples"]) + if len(images.shape) == 5: #Combine batches + images = images.reshape(-1, images.shape[-3], images.shape[-2], images.shape[-1]) + return (images, ) + except (MemoryError, RuntimeError) as e: + return (vae.decode_tiled(samples["samples"], tile_x=tile_size // 8, tile_y=tile_size // 8, ), ) class VAEDecodeTiled: @classmethod From af0825f021d7f16e21f5366a22d739e85fe0c746 Mon Sep 17 00:00:00 2001 From: traugdor Date: Fri, 1 Nov 2024 16:16:34 -0500 Subject: [PATCH 2/4] Update nodes.py revert change to VAEDecode node. --- nodes.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/nodes.py b/nodes.py index d56d26383a0..8fe7bf3e7c9 100644 --- a/nodes.py +++ b/nodes.py @@ -281,13 +281,10 @@ def INPUT_TYPES(s): DESCRIPTION = "Decodes latent images back into pixel space images." def decode(self, vae, samples, tile_size=512): - try: - images = vae.decode(samples["samples"]) - if len(images.shape) == 5: #Combine batches - images = images.reshape(-1, images.shape[-3], images.shape[-2], images.shape[-1]) - return (images, ) - except (MemoryError, RuntimeError) as e: - return (vae.decode_tiled(samples["samples"], tile_x=tile_size // 8, tile_y=tile_size // 8, ), ) + images = vae.decode(samples["samples"]) + if len(images.shape) == 5: #Combine batches + images = images.reshape(-1, images.shape[-3], images.shape[-2], images.shape[-1]) + return (images, ) class VAEDecodeTiled: @classmethod From 519e7760e71b135de4e78c14490481173db94539 Mon Sep 17 00:00:00 2001 From: traugdor Date: Fri, 1 Nov 2024 16:18:32 -0500 Subject: [PATCH 3/4] Update sd.py Move catching of RuntimeError and MemoryError to sd.py --- comfy/sd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comfy/sd.py b/comfy/sd.py index e9a3579c98b..f68858a8ec9 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -341,7 +341,7 @@ def decode(self, samples_in): if pixel_samples is None: pixel_samples = torch.empty((samples_in.shape[0],) + tuple(out.shape[1:]), device=self.output_device) pixel_samples[x:x+batch_number] = out - except model_management.OOM_EXCEPTION as e: + except (model_management.OOM_EXCEPTION, RuntimeError, MemoryError) as e: logging.warning("Warning: Ran out of memory when regular VAE decoding, retrying with tiled VAE decoding.") dims = samples_in.ndim - 2 if dims == 1: From 9cfd46b2d9a21c54ebbf88fbd435ec1cd3881315 Mon Sep 17 00:00:00 2001 From: traugdor Date: Fri, 1 Nov 2024 16:19:30 -0500 Subject: [PATCH 4/4] Update nodes.py Remove unnecessary parameter to decode method --- nodes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes.py b/nodes.py index 8fe7bf3e7c9..c81a0af1e71 100644 --- a/nodes.py +++ b/nodes.py @@ -280,7 +280,7 @@ def INPUT_TYPES(s): CATEGORY = "latent" DESCRIPTION = "Decodes latent images back into pixel space images." - def decode(self, vae, samples, tile_size=512): + def decode(self, vae, samples): images = vae.decode(samples["samples"]) if len(images.shape) == 5: #Combine batches images = images.reshape(-1, images.shape[-3], images.shape[-2], images.shape[-1])