← Writing
videoJuly 23, 2026 · 20 min read

16.8× faster video generation: distilling Wan 2.2 from 40 steps to 4

A public, no-training LoRA cuts Wan 2.2 A14B from 809 s to 48 s per clip on one A100 (16.8×), held across 13 scenes. The full path to that number: the evaluation-count budget that set the target, the distilled output that came back washed-out, the color grade that half-fixed it, and the checkpoint swap that fixed it for free.

16.8×faster video generation on Wan 2.2809 s48 s

A single five-second clip from Wan 2.2 takes about 13 minutes on an A100. Not 13 minutes because the model is written badly, but because the default recipe runs a 14-billion-parameter network 80 times to draw one clip. Once we traced the cost to that number, the only lever worth pulling was cutting it, and the cleanest way to do that was a distillation trained against this exact model. We adopted one, ran it four times instead of 80, and the clip dropped to 48 seconds. That is 16.8× end-to-end, with no training, no data, and no custom kernel. This post is the whole path to that number, including the byte and evaluation budget that set the target, the distilled output that first came back flat, the two color fixes, and the checkpoint swap that made one of them unnecessary.

40 steps · 809 s
4 steps · 48 s16.8×
Wan 2.2 A14B, 480×832, 81 frames, one A100. Same fox, same prompt, same seed: 40-step base (left) against the 4-step distilled model (right).
16.8×
end-to-end
809 s → 48 s per clip
4
denoising steps
down from 40
13
scenes, fixed seed
no cherry-picking, no best-of-N

Where the 13 minutes go

Before touching the recipe, the question is what the 13 minutes are actually spent on. Wan 2.2 A14B is a dual-expert video diffusion transformer. Two separate 14-billion-parameter networks split the denoising trajectory: a high-noise expert lays out scene, composition, and motion over the early steps, then a low-noise expert takes over at step 26 of 40 to resolve texture and fine detail. About 27 billion parameters sit on disk; roughly 14 billion are active at any one step. A 480×832, 81-frame clip is 32,760 tokens, and attention over that sequence is about 73% of each step’s compute.

Wan 2.2 A14B denoising schedule, native T2V: two separate 14B networks, one hard switch at step 26. The distilled model compresses the same trajectory into 4 steps.
high-noise layout expertsteps 1–26
low-noise detail expertsteps 27–40

None of the size figures are where the time goes. The dominant cost is not how heavy one step is, it is how many steps run and how many times each one evaluates the network. The default is 40 denoising steps. Classifier-free guidance runs the network twice per step, once with the prompt and once without, then extrapolates between the two. Forty steps times two passes is 80 full evaluations of a 14-billion-parameter network for one five-second clip.

That reframes the problem cleanly. When the workload is “run this 14-billion-parameter network N times,” the lever that dwarfs every other is cutting N. A faster attention kernel shaves a slice off each of the 80 evaluations. Cutting the count removes evaluations outright. The target is the 80, not the per-step math.

Network evaluations per five-second clip
Base (40 steps × CFG)80 evals
Distilled (4 steps, no CFG)4 evals · 20× fewer
Why 80 evaluations, not 40?

Classifier-free guidance runs the network twice at every step. One pass conditions on the text prompt, one drops it, and the sampler pushes the result away from the unconditional prediction to sharpen prompt adherence: guided = uncond + scale · (cond − uncond). That doubling is what makes prompts actually bind, so the base model cannot switch it off without losing fidelity. Forty steps therefore cost 40 × 2 = 80 forward passes, not 40. Removing CFG is worth a clean 2× the moment a model no longer needs it, which is exactly what the distilled adapter arranges.

The lever: cut the evaluation count

There are two ways to cut the evaluation count, and they are not equal. The first is to run the base model at fewer steps, and it fails. The 40-step count is baked into this model’s noise schedule and its expert-switch point, so below 40 steps each step has to cover a larger jump than the model was trained to take, and detail and temporal stability fall apart. (The step sweep later in this post makes that concrete, with the base model at 12 steps buying only 3.3× and already looking visibly worse.) Fewer steps only works when the model was trained to take bigger jumps. A model that lands a clip in four large jumps instead of forty small ones is a distilled model, and the same distillation folds the guidance direction into the student, so the CFG doubling falls away with it. Distillation cuts N on both axes at once, the step count and the CFG pass, which is the only route that reaches an order of magnitude.

That left one decision, whether to train a distillation ourselves or adopt one. Training a video distillation is a data-and-compute project in its own right, and a public one already existed, trained against this exact checkpoint. Wan2.2-Lightning is an Apache-2.0 distillation of this model, a rank-64 LoRA for each of the two experts, produced by Phased-DMD. We judged it the right artifact to build on, adopted it, and validated it against the 40-step base. Integrating it took no training, no data, and no new kernel. We load one adapter per expert, switch the sampler to UniPC with a flow shift of 5, set guidance_scale to 1.0, and run four steps.

The win is two multiplicative cuts, both structural. Forty steps become four, which is 10×. guidance_scale at 1.0 turns classifier-free guidance off, because the distilled model was trained not to need it, which is another 2×. Eighty network evaluations become four, 20× fewer. That is the entire mechanism: integrate an artifact built for this exact checkpoint, and stop paying for a doubling the model no longer uses.

How a few-step student learns to skip 90% of the steps

The teacher is the 40-step model. Distribution-matching distillation (the DMD family) trains a student to produce, in very few steps, samples whose distribution matches the teacher’s, rather than matching the teacher step for step. Phased-DMD does this in phases across the noise schedule, so one student can cover the whole trajectory in 4 steps. Two details make it drop in here. It ships as a rank-64 LoRA per expert, so the base weights are untouched and the adapter is a few hundred MB rather than a re-trained 14B network. And the distillation folds the guidance direction into the student, so guidance_scale=1.0 already produces prompt-bound output. Because it was trained against this specific checkpoint, it needs no calibration to load.

What the sampler swap actually changes

Three settings move together, and all three follow from the distillation rather than being hand-tuned. The scheduler switches to UniPC, a multi-step solver that stays stable at the very low step counts where a plain DDIM or Euler schedule falls apart. The flow shift is set to 5, redistributing where the four steps land along the noise schedule so more resolution goes to the high-noise layout phase. And guidance_scale is 1.0, disabling CFG. The Lightning adapter was trained under exactly this configuration, so these are the settings that match the artifact, not free parameters to sweep.

It holds across 13 scenes

One clip proves nothing, and a good result on one lucky prompt proves less. The comparison below is 13 deliberately varied scenes: water, fire, faces, a crowd, aerials, food, fast motion. Every clip is the first generation at a fixed seed, no prompt tuning, no best-of-N. The 40-step base is on the left, the 4-step distilled model on the right.

The first distilled clips came back flat

Speed was the easy part. The first distilled clips looked worse. Side by side with the 40-step base, the early Lightning V1.1 output was flat and washed-out: striped logs instead of glowing wood, cool flames where the base had warm ones, muted embers. The motion and structure were right; the warmth, glow, and fine detail were gone. That is a real quality regression, and it had to be dealt with before the speed number meant anything.

The first thing to settle was how to score it at all. The instinct is a perceptual metric like LPIPS or PSNR against the base clip. That is the wrong tool here, and not for convenience.

Why quality is judged by eye here, and not with LPIPS or PSNR

A pixel or feature-distance metric measures how close two clips are. That only means something when one clip is supposed to reconstruct the other. The distilled sampler does not reconstruct the base clip. Starting from the same seed, a 4-step UniPC trajectory and a 40-step trajectory pass through different intermediate states and land on different pixels: the 4-step clip is a valid independent sample from the model, not an approximation of one specific 40-step render. LPIPS or PSNR against the base would score legitimate trajectory divergence as error, and would reward a model that merely blurred toward the base. With no reconstruction target, the only fair evaluation is to show both clips and judge warmth, glow, and detail directly. That is a reasoned choice, not a missing experiment.

The loss had a specific shape, and the shape said where to look. A four-step trajectory spends almost all of its budget placing scene, composition, and motion, the work of the high-noise expert, and barely reaches the long low-noise tail where the base resolves color and fine texture over its final 14 steps. So what went missing was warmth, glow, and detail, not structure, which is exactly what the clips showed. That pointed the first fixes at color and contrast, judged on the campfire scene where the lost warmth was most obvious.

The cheapest hypothesis was that the distilled clip was only darker and lower in contrast, a plain exposure offset. If that were it, tone_match would fix it: a per-clip correction of luma and exposure, nudging the distilled clip’s brightness and contrast toward the base. It was not enough. Matching exposure does not restore color the shorter trajectory never produced, and the clips stayed flat. That ruled out an exposure offset and said the color itself was missing.

So the fix escalated to a richer post-hoc color grade: per-channel level adjustment, CLAHE for local contrast, and a saturation boost. On the campfire that was a clear win. The ambers came back, the flames read as warm orange, the embers glowed. Rich grading beat tone-matching outright.

Base · 40 stepsthe warmth to match
V1.1 · 4 steps, rawflat, washed-out
V1.1 · 4 steps + rich gradeambers back
V2.0 · 4 steps, no grade · pickwarmth for free
Campfire, 4-step distilled. The flat V1.1 output, the two fixes it took, and where V2.0 lands with no grade at all.

A post-hoc grade is a per-clip patch, though, tuned by hand for one look and redone for the next. Better to remove the problem at the source, so we tested whether a newer distillation did. Lightning V2.0 does exactly that. It recovers most of what V1.1 lost, the warmth, the glow, the detail, at the identical four-step wall-clock, with no color grade and no extra compute. Diagnosing the flat output and finding the checkpoint that removed it is the work here. The color grade still stands for cases that want a specific look, but the default answer became run V2.0 and skip the grade.

How many steps do you actually need?

16.8× is the endpoint of a spectrum, not the only setting. Sweeping step count and checkpoint on the campfire scene traces the real speed/quality frontier: from the untouched 40-step base, down through the base run at fewer steps, to the 4-step distilled model, with a hybrid in between that spends compute to sit closer to the base’s exact look.

Base · 40 steps719 s · 1×
Base · 20 steps362 s · 2×
Base · 12 steps221 s · 3.3×
Hybrid: draft + refine199 s · 3.6×
V2.0 · 8 steps82 s · 8.8×
V2.0 · 4 steps · pick44 s · 16×
V1.1 · 4 steps44 s · 16×
Campfire across the step/checkpoint spectrum, fire-scene representative timings. V2.0 at 4 steps is the pick.
Speedup over the 40-step base, campfire scene (719 s baseline)
Base · 40 steps1.0× · 719 s
Base · 20 steps2.0× · 362 s
Base · 12 steps3.3× · 221 s
Hybrid draft + refine3.6× · 199 s
V2.0 · 8 steps8.8× · 82 s
V1.1 · 4 steps16× · 44 s
V2.0 · 4 steps16× · 44 s · pick

Read as a frontier, two things stand out. Halving the base steps from 40 to 20 buys only 2×, and 40 to 12 only 3.3×, with visible quality loss by 12 steps: the base model degrades ungracefully below its default step count. The distilled adapter is what unlocks the order of magnitude. Between the two distilled checkpoints, V2.0 dominates V1.1 at equal cost. The hybrid is the single point that buys back base-exact texture, at 3.6×.

Why the base model degrades so fast below 40 steps

The 40-step count is baked into the base model’s noise schedule and its expert-switch point. Drop to 20 or 12 steps without distillation, and each step now covers a larger jump along the noise schedule than the model was trained to take, so the sampler accumulates discretization error the model was never taught to correct. Detail and temporal stability go first. That is why base-20 and base-12 buy 2× and 3.3× but look worse, while the distilled model runs 4 steps cleanly: it was explicitly trained to take those large jumps. Fewer steps only works when the model knows it is taking them.

The hybrid: a 4-step draft, then a base refine

The hybrid trades speed for fidelity to the base look. It generates a fast 4-step distilled draft, then hands that draft to the base low-noise (detail) expert as a video-to-video pass at low denoising strength, through WanVideoToVideoPipeline. The draft fixes composition and motion cheaply; the base expert repaints texture on top. It lands at 199 s, 3.6× over the 40-step base. It was skipped at first as “needs pipeline work,” then built once the video-to-video path was confirmed to run clean. It is the quality-first point on the curve, for when a clip has to match the base’s exact texture rather than only look as good.

Speed/quality frontier across the step/checkpoint spectrum, campfire representative timings. Visual quality is an ordinal read against the 40-step base look, not a metric; V2.0 at 4 steps is the pick.
Base · 40 stepsBase · 20 stepsBase · 12 stepsHybrid draft + refineV2.0 · 8 stepsV2.0 · 4 stepsV1.1 · 4 stepsspeedup ×visual quality (ordinal)

What we learned, and the next lever

Three findings travel with the number, and each one points somewhere.

  • Judging by eye is the right call, and a deliberate one. A distilled model takes its own trajectory from the seed, so there is no reconstruction target and no meaningful LPIPS or PSNR to report for it. Direct visual judgement is the correct evaluation here, not a metric standing in for one, and the gallery above is 13 first-generation pairs precisely so that judgement sits in the open rather than behind one clip.
  • The bottleneck has moved, and we know where it went. Once the transformer is ~17× faster, the fixed costs stop hiding. The VAE decoder and the text encoder run once regardless of step count, and they are now the largest remaining pieces of the 48 seconds, and the gap between the measured 16.8× and the 20× the evaluation count predicts. That makes the next lever concrete: a light VAE decoder (TAEHV or LightTAE) plus cached text embeddings, not another cut to the DiT.

Where this ranks

This is the single largest lever in the inference work, by a wide margin. The Gemma-4 decoding stack reached 2.34× by moving fewer weight bytes and taking fewer decode passes; the Wan attention and cache kernels reached 1.3–1.8× each. Cutting the video model’s network-evaluation count reached 16.8×, and it cost no training at all.

Headline speedup by lever, same body of inference work
Wan two-expert step cache (kernel)1.78×
Gemma-4 LLM decode (FP8 + native MTP)2.34×
Wan 2.2 video distillation (this post)16.8× · 4 evals, no training

The recipe was the same as everywhere else in the stack: find the quantity the cost is proportional to, cut that quantity, and verify against the real 40-step default rather than a strawman. Here the quantity was network evaluations, the cut was 80 to 4, and the artifact that reached it was public and built for this exact checkpoint. Our contribution was the judgement and the integration. We deduced that the evaluation count was the only lever that mattered, chose and validated the distillation, caught the washed-out first output and diagnosed it before it shipped, and proved the number against the base. The same method has already found the next number. With the transformer this cheap, the VAE decoder and the text encoder are the largest cost left in the 48 seconds, and they are the next cut.