Wan 2.2 ComfyUI Workflow: 5B vs 14B Setup, Model Files and Fixes
Wan 2.2 runs in ComfyUI through two official templates. The 5B template is one model that does both text-to-video and image-to-video. The 14B template uses two models: a high-noise model for the first half of the sampling steps and a low-noise model for the second half. This guide shows the real node graph, the exact model files and their sizes, and the errors you get when a file is missing, all taken from a fresh ComfyUI install.
Quick answer: update ComfyUI, open the template video_wan2_2_5B_ti2v (or video_wan2_2_14B_t2v), download the model files listed below into models/diffusion_models, models/text_encoders and models/vae, then run it. The 5B setup needs about 18 GB of downloads. The 14B fp8 setup needs about 36 GB, or 38 GB with the 4-step LoRAs.
How we tested: we installed ComfyUI 0.38.0 (commit 65787d6, 1 Oct 2026) with workflow templates 0.11.74 in a container. Our test machine has no NVIDIA GPU, so ComfyUI ran with --cpu. That is enough to read the node definitions, open the official templates and send prompts to the API. We did not generate a video, so this post has no speed or quality numbers. For those, see the official ComfyUI Wan 2.2 guide.
5B or 14B: which Wan 2.2 workflow to use
The official ComfyUI guide states: “The Wan2.2 5B version should fit well on 8GB vram with the ComfyUI native offloading.” The 14B models are much bigger files, as the Hugging Face listing below shows. Start with 5B unless you have a large GPU.
| 5B TI2V | 14B T2V | |
|---|---|---|
| Template | video_wan2_2_5B_ti2v | video_wan2_2_14B_t2v |
| Diffusion model(s) | 1 file, 10.00 GB (fp16) | 2 files (high + low noise), 14.29 GB each (fp8) |
| VAE | wan2.2_vae, 1.41 GB | wan_2.1_vae, 0.25 GB |
| Default size | 1280×704, 121 frames, 24 fps | 640×640, 81 frames, 16 fps |
| Default sampling | KSampler, 20 steps, CFG 5, uni_pc | 2× KSamplerAdvanced, 20 steps split 10/10, CFG 3.5, euler |
Other Wan 2.2 templates in the same package: video_wan2_2_14B_i2v, video_wan2_2_14B_flf2v (first and last frame), video_wan2_2_14B_s2v (sound to video), video_wan2_2_14B_fun_camera, video_wan2_2_14B_fun_control, video_wan2_2_14B_fun_inpaint, video_wan2_2_5B_fun_control and video_wan2_2_5B_fun_inpaint.
Model files and where to put them
All files come from the Comfy-Org/Wan_2.2_ComfyUI_Repackaged repository. The text encoder and the 2.1 VAE come from the Wan 2.1 repackaged repo. These sizes come from the Hugging Face API:
10.00 split_files/diffusion_models/wan2.2_ti2v_5B_fp16.safetensors
14.29 split_files/diffusion_models/wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors
14.29 split_files/diffusion_models/wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors
28.58 split_files/diffusion_models/wan2.2_t2v_high_noise_14B_fp16.safetensors
28.58 split_files/diffusion_models/wan2.2_t2v_low_noise_14B_fp16.safetensors
14.29 split_files/diffusion_models/wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors
14.29 split_files/diffusion_models/wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors
11.37 split_files/text_encoders/umt5_xxl_fp16.safetensors
6.74 split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors
1.41 split_files/vae/wan2.2_vae.safetensors
0.25 split_files/vae/wan_2.1_vae.safetensors
1.23 split_files/loras/wan2.2_t2v_lightx2v_4steps_lora_v1.1_high_noise.safetensors
1.23 split_files/loras/wan2.2_t2v_lightx2v_4steps_lora_v1.1_low_noise.safetensors(Size in GB. Excerpt; the repo also has Animate, S2V, Fun and VACE models.)
The 5B template stores its download links inside the workflow file. Folder and URL for each model:
model: wan2.2_ti2v_5B_fp16.safetensors -> diffusion_models https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_ti2v_5B_fp16.safetensors
model: umt5_xxl_fp8_e4m3fn_scaled.safetensors -> text_encoders https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors
model: wan2.2_vae.safetensors -> vae https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/vae/wan2.2_vae.safetensorsDownload them from inside your ComfyUI folder:
cd ComfyUI
wget -P models/diffusion_models https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_ti2v_5B_fp16.safetensors
wget -P models/text_encoders https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors
wget -P models/vae https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/vae/wan2.2_vae.safetensorsDo not mix up the two VAEs. The 5B model uses wan2.2_vae.safetensors. The 14B models use wan_2.1_vae.safetensors.
Install ComfyUI and check the Wan nodes
These are the commands we ran. On a machine with an NVIDIA GPU, install the CUDA build of PyTorch from pytorch.org instead of the CPU build, and drop --cpu.
git clone --depth 1 https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu # CPU-only build, as in our test
pip install -r requirements.txt
python main.py --cpu --listen 0.0.0.0Use /system_stats to check versions. The templates are a separate pip package, so an old comfyui-workflow-templates package means the Wan 2.2 templates may be missing:
$ curl -s localhost:8188/system_stats | python3 -m json.tool
"comfyui_version": "0.38.0",
"required_frontend_version": "1.53.10",
"installed_templates_version": "0.11.74",
"required_templates_version": "0.11.74",
"pytorch_version": "2.14.1+cpu",/object_info lists every node this build has. Our build had 970 nodes. Two kinds of Wan nodes are mixed in that list:
Wan22ImageToVideoLatent - model/conditioning/wan
WanImageToVideo - model/conditioning/wan
WanFirstLastFrameToVideo - model/conditioning/wan
WanCameraImageToVideo - model/conditioning/wan/camera
WanSoundImageToVideo - model/conditioning/wan/sound
WanVaceToVideo - model/conditioning/wan/vace
...
Wan2TextToVideoApi - partner/video/Wan
Wan2ImageToVideoApi - partner/video/Wan
WanTextToVideoApi - partner/video/WanNodes under model/conditioning/wan run on your own GPU with the files above. Nodes under partner/video/Wan are Partner Nodes: they send the job to a hosted API through your Comfy account and need no local model files. If you have no suitable GPU, use Partner Nodes or a hosted tool such as Pika or Luma.
The 5B text/image-to-video graph
This is the official 5B template, node by node (the “widgets_values” of each node):
37 UNETLoader ['wan2.2_ti2v_5B_fp16.safetensors', 'default']
38 CLIPLoader ['umt5_xxl_fp8_e4m3fn_scaled.safetensors', 'wan', 'default']
39 VAELoader ['wan2.2_vae.safetensors']
48 ModelSamplingSD3 [8]
6 CLIPTextEncode ['Low contrast. In a retro 1970s-style subway station, a street musician plays ...']
7 CLIPTextEncode ['色调艳丽,过曝,静态,细节模糊不清,字幕,...']
55 Wan22ImageToVideoLatent [1280, 704, 121, 1]
56 LoadImage ['example.png', 'image']
3 KSampler [898471028164125, 'randomize', 20, 5, 'uni_pc', 'simple', 1]
8 VAEDecode []
57 CreateVideo [24]
58 SaveVideo ['video/ComfyUI', 'auto', 'auto']What matters:
- CLIPLoader type must be
wan. The same node also offersstable_diffusion,sd3,ltxvand others. The UMT5 text encoder works only withwan. - ModelSamplingSD3 shift = 8 for 5B. The 14B template uses 5.
- Text vs image to video is the same graph.
Wan22ImageToVideoLatenthas an optionalstart_imageinput. Connect theLoadImagenode for image-to-video, or leave it unconnected for text-to-video. - The negative prompt is in Chinese, as in the original Wan release. Keep it.
Size limits from the node definition:
Wan22ImageToVideoLatent inputs:
[required] vae: VAE
[required] width: INT {'default': 1280, 'min': 32, 'max': 16384, 'step': 32}
[required] height: INT {'default': 704, 'min': 32, 'max': 16384, 'step': 32}
[required] length: INT {'default': 49, 'min': 1, 'max': 16384, 'step': 4}
[required] batch_size: INT {'default': 1, 'min': 1, 'max': 4096}
[optional] start_image: IMAGE
outputs: ['LATENT']Width and height move in steps of 32, and length in steps of 4. The template frame counts are all 4n+1: 121 frames at 24 fps is about 5 seconds. To make a shorter clip, lower length to 97, 73, 49 and so on. To make it smaller, lower the width and height, for example 832×480 or 640×352.
The 14B workflow: two models, one denoising pass
The 14B templates hide their nodes inside a subgraph named “Text to Video(Wan2.2)”. Open it to see the high-noise/low-noise split:
subgraph: Text to Video(Wan2.2) 30 nodes
71 CLIPLoader ['umt5_xxl_fp8_e4m3fn_scaled.safetensors', 'wan', 'default']
73 VAELoader ['wan_2.1_vae.safetensors']
74 EmptyHunyuanLatentVideo [640, 640, 81, 1]
75 UNETLoader ['wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors', 'default']
76 UNETLoader ['wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors', 'default']
78 KSamplerAdvanced ['disable', 0, 'fixed', 4, 1, 'euler', 'simple', 2, 4, 'disable']
81 KSamplerAdvanced ['enable', 923510416338945, 'randomize', 4, 1, 'euler', 'simple', 0, 2, 'enable']
82 ModelSamplingSD3 [5.000000000000001]
83 LoraLoaderModelOnly ['wan2.2_t2v_lightx2v_4steps_lora_v1.1_high_noise.safetensors', 1.0000000000000002]
85 LoraLoaderModelOnly ['wan2.2_t2v_lightx2v_4steps_lora_v1.1_low_noise.safetensors', 1.0000000000000002]
114 PrimitiveInt Int (Steps) [20, 'fixed']
115 PrimitiveInt Int (Split Steps) [10, 'fixed']
116 PrimitiveFloat Float(CFG) [3.5]
117 PrimitiveInt Int (Steps) [4, 'fixed']
118 PrimitiveInt Int (Split Steps) [2, 'fixed']
119 PrimitiveFloat Float(CFG) [1]
125 PrimitiveFloat Float (FPS) [16]
126 PrimitiveFloat Float (Duration) [5]
127 ComfyMathExpression ['floor(a * b) + 1']
129 PrimitiveBoolean Enable Lightning LoRA [False]How it works:
- Sampler 81 (high-noise model) runs from step 0 to the split step with
add_noise: enableandreturn_with_leftover_noise: enable. It hands a half-finished latent to the next sampler. - Sampler 78 (low-noise model) continues from the split step to the last step with
add_noise: disable. - “Enable Lightning LoRA” switch. Off (default): 20 steps, split at 10, CFG 3.5, no LoRA. On: the two lightx2v LoRAs are applied, with 4 steps, split at 2, CFG 1. The widget values shown on nodes 78/81 are overwritten by these switches.
- Frame count is computed:
floor(duration × fps) + 1= floor(5 × 16) + 1 = 81 frames.
The subgraph exposes these inputs on the outside, so you can change models and settings without opening it: text, width, height, duration, high_noise_model, high_noise_lightning_lora, low_noise_model, low_noise_lightning_lora, clip_name, vae_name, enable_turbo_mode.
If you build the graph yourself, keep the step count and split the same on both samplers. Each sampler covers only half of the steps, so a mismatch leaves noise in the video.
Run Wan 2.2 through the ComfyUI API
The /prompt endpoint takes the graph in API format, not the template file. Export it from the ComfyUI menu as an API workflow, or write it by hand. This is the 5B text-to-video graph in API format:
{"prompt": {
"37": {"class_type": "UNETLoader", "inputs": {"unet_name": "wan2.2_ti2v_5B_fp16.safetensors", "weight_dtype": "default"}},
"38": {"class_type": "CLIPLoader", "inputs": {"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors", "type": "wan", "device": "default"}},
"39": {"class_type": "VAELoader", "inputs": {"vae_name": "wan2.2_vae.safetensors"}},
"48": {"class_type": "ModelSamplingSD3", "inputs": {"model": ["37", 0], "shift": 8}},
"6": {"class_type": "CLIPTextEncode", "inputs": {"clip": ["38", 0], "text": "a red fox walking through snow, slow camera pan"}},
"7": {"class_type": "CLIPTextEncode", "inputs": {"clip": ["38", 0], "text": "blurry, low quality"}},
"55": {"class_type": "Wan22ImageToVideoLatent", "inputs": {"vae": ["39", 0], "width": 1280, "height": 704, "length": 121, "batch_size": 1}},
"3": {"class_type": "KSampler", "inputs": {"model": ["48", 0], "positive": ["6", 0], "negative": ["7", 0], "latent_image": ["55", 0],
"seed": 1, "steps": 20, "cfg": 5, "sampler_name": "uni_pc", "scheduler": "simple", "denoise": 1}},
"8": {"class_type": "VAEDecode", "inputs": {"samples": ["3", 0], "vae": ["39", 0]}},
"57": {"class_type": "CreateVideo", "inputs": {"images": ["8", 0], "fps": 24}},
"58": {"class_type": "SaveVideo", "inputs": {"video": ["57", 0], "filename_prefix": "video/wan22_5b", "format": "auto", "codec": "auto"}}
}}curl -s -X POST localhost:8188/prompt -H 'Content-Type: application/json' -d @5b_api.json | python3 -m json.tool
Troubleshooting: “Value not in list” on the loader nodes
This is the most common error with a new Wan 2.2 workflow. We sent the graph above to a server with no model files. The server rejected it before running anything:
{
"error": {
"type": "prompt_outputs_failed_validation",
"message": "Prompt outputs failed validation",
...
},
"node_errors": {
"39": {
"errors": [{"type": "value_not_in_list", "message": "Value not in list",
"details": "vae_name: 'wan2.2_vae.safetensors' not in ['pixel_space']"}],
"class_type": "VAELoader"
},
"38": {
"errors": [{"type": "value_not_in_list", "message": "Value not in list",
"details": "clip_name: 'umt5_xxl_fp8_e4m3fn_scaled.safetensors' not in []"}],
"class_type": "CLIPLoader"
},
"37": {
"errors": [{"type": "value_not_in_list", "message": "Value not in list",
"details": "unet_name: 'wan2.2_ti2v_5B_fp16.safetensors' not in []"}],
"class_type": "UNETLoader"
}
}
}The server log shows the same thing:
[ERROR] Failed to validate prompt for output 58:
[ERROR] * VAELoader 39:
[ERROR] - Value not in list: vae_name: 'wan2.2_vae.safetensors' not in ['pixel_space']
[ERROR] * CLIPLoader 38:
[ERROR] - Value not in list: clip_name: 'umt5_xxl_fp8_e4m3fn_scaled.safetensors' not in []
[ERROR] * UNETLoader 37:
[ERROR] - Value not in list: unet_name: 'wan2.2_ti2v_5B_fp16.safetensors' not in []
[ERROR] Output will be ignored
[WARNING] invalid prompt: {'type': 'prompt_outputs_failed_validation', ...}How to read it: the list after not in shows the files ComfyUI found in that folder. [] means the folder is empty. ['pixel_space'] is a built-in option of VAELoader, not a file. Fixes:
- Check the folder: the diffusion model goes in
models/diffusion_models(notcheckpoints), and the UMT5 encoder goes inmodels/text_encoders. - Check the exact file name. A browser may add
(1)to a second download, and then the name no longer matches. - Restart ComfyUI or refresh the page after adding files, so the lists are rebuilt.
- Check the VAE: the 5B model needs
wan2.2_vaeand the 14B models needwan_2.1_vae.
The model folders a current ComfyUI build creates:
/ComfyUI/models/checkpoints/
/ComfyUI/models/clip/
/ComfyUI/models/clip_vision/
/ComfyUI/models/diffusion_models/
/ComfyUI/models/loras/
/ComfyUI/models/text_encoders/
/ComfyUI/models/unet/
/ComfyUI/models/vae/
...Running Wan 2.2 on a small GPU
Settings you can change, all visible in the templates and node definitions above:
- Use 5B: per the ComfyUI guide, it fits on 8 GB of VRAM with ComfyUI’s built-in offloading.
- Use fp8 files for 14B: 14.29 GB per model instead of 28.58 GB for fp16. The text encoder also has an fp8 version (6.74 GB instead of 11.37 GB).
- Lower width, height and length: fewer pixels and frames mean less memory.
- Turn on the Lightning LoRA in the 14B template: 4 sampling steps instead of 20.
weight_dtypeon UNETLoader acceptsdefault,fp8_e4m3fn,fp8_e4m3fn_fastandfp8_e5m2. Use it to load an fp16 file in fp8.
If you only want still images from a local model, a simpler local tool such as Fooocus needs far less setup.
FAQ
Can Wan 2.2 run on CPU?
ComfyUI starts with --cpu and loads the Wan nodes, as in our test. Actually generating video that way was not tested here. With 10+ GB models and over 100 frames, plan on using an NVIDIA GPU.
Why does the 14B workflow have two models?
Wan 2.2 14B splits denoising into two stages. The high-noise model does the first steps (layout and motion), and the low-noise model finishes the details. In ComfyUI this is two KSamplerAdvanced nodes that share the step count and split it.
Where do I find the template?
Update ComfyUI and its comfyui-workflow-templates package, then open the template browser and search for Wan 2.2. The file names are video_wan2_2_5B_ti2v, video_wan2_2_14B_t2v, video_wan2_2_14B_i2v and video_wan2_2_14B_flf2v.