Reelune
AI Video Generation Glossary: I2V, CFG, Steps and LoRA With Our Real Settings
25 terms. Each one with a definition, the value we actually run, and what happened when we changed it
- AI video glossary
- AI video generation terms
- CFG scale and steps explained
- ComfyUI terms
- Wan 2.2 settings
Reelune
Currently in the feed
Auto-pulled from the latest Plays. Refreshes as new videos publish.
Daylight in my space. Feeling this quiet confidence.
@eve-r
Wrapped in afternoon light, a gentle awakening
@akari-r
This rooftop glow, just for me
@maya-r
Dusk sky, this sense of freedom
@yuki-r
Noon light, just for myself
@wren-r
Wrapped in warmth, my quiet night
@remi-r
Wrapped in afternoon light, a peaceful moment
@maya-r
A spontaneous smile, bathed in soft studio light
@tala-r
There is no shortage of AI video glossaries that list definitions. This one is different: every term comes with the value our production pipeline actually uses, and what happened when we changed it. Where we did not measure something, we say so.
Start image vs. video: the settings we actually run
| Setting | Start image (SDXL) | Video (Wan 2.2 I2V) |
|---|---|---|
| Resolution | 832×1216 | 720×1280 (81 frames at 16 fps) |
| Steps | 30 | 4 (2 + 2) |
| CFG | 5.0 | 1.0 |
| Sampler / scheduler | dpmpp_sde / karras | euler / simple |
| Denoise | 1.0 | Split by step range |
| Face lock | PuLID at 0.85 | Inherited from the start image |
| Negative prompt | Applies | Effectively off at CFG 1.0 |
| Time | 11 to 12 s of raw generation | 124 s of sampling (Aug 2026) |
How to read this glossary
Terms are grouped by topic, and each group has a table with four columns.
| Column | What it contains |
|---|---|
| Term | The name you will see in a UI or config file |
| Meaning | A one-line definition |
| Our setting | The value running in production |
| What happened when we changed it | A measured result or a recorded incident. If we did not measure it, the cell says "not measured" or "unchanged" |
Every video on this site is made in two stages:
- Generate a start image with SDXL, with the face locked by PuLID
- Hand that image to Wan 2.2 I2V, which turns it into a clip of about five seconds
Almost every term below lives somewhere in those two stages.
All numbers were measured on a 32GB-VRAM GPU shared with other workloads. They will not transfer as-is to your hardware. What does transfer is where we looked and how we measured.
The skeleton: I2V, SDXL, ComfyUI, latent
| Term | Meaning | Our setting | What happened when we changed it |
|---|---|---|---|
| I2V / T2V | Video from an image (I2V) versus video from text alone (T2V) | I2V, using the Wan 2.2 I2V 14B model | We have never run T2V in production, so not measured |
| SDXL | A family of still-image models. Here it makes the start image | Photorealistic checkpoint, 832×1216, 30 steps | Dropping to 20 steps would save about 4 seconds, so we rejected it |
| ComfyUI workflow | A pipeline written as connected nodes, submittable as JSON | 19 nodes for the video workflow | We changed a setting and the running process kept the old value |
| Latent | A compressed working representation. Generation happens here, then it is decoded back to pixels | Passed between a high-noise and a low-noise model | Unchanged |
We use I2V because of faces. With text alone there is no reliable way to render the same character with the same face in every clip. So we lock the face in a still image first and let the video model focus on motion. The video inherits the start image's colours and look, which means most visual problems can be fixed at the image stage.
When we surveyed the landscape in July 2026, Wan's open weights stopped at 2.2; later versions were available only through an API. If you want to run on your own GPU, this combination is the realistic option.
In our pipeline the latent shows up twice: once when the start image is encoded into it, and once when the finished latent is decoded back into 81 frames. Sampling runs four steps in total. The high-noise model handles the first two and hands the latent over with its leftover noise intact; the low-noise model finishes the last two.
The most expensive ComfyUI lesson was not a setting. It was a change that never took effect. Right after we deployed a lower step count, the running process was not restarted and a stale cache was still being loaded, so the old step count kept running. The full story is in our write-up on cutting generation time.
- I2V: before fixing a visual problem in the video, ask whether the start image can fix it
- SDXL: measure raw generation time before cutting steps. Ours was 11 to 12 seconds at 30 steps
- ComfyUI: after any change, confirm it using the actual value printed in the log
- Latent: learn the word so you can tell "it failed during encode" apart from "it failed during decode"
Keeping faces consistent: PuLID, IPAdapter, LoRA, seed
| Term | Meaning | Our setting | What happened when we changed it |
|---|---|---|---|
| PuLID | Extracts facial features from one photo and injects them into generation | Weight 0.85, applied to the first 70% of the steps, fidelity mode | When it fails to load, faces break. A startup check alone was not enough |
| IPAdapter | Steers the look using an embedding of a reference image. Works on illustrations | Not used in photoreal production. 0.7 in our illustration tests | 0.5 was too weak; 0.9 flattened the image and froze the composition |
| LoRA | A small add-on that adjusts a model without retraining it | Not for characters: a 4-step distillation LoRA for speed, at strength 1.0 | After switching the base model to a lighter file format, LoRA-matched layers stayed at 607 → 607 |
| Seed | The random starting point. Same settings, different seed, different image | Random every time (1 to about 2.1 billion) | Pinned for comparisons. With tags alone, every seed gave a different face |
PuLID only works on photographic faces. It relies on a face detector built for real faces, so it cannot find a face in an illustration. That is why our illustration tests used IPAdapter instead; the comparison is in our article on keeping a character's face consistent. The image encoder IPAdapter needs turned out to be the same one our video stage already uses, so no extra download was required.
We stop PuLID at 70% of the steps so the base model owns the late steps. Facial structure is settled early; skin and lighting detail is settled late.
PuLID also has an operational trap. Once, a startup script on the GPU server had silently stopped working, and ComfyUI came up without the face-detection library PuLID depends on. PuLID failed to load (generation was paused at the time, so nothing was published). "ComfyUI started" and "faces come out right" are different claims, so before resuming we now generate one real image and look at the face.
We also avoid motions that take the face off camera. Only the start image carries the locked face. If the character spins around, the face that comes back is one the video model redrew, and the identity drifts.
LoRAs are usually introduced as a way to teach a model a character. The ones in our production workflow are distillation LoRAs that let the video model work in four steps: one for the high-noise model and one for the low-noise model, each at strength 1.0. PuLID already handles faces, so we have not trained a character LoRA.
When we switched the base model files from 26.6GB to a 13.3GB format, the worry was that the LoRA would stop attaching. So we counted the matched layers before and after, confirmed it was 607 in both cases, and only then made the switch.
- PuLID: generate one image and check the face before resuming. Avoid spinning motions
- IPAdapter: test a spread of weights such as 0.5, 0.7 and 0.9
- LoRA: after swapping a base model, check that the LoRA still attaches to the same number of layers
- Seed: pin it for comparisons, randomise it in production. Without pinning you cannot tell a real speed-up from a lucky, simpler image
Sampling: steps, CFG, sampler, shift, denoise
| Term | Meaning | Our setting | What happened when we changed it |
|---|---|---|---|
| Steps | How many iterations it takes to turn noise into an image | Video 4 (2 + 2), image 30 | Video went 10 → 8 → 4. At 4, motion completion and quality were equivalent |
| CFG | How strongly the prompt is enforced. Above 1.0, an "unconditioned" pass also runs every step | Video 1.0, image 5.0 | Video 2.0 → 1.0 halved the compute, but video-stage negative prompts stopped applying |
| Sampler / scheduler | How each iteration steps (sampler) and how noise is spread across steps (scheduler) | Video euler / simple, image dpmpp_sde / karras | Unchanged (not measured) |
| Shift | A correction that weights the schedule toward the high-noise steps | 5.0 | Changed 8.0 → 5.0 together with steps and CFG, so its own effect is not isolated |
| Denoise | How much of the starting state is destroyed with noise before regenerating | 1.0 for images (from scratch). Video splits stages by step range instead | Unchanged |
Steps and CFG multiply. Above CFG 1.0, every step runs twice: once with the prompt and once without. Our old setting, 8 steps at CFG 2.0, was 16 model passes. The current 4 steps at CFG 1.0 is 4.
Here is the measurement when we changed only CFG, from 2.0 to 1.0:
43% faster. But in that run a separate prompt bug was also present, so we could not judge quality fairly and held off on adopting it. We fixed the bug, re-measured with steps and shift included, and adopted the combined change after that.
A good speed number is not enough if something else broke the comparison. If you are no longer sure what you compared, the number is unusable.
"More steps means better quality" did not hold for a distilled model. The acceleration LoRA was built for four steps. Running eight was simply off the design point: twice the time, nothing gained.
The price of CFG 1.0 is that negative prompts no longer apply during the video stage. We accept that because negatives still apply when the start image is made, the video inherits that image's look, and every clip is reviewed by a person before publishing. In the production clips we checked right after rollout, we saw no harm from it.
Start from the sampler and scheduler pairing the model expects. Our image and video stages use different values because each follows its own model's standard setup. When we tested a separate illustration model, we gave it its own recommended Euler / normal / CFG 4.5 rather than reusing the photoreal settings, because that model breaks with them.
Later we had a chance to check the production settings of a comparable service. Its video settings, 720×1280 / 81 frames / 4 steps / CFG 1.0 / shift 5.0 / euler + simple, matched ours exactly. This is a standard configuration, not a quality-cutting special.
You may look for denoise in an I2V workflow and not find it. In ours, the start image is passed in as a condition, while the latent itself starts from noise. The split between the two models is set by step ranges ("from step 0 to 2", "from step 2 to 4"), not by denoise.
- Steps: if you use a distillation LoRA, start at the step count it was built for
- CFG: lowering it is fast but disables negatives. Make sure another safety net exists first
- Sampler / scheduler: start from the model's recommended pairing and do not mix without a reason
- Shift: change it alone, or you will never know what it did. We did not, and we still do not know
- Denoise: in I2V, this may not be the knob that controls how far the video drifts from the start image
Clip shape: frames, fps, resolution, VAE
| Term | Meaning | Our setting | What happened when we changed it |
|---|---|---|---|
| Frames / fps | How many frames are generated, and how many play per second | 81 frames at 16 fps = about 5.06 s | Length unchanged. The more actions we packed in, the more clips were rejected in review |
| Resolution / aspect ratio | Pixel dimensions and shape of the output | Video 720×1280 (vertical), start image 832×1216 | Dropping 720 to 640 would likely have cured a memory problem, but it lowers quality, so we did not |
| VAE | Converts between latents and pixels | The video VAE (Wan 2.1 VAE) | Encoding runs out of memory and falls back to a slow path, losing about 150 s every clip |
| Tiled decode | Runs the VAE on small tiles and chunks of frames | Tiles of 256 px (overlap 64), 64 frames at a time (overlap 8) | Before, a one-shot decode crashed the whole process. Now 10 to 20% slower, but stable |
81 frames at 16 fps is Wan 2.2's default, and we have not changed it. What we changed is what goes inside those five seconds. Clips with no change of action were rejected 44% of the time; clips with two changes, 62%. The more we packed in, the more we threw away. We now cap each clip at three actions.
Lower resolution makes many problems disappear. Encoding the start image into a latent normally takes a few seconds. Because VRAM is nearly full, it fails every time, retries with a slow tiled method, and takes 145 to 147 seconds as measured. Dropping to 640 would probably let the fast path fit, but we decided 150 seconds was not worth lower quality on every published clip.
We also considered "just encode with the tiled method from the start." But the tiled method is the slow part, so that would lock in 150 seconds permanently. The root cause is sharing the GPU with other workloads; it is the kind of waste that disappears on a dedicated GPU.
Decoding, on the other hand, is tiled from the start. Back when all 81 frames were decoded on the GPU at once, an out-of-memory warning was followed immediately by the whole ComfyUI process crashing. Tiled decode takes about 65 seconds and is 10 to 20% slower, but losing a clip to a crash costs more.
There is one inconsistency we have not fixed. Our start image is 832×1216 and our video is 720×1280, and those aspect ratios differ slightly. A mismatched image gets adjusted to fit at the video stage, so when we tested illustrations we generated the start image at 720×1280 directly. Our photoreal production path still uses 832×1216.
- Frames / fps: fewer actions per clip pass review more often. Cut the content before changing the length
- Resolution: lowering it fixes memory issues, at the cost of published quality
- VAE: use the log to separate encode time from decode time
- Tiled decode: if stability matters more than speed, turn it on before the first crash, not after
- Aspect ratio: match the start image to the video so your evaluations are not skewed by resizing
Prompts: length, negative prompts, negation
| Term | Meaning | Our setting | What happened when we changed it |
|---|---|---|---|
| Prompt length | Characters in the prompt. The longer it is, the weaker each word becomes | Target: positive under 500 characters, negative under 300 | Cut the median video positive from 799 to 576 characters |
| Negative prompt | A list of things you do not want in the output | Quality, black-and-white, moles, duplicate faces, each named by one or two representative words | Stuffing it with colour words made colour drift worse. We removed them |
| Negation ("no X") | Writing "no X" inside the positive prompt | Never used. Checked automatically | "no zoom" in camera directions slipped past the check and was in all 30 real jobs |
Text encoders in image models do not handle negation well. Write no wrinkles and the "no" is largely lost, while attention to wrinkles remains. Naming the thing you want to avoid in the positive prompt invites it.
In August 2026 we scanned our prompt text by machine. Character and wardrobe text contained 36 negations, and there were 55 self-contradictions where the positive asked for something the negative banned. None of them had been noticed when written.
| What we found | How we fixed it |
|---|---|
no zoom in camera directions | fixed focal length: describe the state you want |
| "mirror" in the negative, while 7 location descriptions on this site had mirrors | Removed "mirror" from the negative and banned the real concern, duplicate face, directly |
The mirror ban had been there to stop reflections from producing extra faces. Name the actual concern, and you do not have to kill the whole scene.
Colour was the counter-intuitive one. To fight colour shifting mid-clip, we packed the video negative with colour and lighting words covering 12 colours. Colour drift got worse. Our guess is that attention concentrated on the idea of colour itself (this is an inference, not measured). We removed all of it, went back to a minimal negative, and now control colour at the start image stage.
Some negatives did work. Characters described with a film-photo mood sometimes produced black-and-white start images. Adding monochrome and related words to the negative keeps every image in colour.
Moles are banned outright in the negative. They appear at random positions and at low frequency, so a character would have a mole in one clip and not the next, and stop looking like the same person. Freckles are allowed: they appear as a dense pattern, which reproduces reliably.
- Prompt length: ten synonyms work no better than the one or two most representative words. We cleaned up our safety terms on that basis
- Negative prompt: do not try to fix a colour problem with colour words
- Negation: do not name what you want to avoid; describe what you want
- Contradictions: clashes between positive and negative are invisible to the eye. Check them by machine
Time and memory: model loading, fp8, VRAM, OOM, queue
| Term | Meaning | Our setting | What happened when we changed it |
|---|---|---|---|
| Model loading | Reading model files and placing them on the GPU | Unload the image model, then load the video models, for every clip | Of a ~9-minute clip, about 290 s was loading and related work; sampling was 124 s |
| fp8 | Storing and computing weights in 8 bits. Faster on supporting GPUs | Compute in fp8_e4m3fn_fast, files in fp8_scaled | Fast mode: 77 → 54.5 s/it. Files: 26.6GB → 13.3GB |
| VRAM | Memory on the GPU | 32GB, shared with other workloads | 98% full; VAE encode ran out of memory 16 times |
| OOM | Out of memory. Causes failed jobs or a killed process | Planned restart once unreclaimable memory passes 45GiB | 4 kills in one day and 13 failed videos → planned restart takes 141 s and loses nothing |
| Batch / queue | Items processed at once / the line of waiting jobs | One image per run. New jobs are added every 5 minutes | "Restart when the queue is empty" never fired, because it never emptied |
In our August 2026 records, one video took about 9 minutes (504 to 572 seconds). Here is the time actually spent sampling next to model loading and related work:
Loading took more than twice as long as making the picture. Sampling was under a quarter of the whole clip. The remaining 90 to 158 seconds were not broken down in that record.
There is a structural reason loading is heavy. The image model and the two 14B video models cannot all sit in 32GB of VRAM at once, so for every clip we unload the image model after the start image and load the video models again.
When we measured a breakdown in June, loading was about 45 seconds, so this stage swings a lot. We have measured the same kind of swing for the start image: about 20 seconds when the GPU is free, 88 to 99 seconds when it is contended. We believe contention-driven reloading is the main cause, but we have not isolated it for the video stage (this is an inference).
When generation feels slow, the first suspects are usually the sampler and step count. At this point, halving sampling would have saved about one minute per clip. Look at the breakdown before the vocabulary.
fp8 is where we once wrote down something wrong. When we switched to the 13.3GB file format, we noted that memory pressure would ease. Measurements the next day proved that wrong: memory used by read-only mapped files can be discarded by the operating system when needed, so it was never the pressure point. The format change is justified by one thing only: computation was already running in fp8, so reading a file twice as large bought nothing.
OOM hit hardest on 26 August 2026. ComfyUI was killed four times in one day and 13 videos failed. The cause: ComfyUI did not know its memory limit. The real limit was 57GiB, but ComfyUI saw the whole machine's roughly 251GB, concluded there was plenty left, and kept piling models into RAM.
Things that looked like fixes but were not:
| Measure | Result |
|---|---|
| Calling the memory-free API | 29.3GiB → 29.3GiB, no change. It moves models from GPU to RAM |
--cache-ram (evict when free RAM runs low) | Never triggers, because free RAM is read from the whole machine |
--highvram (keep models on the GPU) | Backfires: VRAM was already 98% full |
--disable-smart-memory | Offloads aggressively to regular RAM, which increases RAM use |
What we adopted is a planned restart. When unreclaimable memory passes a threshold, the worker stops taking new jobs, lets the running job finish, and then ComfyUI restarts.
Downtime is 141 seconds, far cheaper than a crash that throws away a clip of about 12 minutes.
The queue design failed twice before this. First, "restart when the queue is empty" never fired: the worker grabs the next job the instant one finishes, so the queue is never empty, and memory reached 46.6GiB without a restart. Now the worker pauses intake once the threshold is crossed, which guarantees a gap. Second, a threshold set too low restarts after every one or two clips, so it sits at 45GiB rather than 34GiB.
Batch size is one image per run. Requesting images one at a time pays for model loading each time; we measured that in our article on keeping a character's face consistent (96.5 seconds for the first image, 6.1 seconds for each after).
- Model loading: when two large models take turns on one GPU, loading can outweigh sampling
- fp8: the file format and the compute format are different things. Work out which one is doing the work
- VRAM: do not just check free space; find which stage runs out
- OOM: before calling a memory-free API, check whether it reduces RAM or adds to it
- Queue: "do X when idle" never happens on a queue that is never idle
Before you change a setting: the method behind the glossary
Twenty-five terms, but the process for changing any of them is short.
- Measure the breakdown by stage. Sampling can be under a quarter of the total
- Change one thing at a time. Pin the seed, start image and prompt. We changed shift together with other values and still cannot separate its effect
- Start at the model's design point. Four steps for a four-step distillation, the recommended sampler if there is one
- Write down what you lose before you gain speed. CFG 1.0 costs you negative prompts
- Confirm the change from the actual value in the log. Editing a setting and having it take effect are different things
- Do not solve prompt problems by adding words. Check negations and contradictions by machine
Definitions are a search away. What happens when you change a value is something only your own measurements can tell you. The numbers here are ours: our GPU, our models, our level of contention.
Characters in the cast
FAQ
Doesn't a higher CFG make the output follow the prompt more closely?
That is the usual explanation, but our video stage runs at 1.0. The four-step distillation LoRA is designed for CFG 1.0, and dropping from 2.0 gave equivalent quality. The trade-off is that negative prompts stop applying in the video stage, so we rely on the start image stage and on human review before publishing.
Will more steps improve quality?
Not with a distilled model. We went from 10 to 8 to 4 steps on the video stage. Comparing the most motion-heavy case with the start image, prompt and seed pinned, 4 steps matched on both motion completion and quality. Steps beyond the design point only cost time.
Why shouldn't I write "no X" in a prompt?
The text encoder does not handle negation well, so attention to X remains while the "no" is lost. When we scanned our prompt text we found 36 negations and rewrote them to describe the desired state directly, for example replacing "no zoom" with "fixed focal length".
ComfyUI ran out of memory. What should I check first?
Separate VRAM from RAM, and separate VAE encode from decode. Switching decode to tiled mode stopped our crashes. The memory-free API only moved models from the GPU into RAM, so it did nothing for a RAM shortage.
Why I2V instead of T2V?
To keep the same character with the same face. We lock the face in a still image first and then animate it, so colour and appearance also carry over from that image. We have not run T2V in production, so we have no measured comparison.
Can I copy these settings directly?
Optimal values change with the GPU, model and resolution. Ours come from a 32GB-VRAM GPU shared with other workloads. What transfers directly is the method: measure the breakdown, change one thing at a time, and confirm the change took effect.
Open the feed
Related





