Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Memory leak(not VRAM) by websocket api #6494

Open
t00350320 opened this issue Jan 17, 2025 · 1 comment
Open

Memory leak(not VRAM) by websocket api #6494

t00350320 opened this issue Jan 17, 2025 · 1 comment
Labels
Potential Bug User is reporting a bug. This should be tested.

Comments

@t00350320
Copy link

t00350320 commented Jan 17, 2025

Expected Behavior

env:

linux
ComfyUI:v0.3.10
NVIDIA-SMI 535.104.12             Driver Version: 535.104.12   CUDA Version: 12.2 
torch                     2.5.1+cu121

testcomfyui_api.py send a prompt queue request to Native ComfyUI Server by a websocket:

workflow 0 load the modules to be loaded by Cache Backend Data(Inspire) Node
load init workflow 0: python testcomfyui_api.py 0 1.png 2.png
load api workflow 1:  python testcomfyui_api.py 1 1.png 2.png
then make a loop request python testcomfyui_api.py 1 1.png 2.png, 

then, add some trace code with tracemalloc and objgraph.show_backrefs in main.py

def prompt_worker(q, server_instance):
    current_time: float = 0.0
    e = execution.PromptExecutor(server_instance, lru_size=args.cache_lru)
    last_gc_collect = 0
    need_gc = False
    gc_collect_interval = 10.0

    tracemalloc.start()
    snapshot0 = tracemalloc.take_snapshot()

    while True:
        timeout = 100.0
        if need_gc:
            timeout = max(gc_collect_interval - (current_time - last_gc_collect), 0.0)

        queue_item = q.get(timeout=timeout)
        snapshot1 = tracemalloc.take_snapshot()
        if queue_item is not None:
            item, item_id = queue_item
            execution_start_time = time.perf_counter()
            prompt_id = item[1]
            server_instance.last_prompt_id = prompt_id

            e.execute(item[2], prompt_id, item[3], item[4])
            need_gc = True
            q.task_done(item_id,
                        e.history_result,
                        status=execution.PromptQueue.ExecutionStatus(
                            status_str='success' if e.success else 'error',
                            completed=e.success,
                            messages=e.status_messages))
            if server_instance.client_id is not None:
                server_instance.send_sync("executing", {"node": None, "prompt_id": prompt_id}, server_instance.client_id)

            current_time = time.perf_counter()
            execution_time = current_time - execution_start_time
            logging.info("Prompt executed in {:.2f} seconds".format(execution_time))
       flags = q.get_flags()
        free_memory = flags.get("free_memory", False)

        if flags.get("unload_models", free_memory):
            comfy.model_management.unload_all_models()
            need_gc = True
            last_gc_collect = 0

        if free_memory:
            e.reset()
            need_gc = True
            last_gc_collect = 0

        if need_gc:
            current_time = time.perf_counter()
            if (current_time - last_gc_collect) > gc_collect_interval:
                gc.collect()
                comfy.model_management.soft_empty_cache()
                last_gc_collect = current_time
                need_gc = False

        snapshot2 = tracemalloc.take_snapshot()
        top_stats = snapshot2.compare_to(snapshot1, 'lineno')

        print("[ Top 10 differences ]")
        for stat in top_stats[:10]:
            print(stat)
            logging.info("stat:{}".format(stat))

        top_stats1 = snapshot2.compare_to(snapshot0, 'lineno')
        print("[ Top 10 differences top_stats1]")
        for stat in top_stats1[:10]:
            print(stat)
            logging.info("stat1:{}".format(stat))

        print("item[2]:",item[2])
        objgraph.show_backrefs(item[2], filename='sample-backref-graph.png')

Actual Behavior

hours later, we find a memory increase and it may happened near "prompt_data = json.load(workflow_api_file)"
or caused by ComfyUI prompt reference, have no idea.

Some logs from main.py shows a decoder size increase ,

stat1:/usr/lib/python3.10/json/decoder.py:355: size=22.2 MiB (+22.2 MiB), count=358297 (+358297), average=65 B
stat1:/usr/lib/python3.10/json/decoder.py:355: size=22.6 MiB (-10.2 KiB), count=365251 (-139), average=65 B

Steps to Reproduce

sorry for file type reason, please move .txt file to .py file, testcomfyui_api.txt equals testcomfyui_api.py
testcomfyui_api.txt

Debug Logs

stat1:/usr/lib/python3.10/json/decoder.py:355: size=22.2 MiB (+22.2 MiB), count=358297 (+358297), average=65 B
stat1:/usr/lib/python3.10/json/decoder.py:355: size=22.6 MiB (-10.2 KiB), count=365251 (-139), average=65 B

Other

No response

@t00350320 t00350320 added the Potential Bug User is reporting a bug. This should be tested. label Jan 17, 2025
@t00350320
Copy link
Author

t00350320 commented Jan 17, 2025

Image

sample-backref-graph.png
Image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Potential Bug User is reporting a bug. This should be tested.
Projects
None yet
Development

No branches or pull requests

1 participant