2026-04-02 00:42:50 -07:00
# VACE Video Generation
2026-05-28 14:45:45 +08:00
Generate videos from text prompts, images, or video conditions using vLLM-Omni's VACE diffusion pipeline.
2026-04-02 00:42:50 -07:00
2026-05-28 14:45:45 +08:00
- `vace_video_generation.py` : command-line script for multi-mode video generation with advanced options.
2026-04-02 00:42:50 -07:00
2026-05-28 14:45:45 +08:00
## Table of Contents
- [Overview ](#overview )
- [Quick Start ](#quick-start )
- [Key Arguments ](#key-arguments )
- [More CLI Examples ](#more-cli-examples )
## Overview
[VACE ](https://github.com/ali-vilab/VACE ) (Video All-in-one Creation Engine) supports multiple video tasks through a single unified model, including text-to-video, image-to-video, first-last-frame interpolation, inpainting, and reference image-guided generation.
### Supported Models
| Model | Architecture | Peak VRAM (GiB) * | Model Weights (GiB) | HuggingFace |
|-------|-------------|-------------------|---------------------|-------------|
| Wan2.1-VACE (1.3B) | Wan2.1 | TBD | ~10 | [Wan-AI/Wan2.1-VACE-1.3B-diffusers ](https://huggingface.co/Wan-AI/Wan2.1-VACE-1.3B-diffusers ) |
| Wan2.1-VACE (14B) | Wan2.1 | TBD | ~38 | [Wan-AI/Wan2.1-VACE-14B-diffusers ](https://huggingface.co/Wan-AI/Wan2.1-VACE-14B-diffusers ) |
!!! info
*Peak VRAM: based on basic single-card usage, 480x832 resolution, 81 frames, 30 inference steps, without any acceleration/optimization features.
Default model: `Wan-AI/Wan2.1-VACE-14B-diffusers`
## Quick Start
### Python API
Text-to-video generation:
```python
import torch
from vllm_omni.entrypoints.omni import Omni
from vllm_omni.inputs.data import OmniDiffusionSamplingParams
if __name__ == "__main__" :
omni = Omni ( model = "Wan-AI/Wan2.1-VACE-1.3B-diffusers" )
prompt = "A sleek robot stands in a vast warehouse filled with boxes"
outputs = omni . generate (
prompt ,
OmniDiffusionSamplingParams (
height = 480 ,
width = 832 ,
num_frames = 81 ,
num_inference_steps = 30 ,
guidance_scale = 5.0 ,
),
)
video = outputs [ 0 ] . images
from diffusers.utils import export_to_video
export_to_video ( list ( video [ 0 ]), "t2v_output.mp4" , fps = 16 )
omni . close ()
```
### Local CLI Usage
2026-04-02 00:42:50 -07:00
```bash
python vace_video_generation.py \
--mode t2v \
--prompt "A sleek robot stands in a vast warehouse filled with boxes" \
--height 480 --width 832 --num-frames 81 \
--output t2v_output.mp4
```
2026-05-28 14:45:45 +08:00
## Key Arguments
| Argument | Type | Default | Description |
| -------- | ---- | ------- | ----------- |
| `--mode` | str | `"t2v"` | VACE task mode: `t2v` , `i2v` , `v2lf` , `flf2v` , `inpaint` , `r2v` |
| `--model` | str | `"Wan-AI/Wan2.1-VACE-14B-diffusers"` | Model ID or local path |
| `--prompt` | str | `"A cat walking in a garden"` | Text description of desired video |
| `--negative-prompt` | str | `""` | Negative prompt for classifier-free guidance |
| `--image` | str | `None` | Input image path (for I2V, R2V, FLF2V, inpaint modes) |
| `--last-image` | str | `None` | Last frame image path (for FLF2V mode) |
| `--height` | int | `480` | Output video height in pixels (should be a multiple of 16) |
| `--width` | int | `832` | Output video width in pixels (should be a multiple of 16) |
| `--num-frames` | int | `81` | Number of video frames to generate |
| `--num-inference-steps` | int | `30` | Number of denoising steps (more steps = higher quality, slower) |
| `--guidance-scale` | float | `5.0` | Classifier-free guidance scale |
| `--flow-shift` | float | `5.0` | Scheduler flow shift parameter |
| `--seed` | int | `42` | Random seed for deterministic sampling |
| `--fps` | int | `16` | Frames per second for the saved MP4 |
| `--output` | str | `"vace_output.mp4"` | Path to save the generated video |
| `--vae-use-tiling` | flag | on | Enable VAE tiling for memory optimization |
| `--cfg-parallel-size` | int | `1` | Set to `2` to enable CFG Parallel |
| `--ulysses-degree` | int | `1` | Ulysses sequence parallel degree for multi-GPU inference |
| `--ring-degree` | int | `1` | Ring sequence parallel degree for hybrid Ulysses + Ring inference |
| `--tensor-parallel-size` | int | — | Tensor parallel size |
| `--enforce-eager` | flag | off | Disable torch.compile |
> If you encounter OOM errors, try `--vae-use-tiling` or multi-GPU parallelism options (`--ulysses-degree`, `--cfg-parallel-size`).
## More CLI Examples
### Image-to-Video (I2V)
2026-04-02 00:42:50 -07:00
First frame is kept, remaining frames are generated:
```bash
python vace_video_generation.py \
--mode i2v \
--image astronaut.jpg \
--prompt "An astronaut emerging from a cracked egg on the moon" \
--height 480 --width 832 --num-frames 81 \
--output i2v_output.mp4
```
2026-05-28 14:45:45 +08:00
### First-Last-Frame Interpolation (FLF2V)
2026-04-02 00:42:50 -07:00
```bash
python vace_video_generation.py \
--mode flf2v \
--image first_frame.jpg --last-image last_frame.jpg \
--prompt "A bird takes off from a branch and lands on another" \
--height 512 --width 512 --num-frames 81 \
--output flf2v_output.mp4
```
2026-05-28 14:45:45 +08:00
### Inpainting
2026-04-02 00:42:50 -07:00
Center vertical stripe is masked and regenerated:
```bash
python vace_video_generation.py \
--mode inpaint \
--image scene.jpg \
--prompt "Shrek walks out of a building" \
--height 480 --width 832 --num-frames 81 \
--output inpaint_output.mp4
```
2026-05-28 14:45:45 +08:00
### Reference Image-guided (R2V)
2026-04-02 00:42:50 -07:00
```bash
python vace_video_generation.py \
--mode r2v \
--image reference.jpg \
--prompt "Camera slowly zooms out from the character" \
--height 480 --width 832 --num-frames 81 \
--output r2v_output.mp4
```