Nova FlowPulse ๐
Find the One Node That's Eating Your Whole Run
- report
The odd node in a music pack
Nothing about this node is audio. It ships in ComfyUI-NovaAudioPlayer, a 25-node pack built around ACE-Step music generation - mastering, loudness measurement, tag writing, LoRA training - and tucked under Utility & IO there's a workflow profiler. Strange place for it, and still the node from this pack you'll most likely keep in every workflow.
The problem: ComfyUI tells you almost nothing about where a run goes. Your graph went from 90 seconds to six minutes after you swapped a sampler, and the progress bar just says something is slow. If you've gone looking before you've probably met ComfyUI_ProfilerX, the profiler people recommend in workflow threads; FlowPulse is the same job with a bigger on-canvas dashboard.
How it works, and how honest the numbers are
ComfyUI runs one node at a time in a single process. That's the fact the design rests on: your OS cannot tell you "KSampler used 82% CPU," because a process is the smallest unit it accounts for. So FlowPulse samples the ComfyUI process on a background thread and attributes each sample to whichever node held the execution slot at that moment - sound precisely because execution is sequential. Time is exact, taken from the execution events. CPU, RAM, disk and GPU are sampled, so they spot the hot node without being precise.
Three caveats before you trust a figure:
- A node that finishes inside one sample interval shows
โ, not zero. Dropsample_interval_msto 50 for short nodes. - CPU reads like
top: 100% is one core fully busy, so a multi-threaded node can read above 100%. - ฮ RAM is a hint, not ownership - tensors are shared and freed lazily, so a node can show a negative delta. Peak RAM and duration are the figures to act on.
Nodes served from cache never execute, so they don't appear. Correct - they cost nothing.
The inputs you actually set
Six widgets; two or three matter day to day.
sample_interval_ms- 250 ms is a fine default, 50โ100 ms when you're chasing something fast.gpu_telemetry- leave it onauto (safe). That mode uses only NVML, AMD SMI or pyrsmi, out-of-band monitoring APIs meant to be called from any thread.torch (unsafe on ROCm)reads PyTorch's allocator instead, and the author's tooltip warns it has aborted ComfyUI on ROCm. Believe it.log_to_file,log_format(csv,json,markdown) andlog_name- writes toComfyUI/output/nova_flowpulse/<log_name>-<timestamp>.<ext>when each run finishes.reset_each_run- off, so averages settle over repeated runs. On when you only care about this run.
view_state is hidden, driven by the dashboard itself. Don't touch it.
The single output is report, a string summarising the last completed run with a ranked bar chart of the slowest nodes - wire it into Nova Console ๐ฅ๏ธ from the same pack. One quirk: the log is written when the run finishes, not when this node executes, so report describes the last completed run. Press โญณ Save log for a file covering the run that just ended.
Installing it
comfy node install comfyui-novaaudioplayer
# or
cd ComfyUI/custom_nodes
git clone https://github.com/NovaFemme/ComfyUI-NovaAudioPlayer.git
Restart ComfyUI and hard-refresh the browser (Ctrl + F5). Not optional - the dashboard is JavaScript, and a cached older copy is the most common way this node misbehaves.
No models, and nothing heavy for this node: the pack's two declared packages, mutagen and pymysql, belong to its tagging and MySQL nodes. FlowPulse needs psutil, which ComfyUI normally ships - if not, pip install psutil and the status bar says so rather than dying. For real GPU numbers:
pip install nvidia-ml-py # NVIDIA
pip install amdsmi # AMD, ships with ROCm
pip install pyrsmi # AMD, lighter alternative
The console prints which backend it picked on the first sampled run. No backend just hides the GPU panel.
Where people get burned
A stale browser takes the node out of the run. Value not in list: gpu_telemetry: False not in [...] means ComfyUI restored widget values by position, a widget shifted everything one slot, and a boolean landed in a dropdown. Hard-refresh. Since v1.2 it falls back to defaults and says so in the console instead of being dropped.
ROCm crashes. A death with Fatal Python error: Aborted and a HW Exception by GPU node-1 ... GPU Hang line is the driver giving up, not a Python error. Set gpu_telemetry to off and run again - if it still aborts, FlowPulse is innocent and you're into the usual ROCm suspects (a non-fp16 VAE, tiled VAE decode, --disable-smart-memory). With no backend installed it makes no GPU calls at all, so this is a clean way to rule it in or out.
macOS disk counters. Per-process I/O isn't available there, so it falls back to system-wide figures and the footer says which.
Should you use it
Yes, if you've ever stared at a slow graph and guessed. It points at the node to look at, and it flags its own weak figures rather than handing you a confident wrong number.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| log_to_file | BOOLEAN | false | Write a profile file to output/nova_flowpulse when each run finishes. |
| log_format | COMBO | csv | File format of the saved profile: csv, json or markdown. |
| log_name | STRING | nova_profile | File name prefix. A timestamp is always appended. |
| sample_interval_ms | INT | 25050โ2000 | How often the process is sampled while a run is active. |
| gpu_telemetry | COMBO | auto (safe) | auto: NVML / AMD SMI only, safe to poll during a run. torch: reads PyTorch's allocator and is opt-in - polling the compute runtime has aborted ComfyUI on ROCm. |
| reset_each_run | BOOLEAN | false | On: every run starts from zero. Off: figures accumulate so averages settle. |
| view_state | STRING | Set by the dashboard on the node: the view, the focused node and the sort order. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| report | STRING | Summary of the last completed run, and the path of the log file when logging is on. |