From 98b322956da0395172743d8551d04b0600903868 Mon Sep 17 00:00:00 2001 From: justumen Date: Tue, 10 Sep 2024 14:55:35 +0200 Subject: [PATCH] 0.21 --- README.md | 12 ++++-- __init__.py | 3 ++ pyproject.toml | 2 +- save_bjornulf_lobechat.py | 65 +++++++++++++++++++++++++++---- screenshots/write_in_console.png | Bin 0 -> 19242 bytes write_text_console.py | 21 ++++++++++ 6 files changed, 90 insertions(+), 13 deletions(-) create mode 100644 screenshots/write_in_console.png create mode 100644 write_text_console.py diff --git a/README.md b/README.md index 698e992..976d8b3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 🔗 Comfyui : Bjornulf_custom_nodes v0.19 🔗 +# 🔗 Comfyui : Bjornulf_custom_nodes v0.21 🔗 # Dependencies @@ -29,16 +29,19 @@ - **v0.17**: New loop node, combine by lines. - **v0.18**: New loop node, Free VRAM hack - **v0.19**: Changes for save to folder node : ignore missing images filenames, will use the highest number found + 1. +- **v0.20**: Changes for lobechat save image : include the code of free VRAM hack + ignore missing images filenames +- **v0.21**: Add a write text node that also display the text in the comfyui console (good for debugging) # 📝 Nodes descriptions ## 1/2 - 👁 + ✒ Show/Write Text ![Show Text](screenshots/write+show_text.png) +![Show Text](screenshots/write_in_console.png) **Description:** -Two simple nodes to write and show text. +Three simple nodes to write and show text. Write node is a textarea where you can write your text. -The show text node will only display the text. (That's why I made it a different color : green, uneditable, display only.) +The show text node will only display the text. (That's why I made it a different color : green, uneditable, display only.) ## 3 - 🔗 Combine Texts ![Combine Texts](screenshots/combine_texts.png) @@ -286,4 +289,5 @@ For me, on launch ComfyUI is using 180MB of VRAM, after my clean up VRAM node it I don't think there is a clean way to do that, so I'm using a hacky way. So, not perfect but better than being stuck at 6GB of VRAM used if I know I won't be using it again... Just connect this node with your workflow, it takes an image as input and return the same image without any changes. -❗ Comfyui is using cache to run faster (like not reloading checkpoints), so only use this free VRAM node when you need it. \ No newline at end of file +❗ Comfyui is using cache to run faster (like not reloading checkpoints), so only use this free VRAM node when you need it. +❗ For this node to work properly, you need to enable the dev/api mode in ComfyUI. (You can do that in the settings) \ No newline at end of file diff --git a/__init__.py b/__init__.py index 1ef840a..a67643e 100644 --- a/__init__.py +++ b/__init__.py @@ -1,5 +1,6 @@ from .images_to_video import imagesToVideo from .write_text import WriteText +from .write_text_console import WriteTextInConsole from .write_image_environment import WriteImageEnvironment from .write_image_characters import WriteImageCharacters from .write_image_character import WriteImageCharacter @@ -61,6 +62,7 @@ NODE_CLASS_MAPPINGS = { # "Bjornulf_ClearVRAM": ClearVRAM, "Bjornulf_SaveBjornulfLobeChat": SaveBjornulfLobeChat, "Bjornulf_WriteText": WriteText, + "Bjornulf_WriteTextInConsole": WriteTextInConsole, "Bjornulf_RemoveTransparency": RemoveTransparency, "Bjornulf_GrayscaleTransform": GrayscaleTransform, "Bjornulf_CombineBackgroundOverlay": CombineBackgroundOverlay, @@ -121,6 +123,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { "Bjornulf_SaveText": "💾 Save Text", #Make SaveCharacter, SaveLocation, SaveCamera, SaveAction, SaveClothes, SaveEmotion... "Bjornulf_LoadText": "📥 Load Text", #Make LoadCharacter, LoadLocation, LoadCamera, LoadAction, LoadClothes, LoadEmotion... "Bjornulf_WriteText": "✒ Write Text", + "Bjornulf_WriteTextInConsole": "✒🗔 Write Text (Console too) ", # "Bjornulf_WriteImageEnvironment": "✒ Write Image Environment", # "Bjornulf_WriteImageCharacters": "✒ Write Image Characters", # "Bjornulf_WriteImageCharacter": "✒ Write Image Character", diff --git a/pyproject.toml b/pyproject.toml index 386d910..ed40524 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "bjornulf_custom_nodes" description = "Nodes: Ollama, Text to Speech, Save image for Bjornulf LobeChat, Text with random Seed, Random line from input, Combine images (Background+Overlay alpha), Image to grayscale (black & white), Remove image Transparency (alpha), Resize Image, ..." -version = "0.19" +version = "0.21" license = {file = "LICENSE"} [project.urls] diff --git a/save_bjornulf_lobechat.py b/save_bjornulf_lobechat.py index 496fe62..4ecf082 100644 --- a/save_bjornulf_lobechat.py +++ b/save_bjornulf_lobechat.py @@ -3,6 +3,9 @@ import numpy as np from PIL import Image import json from PIL.PngImagePlugin import PngInfo +import torch +import gc +import requests class SaveBjornulfLobeChat: @classmethod @@ -20,6 +23,9 @@ class SaveBjornulfLobeChat: CATEGORY = "Bjornulf" def save_bjornulf_lobe_chat(self, image, prompt=None, extra_pnginfo=None): + # First, attempt to free VRAM + self.free_vram() + # Ensure the output directory exists output_dir = "./output/BJORNULF_LOBECHAT/" os.makedirs(output_dir, exist_ok=True) @@ -33,13 +39,16 @@ class SaveBjornulfLobeChat: img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) - # Determine the next available filename - counter = 1 - while True: - filename = f"{output_dir}api_{counter:05d}.png" - if not os.path.exists(filename): - break - counter += 1 + # Find the highest existing file number + existing_files = [f for f in os.listdir(output_dir) if f.startswith('api_') and f.endswith('.png') and f[4:-4].isdigit()] + if existing_files: + highest_num = max(int(f[4:-4]) for f in existing_files) + counter = highest_num + 1 + else: + counter = 1 + + # Determine the filename + filename = f"{output_dir}api_{counter:05d}.png" # Prepare metadata metadata = PngInfo() @@ -60,4 +69,44 @@ class SaveBjornulfLobeChat: print(f"Image saved as: {filename}") - return {"ui": {"images": [{"filename": filename, "type": "output"}]}} \ No newline at end of file + return {"ui": {"images": [{"filename": filename, "type": "output"}]}} + + def free_vram(self): + print("Attempting to free VRAM...") + + # Clear CUDA cache + if torch.cuda.is_available(): + torch.cuda.empty_cache() + print("CUDA cache cleared.") + + # Run garbage collection + collected = gc.collect() + print(f"Garbage collector: collected {collected} objects.") + + # Trigger the HTTP request + self.trigger_http_request() + + def trigger_http_request(self): + url = "http://localhost:8188/prompt" + headers = {"Content-Type": "application/json"} + payload = { + "prompt": { + "3": { + "inputs": {"text": "free VRAM hack"}, + "class_type": "Bjornulf_WriteText", + "_meta": {"title": "✒ Write Text"} + }, + "4": { + "inputs": {"text_value": ["3", 0], "text": "free VRAM hack"}, + "class_type": "Bjornulf_ShowText", + "_meta": {"title": "👁 Show (Text)"} + } + } + } + + try: + response = requests.post(url, headers=headers, data=json.dumps(payload)) + response.raise_for_status() + print("HTTP request triggered successfully") + except requests.exceptions.RequestException as e: + print(f"Failed to trigger HTTP request: {e}") \ No newline at end of file diff --git a/screenshots/write_in_console.png b/screenshots/write_in_console.png new file mode 100644 index 0000000000000000000000000000000000000000..a04ac09fd3474bfc0ce0bd192c15100b9cf07d0f GIT binary patch literal 19242 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 MsVGq_W*G4Q0RG4*9RL6T literal 0 HcmV?d00001 diff --git a/write_text_console.py b/write_text_console.py new file mode 100644 index 0000000..e17f77b --- /dev/null +++ b/write_text_console.py @@ -0,0 +1,21 @@ +import logging +class WriteTextInConsole: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "text": ("STRING", {"multiline": True}), + } + } + + # INPUT_IS_LIST = True + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("text",) + FUNCTION = "write_text_in_console" + OUTPUT_NODE = True + OUTPUT_IS_LIST = (False,) + CATEGORY = "Bjornulf" + + def write_text_in_console(self, text): + logging.info(f"Text: {text}") + return {"ui": {"text": text}, "result": (text,)}