If you spend enough time reading ComfyUI launch-command discussions, you will eventually see someone paste a one-word "optimization" and claim it made their generations faster: --fast. It sounds exactly like a free win. But ComfyUI’s own source code describes --fast very differently from the way most tutorials gloss over it. The flag bundles a set of untested performance features, several of which can change your output or crash a workflow outright. In this guide I break down what --fast actually turns on, which of those toggles are genuinely safe to use individually, and how to reason about the speed-versus-quality and speed-versus-stability trade-off before you flip everything on.
This is a documentation analysis built directly from the ComfyUI source (comfy/cli_args.py) and the official startup-flags reference, not a synthetic benchmark. Where I make a claim about what a flag does, I point to the exact help text in the code. I do not fabricate FPS numbers or "2x faster" results that I have not measured.
What –fast Actually Is (Not a Magic Speed Switch)
The full help text for the flag in cli_args.py reads:
--fast [FAST ...]— Enable some untested and potentially quality deteriorating optimizations. This is used to test new features so using it might crash your ComfyUI.
Three phrases in that sentence matter and are almost always left out of the "just add --fast" advice:
- Untested. These are not the stable, default-on optimizations ComfyUI ships for Nvidia cards (like async weight offloading, which is on by default). They are experimental paths.
- Potentially quality deteriorating. Some features trade numerical precision or skip work in ways that can alter pixels, not just wall-clock time.
- Might crash. The flag is explicitly documented as a way to test new features, not as a recommended production setting.
The argument parser handles --fast in three ways. If you pass --fast with no value at all, it enables every feature in the internal PerformanceFeature set. If you pass a list (for example --fast async_cuda_graphs), only those features are enabled. This matters a lot: the difference between "give me one specific experimental toggle" and "turn on every experimental toggle at once" is the difference between a measured, reversible experiment and a mystery box that breaks things.
Understanding what --fast wraps is also useful because many of the individual features it enables are themselves available as standalone flags. You often want the standalone version, not the bundle. Let’s map the stable flags first, because they are how you get speed without accepting the "untested" label.
The Safe-by-Default Optimizations You Should Understand First
Before touching --fast, know which performance features are already on by default or available as stable, documented flags. Pulling the exact help text from cli_args.py:
--async-offload [NUM_STREAMS] Use async weight offloading. An optional argument
controls the amount of offload streams. Default is 2.
Enabled by default on Nvidia.
--disable-async-offload Disable async weight offloading.
--reserve-vram GB Set the amount of vram in GB you want to reserve for
use by your OS/other software.
--vram-headroom GB Set the amount of vram in GB for DynamicVRAM to maintain
as extra headroom above default.
--fast-disk Force disk-backed dynamic loading and offload over
unpinned RAM. Can be faster for users with fast NVME disks.
--disable-smart-memory Force ComfyUI to aggressively offload to regular RAM
instead of keeping models in VRAM when it can.
The practical takeaway: on an Nvidia GPU you are already getting async weight offloading with two streams by default. That is your normal baseline. The flags above are how you fine-tune memory pressure (“keep some VRAM free for my browser” via --reserve-vram, or “leave a safety buffer” via --vram-headroom) or choose a different offload target (--fast-disk if you have a fast NVMe and want to spill to disk instead of clamping). None of these are “untested.”
There is an important interaction worth flagging: --fast-disk and the broader caching flags (--cache-ram, --cache-lru, --cache-none) govern where offloaded weights and intermediate results live. If you are chasing a memory problem, changing the cache/offload target is a far more predictable lever than --fast. We have covered the offload-versus-leak diagnosis in detail in our ComfyUI system-RAM OOM guide, and the launch-flag family is mapped in the –lowvram vs –novram vs –normalvram explainer.
What the Individual Performance Features Do (and Why They’re Risky)
The reason --fast carries a "quality deteriorating" warning is that it can flip experimental execution paths. Two categories dominate in practice, and both are visible in the source as individual disable flags:
--disable-cuda-graphs Disable CUDA graphs.
--disable-comfy-compiler Disable the Comfy model compiler, including its CUDA
graph subfeature.
--assert-graph-breaks Fail on Comfy model compiler graph breaks.
--force-non-blocking Force ComfyUI to use non-blocking operations for all
applicable tensors.
CUDA graphs and the Comfy model compiler are the two big “capture the work once, replay it faster” mechanisms. When they work, they cut kernel-launch overhead and can meaningfully speed up repeated sampler steps. When they don’t work — for example when a custom node introduces a dynamic control-flow branch that breaks graph capture — you get either a fallback (slower) or an outright failure. That is exactly the kind of thing the --assert-graph-breaks flag is there to surface during development: it makes a silent performance fallback into a loud error so developers know a graph broke.
The honest recommendation here is the reverse of the “turn it all on” instinct. If you suspect a specific workflow is slow, isolate one toggle at a time:
- Run your normal workflow and note the generation time.
- Enable a single experimental feature (e.g.
--fast <feature>) and re-run the same seed, same prompt. - Compare the output image hash. If pixels changed and you didn’t expect them to, that feature altered numerics — treat it as a quality trade, not a free speedup.
- If the workflow errors, capture the traceback before touching anything else. A broken graph is often a specific node’s fault, not a reason to disable optimization globally.
This isolate-then-verify loop is the only way to know whether an experimental toggle actually helps your workflow. It is also why blanket advice like “just add --fast” is unreliable: the features that help one node graph may silently degrade another.
The Memory Flags That Change Behavior vs. the Ones That Don’t
A recurring source of confusion is the difference between flags that change where weights live and flags that change how work is computed. They get lumped together under “performance flags,” but the failure modes are completely different.
The VRAM group is mutually exclusive — you pick one:
--gpu-only Store and run everything (text encoders/CLIP models, etc.)
on the GPU.
--highvram Keep models in GPU memory after use instead of unloading.
--lowvram Run text encoders on CPU (no-op if Dynamic VRAM is active).
--novram When lowvram isn't enough.
--cpu Run everything on the CPU (slow).
These change where weights live, not how the math is done. The output should be byte-identical regardless of which you choose — only speed and memory differ. If switching among --highvram/--lowvram/--gpu-only changes your image, that is a bug worth reporting, not a normal trade-off. By contrast, a flag like --fp16-vae (whose help text literally warns “might cause black images”) changes the numerical precision of an actual computation, so different output is expected.
Knowing this distinction saves you hours. If your image changes and you only touched memory flags, stop looking at your prompt and start looking for a custom node that pads or slices tensors differently under offload. If your image changes and you enabled an experimental compute feature, that change is the feature doing what its warning said it might.
One more interaction worth understanding: --lowvram is explicitly a no-op when Dynamic VRAM is enabled (which it is by default on Nvidia unless you pass --highvram, --gpu-only, --novram, or --cpu). People frequently “add --lowvram” to fix an OOM, see no change, and conclude the flag is broken. It isn’t — Dynamic VRAM already applies a more adaptive policy, so the legacy flag is simply inert. If you need to force the old behavior, --disable-dynamic-vram is the switch, and we walk through exactly when that is the right call in the Dynamic VRAM default-OOM guide.
How to Actually Verify a Performance Flag Helps You
The core skill here is not memorizing flags — it is building a tiny verification habit so you stop guessing. Here is a concrete, reproducible method that requires no special tooling:
- Pin the inputs. Fix the seed, the prompt, the sampler, steps, and CFG. A “before/after” comparison is meaningless if any of these drift.
- Record a baseline. Note the wall-clock time and the output filename for the default launch.
- Change exactly one thing. One flag. One feature. Nothing else.
- Compare time and pixels. Time is obvious. For pixels, hash the two PNGs (or open both and zoom in). If they differ and you only changed a memory flag, investigate; if they differ after an experimental compute toggle, that toggle changed numerics.
- Write it down. A one-line note (“
--fast <X>: +18% faster, output identical”) beats re-running the whole experiment next month.
The reason this discipline matters specifically for --fast is its “untested” label. The features inside may change from release to release. A toggle that was safe and helpful in one version can regress in the next, because by definition experimental features are still settling. Your verification note from three months ago may no longer hold — but the habit of verifying will always be correct.
The official reference to lean on while you experiment is the ComfyUI startup-flags documentation, which mirrors cli_args.py and is the canonical place to check current help text. The changelog is worth a skim too, since new performance features tend to be announced there before most tutorials catch up.
Conclusion: Treat –fast as a Test Bench, Not a Setting
The single most useful mental model is this: --fast is a test bench, not a setting. It exists so ComfyUI developers — and curious power users — can enable experimental features incrementally and report what breaks. It is not a “recommended for everyone” launch mode, and its own help text tells you as much in plain language.
If you take one thing away, take this decision order:
- Is async offloading already on for your card? (It is, by default, on Nvidia.) If so, you already have the main free speedup.
- Are you memory-limited rather than compute-limited? Fix memory with
--reserve-vram,--vram-headroom, or a cache/offload flag — not an experimental compute toggle. - Only if a stable workflow is still slow should you reach for individual
--fastfeatures, one at a time, with pinned inputs and a before/after comparison.
Speed in ComfyUI is almost always about understanding where your weights live and where your work happens — not about flipping an unknown bundle of untested toggles. Use --fast the way it was intended: as a surgical tool for isolated experiments, with your eyes open to the possibility that it changes your output or crashes your run.
For further reading on the memory side of the same equation, see our attention-backends explainer (SDPA vs SageAttention vs xFormers) and the --vram-headroom vs --reserve-vram guide.