FlashVSR_SM_Model
FlashVSR_SM_Model is the loader that decides which FlashVSR you're actually running
- FlashVSR_SM_Model
Nothing renders in this node. It loads weights, and then it decides - silently, from two dropdowns - whether you get FlashVSR v1.0, v1.1, or the newer FlashVSR+ (plus). Get those dropdowns wrong and the whole graph runs beautifully and looks worse than a bilinear resize.
That's worth understanding before you touch anything else, because this pack is a manual build, not an all-in-one. You wire the pipeline yourself: model loader → sampler → VAE → decoder. FlashVSR_SM_Model is step one.
What FlashVSR is, and why the loader matters
FlashVSR is OpenImagingLab's streaming video super-resolution model - a one-step, DMD-distilled diffusion restorer that arrived in October 2025 and got adopted fast for one reason: speed. It's the model people actually switched to from SeedVR2 for normal-looking footage, and the split has stayed roughly there: FlashVSR when the source is already decent and you want it done, SeedVR2 when the source is genuinely tiny and you can afford the compute. Later reporting has FlashVSR reading as higher fidelity and faster, SeedVR2 as sharper and slower.
The loader is where that model gets assembled: a DiT checkpoint (diffusion_pytorch_model_streaming_dmd*.safetensors), the LQ 4× projection that feeds your low-res frames into it (LQ_proj_in.ckpt), and the positional/cross-KV embedding file (posi_prompt.pth). Those three are version-specific, and mixing them is the single most common way to make FlashVSR look bad.
The inputs that matter
The three file pickers - dit, proj_pt, emb_pt - are combos built by matching filenames in ComfyUI/models/FlashVSR, not by inspecting the files. dit only lists names containing "dmd" or "dit", proj_pt only names containing "proj", emb_pt only names containing "prompt". Rename your download to something sensible and it vanishes from the list. Leave one on "none" and the node refuses to run with Please select the emb pt, dit, proj_pt file.
Then version, which is the actual decision:
1.1or1.0- the classic path. Pick the one your weights belong to. The README is blunt that a 1.1 DiT needs the 1.1 projection (and vice versa) or quality degrades.plus_turbo/plus_base- FlashVSR+. One-step, hybrid attention, and the thing that makes untiled 4K plausible on a 24GB card. Turbo vs base must match the weight file you downloaded; it's not a speed slider.
The booleans:
offload- keeps the DiT on the CPU and shuffles it to the GPU only while it's denoising. Turn it on when you're short on VRAM. It costs you the load-everything-once convenience, so leave it off if you can.tiny_long- swaps in the chunked long-video pipeline instead of the whole-clip one, for footage too long to hold at once. This one has a hard requirement: your FlashVSR_SM_Vae node must be loading the TCDecoder, because that's the only decoder the long path supports. Queue a long run with a Wan VAE selected and you get a clear error about it.
Two more, which only apply in plus mode: plus_temporal (4, 2 or 1 frames per latent frame - the README suggests 2 or 1 for high-motion footage, at a speed cost) and plus_attn (sdpa, auto, block_sparse, triton_block_sparse). Leave plus_attn on sdpa unless you've actually built something better; triton_block_sparse needs the optional operators/flashvsr_attn build, and block_sparse wants the compiled Block-Sparse-Attention library and, per the pack's own comments, data-centre-class cards. Selecting a backend you never installed fails at build time.
Output
One thing: a FlashVSR_SM_Model wire. It goes into FlashVSR_SM_KSampler's model input, and nowhere else.
Install
Via ComfyUI Manager, search the pack title, or from a terminal:
cd ComfyUI/custom_nodes
git clone https://github.com/smthemex/ComfyUI_FlashVSR
cd ComfyUI_FlashVSR
pip install -r requirements.txt
Restart ComfyUI. Then drop the weights in place - the FlashVSR folder is created automatically if it's missing:
ComfyUI/models/FlashVSR/
├── diffusion_pytorch_model_streaming_dmd.safetensors # the DiT
├── LQ_proj_in.ckpt # projection
└── posi_prompt.pth # 4MB, the embeddings
Both v1.0 and v1.1 checkpoints live on HuggingFace under JunhaoZhuang/FlashVSR and JunhaoZhuang/FlashVSR-v1.1; plus weights under ruchangyao/FlashVSR_plus. The plus embedding file is a different posi_prompt.pth from the GitHub repo's prompt_tensor folder - don't reuse the v1.0 one. Block-Sparse-Attention is optional and compiling it is its own afternoon; the README documents the route if you want the official-quality attention path.
Troubleshooting
Empty dropdowns. Your file names don't contain the magic substrings. Rename to include dmd/dit, proj, and prompt respectively, then refresh.
Output looks washed out or over-sharpened. You've mixed a 1.1 DiT with a 1.0 projection, or picked the wrong version for the weights. Match all three files to one release.
Plus mode throws a CUDA error. The plus pipeline is NVIDIA-only by construction in this pack; there's no CPU or MPS fallback.
Out of memory before anything appears to happen. This node is what fills the GPU. Set offload, and read the KSampler and Decoder pages next - resolution and decode tiling are where the rest of your VRAM goes.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| dit | COMBO | 1 options: none | |
| proj_pt | COMBO | 1 options: none | |
| emb_pt | COMBO | 1 options: none | |
| version | COMBO | 4 options: 1.1, 1.0, plus_turbo, plus_base | |
| tiny_long | BOOLEAN | false | — |
| offload | BOOLEAN | false | — |
| plus_temporal | COMBO | 3 options: 4, 2, 1 | |
| plus_attn | COMBO | 4 options: sdpa, auto, block_sparse, triton_block_sparse |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| FlashVSR_SM_Model | FlashVSR_SM_Model | — |