Instructions to use lvladikov/SeedVR2-1.4B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- SeedVR
How to use lvladikov/SeedVR2-1.4B with SeedVR:
# No code snippets available yet for this library. # To use this model, check the repository files and the library's documentation. # Want to help? PRs adding snippets are welcome at: # https://github.com/huggingface/huggingface.js
- MLX
How to use lvladikov/SeedVR2-1.4B with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] huggingface-cli download --local-dir SeedVR2-1.4B lvladikov/SeedVR2-1.4B
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
"ERROR: VAE is invalid: None"
both mods are installed, other custom nodes were disabled to test it, still not patching the vae
[ERROR] Traceback (most recent call last):
File "ComfyUI/execution.py", line 545, in execute
output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, v3_data=v3_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "ComfyUI/execution.py", line 344, in get_output_data
return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, v3_data=v3_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "ComfyUI/execution.py", line 318, in _async_map_node_over_list
await process_inputs(input_dict, i)
File "ComfyUI/execution.py", line 306, in process_inputs
result = f(**inputs)
^^^^^^^^^^^
File "ComfyUI/nodes.py", line 838, in load_vae
vae.throw_exception_if_invalid()
File "ComfyUI/comfy/sd.py", line 1038, in throw_exception_if_invalid
raise RuntimeError("ERROR: VAE is invalid: None\n\nIf the VAE is from a checkpoint loader node your checkpoint does not contain a valid VAE.")
RuntimeError: ERROR: VAE is invalid: None
If the VAE is from a checkpoint loader node your checkpoint does not contain a valid VAE.
Let me check the tinyvae workflow, there might be an issue because of the vae name is different than original... will confirm...
I am preparing an update, and I have verified it this time end to end (will update readme too)
I have pushed the changes, please redownload the following (or pull latest)
comfyui/seedvr2_1.4b_tinyvae_upscale_image.json
comfyui/ComfyUI-SeedVR2-1.4B-TinyVAE/init.py
comfyui/ComfyUI-SeedVR2-1.4B-TinyVAE/README.md
README.md
assets/comfyui/comfyui_tinyvae_workflow.jpg (optional, just updated screnshot)
assets/comfyui/comfyui_tinyvae_workflow_thumb.jpg (optional, thumb for the above)
You were right, and my first instinct was wrong β apologies. This is a bug in the workflow I shipped, not in your setup, and you did nothing incorrect.
The cause isn't weight discovery. ComfyUI identifies a SeedVR2 VAE by a single stock decoder key:
comfy/sd.py
elif "decoder.up_blocks.2.upsamplers.0.upscale_conv.weight" in sd: # seedvr2
The distilled decoder replaces exactly those keys β 22 decoder tensors instead of the stock 144 β so detection falls through, no VAE object is built, and you get VAE is invalid: None.
The problem is that my workflow's VAELoader pointed at the distilled file, and its note told you to keep that filename "because the VAELoader asks for it by name". Checking git history, ComfyUI's detection key landed in the original SeedVR2 commit and never changed β so this was never a version regression. The workflow has been wrong since I published it, and you're the first person to run it exactly as written.
ema_vae_distill_fp16.safetensors is not a VAELoader input at all. The custom node finds it on disk and patches VideoAutoencoderKL.decode_ at import time; it never goes through load_vae.
Fixed and verified end-to-end on ComfyUI 0.30.0:
- the workflow's VAELoader now loads the stock seedvr2_ema_vae_fp16.safetensors
- the distilled file just needs to be findable β models/vae/, beside the node folder, or SEEDVR2_TINYVAE_PATH
- the misleading note is rewritten with an explicit warning, in both READMEs too
I also took the diagnostics idea from your PR: a failed lookup now logs every path it searched, and I added a filesystem fallback to ../../models/vae so that location works even when folder_paths isn't importable. One note on your sys.path approach β dirname(dirname(abspath(file))) lands on custom_nodes/, but folder_paths.py is one level further up in the ComfyUI root, so that import would still have failed. The path fallback avoids needing sys.path at all.
Please re-download the workflow JSON and the node folder. You'll know it's working from the console:
SeedVR2 TinyVAE: patched VideoAutoencoderKL.decode_
SeedVR2 TinyVAE: distilled decoder active (.../ema_vae_distill_fp16.safetensors)
SeedVR2 TinyVAE: calibrated β pre-scaled by ComfyUI, 30.3 dB vs the stock decoder.
Thanks for pushing back after my first reply β closing this in favour of the fix.
"RuntimeError: ERROR: VAE is invalid: None" after updating the extensions.
OS
linux
Python Version
3.12.13
PyTorch Version
2.13.0+cu130
I will retry with your "hack", but will be confusing for some users
I assume you redownloaded and replaced
comfyui/seedvr2_1.4b_tinyvae_upscale_image.json
comfyui/ComfyUI-SeedVR2-1.4B-TinyVAE/init.py
comfyui/ComfyUI-SeedVR2-1.4B-TinyVAE/README.md
README.md
then followed all the steps from root readme on how to install the custom node, and restarted ComfyUI after that?
One thing to double-check: you need both VAE files, not one or the other.
seedvr2_ema_vae_fp16.safetensors (501 MB, stock) β models/vae/ β this is what the VAELoader loads
ema_vae_distill_fp16.safetensors (203 MB, distilled) β drop it in the custom node's own folder; the node finds it on disk and patches the decoder at import time
My earlier wording called the distilled file "a complete VAE", which made it sound like a replacement for the stock one. It isn't β it's a decode-path swap.
Putting the distilled file in the node folder rather than models/vae/ also keeps it out of the VAELoader dropdown entirely, so there's nothing to mis-select.
Let me know if this helped?