# Flowblending Video Inference

> Accelerate video generation by allocating smaller models to intermediate diffusion timesteps and larger models to capacity-critical early and late stages. Achieves 1.65x speedup and 57% FLOP reduction while maintaining visual quality. Use when video generation latency or computational cost is critical and you have multiple model sizes available.

- Skill: `adu2021/flowblending-video-inference` (Agent Skill)
- Install (CLI): `npx skillmds@latest add adu2021/flowblending-video-inference`
- Raw SKILL.md: https://api.skillmd.com/api/skills/adu2021/flowblending-video-inference/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: MIT
- Author: adu2021 (https://skillmd.com/u/adu2021)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/adu2021/flowblending-video-inference

---


## When to Use This Skill

- Video generation inference where latency is critical (streaming, interactive applications)
- Scenarios with strict computational budgets (edge devices, cloud costs)
- Deployments with multiple model checkpoints (small, base, large)
- Batch processing where throughput matters more than per-sample latency
- Quality-conscious workflows where efficiency shouldn't hurt visual results

## When NOT to Use This Skill

- Single-model deployments without size variants
- Real-time generation where step count itself is the bottleneck (use faster diffusion instead)
- Situations requiring deterministic, reproducible results per timestep
- Models where architecture significantly changes across sizes

## Core Insight

Video diffusion models operate over many timesteps (typically 30-100). But not all timesteps are equal:

```
Diffusion timeline (noise → clean):
t=100 ──→ t=50 ──→ t=25 ──→ t=1

Stage mapping:
Early (t=100-75):    Capacity CRITICAL (removing large-scale corruption)
Middle (t=75-25):    Capacity NEGLIGIBLE (fine-tuning already-good samples)
Late (t=25-1):       Capacity CRITICAL (detail synthesis, temporal coherence)
```

Early and late stages solve hard problems (large-scale structure, fine details). Middle stages just refine—a small model does fine here.

## Velocity-Divergence Analysis

The paper identifies capacity needs using velocity-divergence—a measure of how much the predicted velocity field changes in spatial regions:

- **High divergence**: Regions where predictions vary greatly across model capacities
  - Early stages: Large objects entering/leaving → divergence high
  - Late stages: Fine details → divergence high
- **Low divergence**: Predictions stable regardless of capacity
  - Middle stages: Content mostly determined, just denoising noise → divergence low

This analysis informs which stages can safely use smaller models.

## Architecture Pattern

```python
# FlowBlending multi-model inference strategy
class FlowBlendingVideoGenerator:
    def __init__(self, model_small, model_base, model_large, config):
        self.models = {
            'small': model_small,    # ~0.5B parameters
            'base': model_base,      # ~2B parameters
            'large': model_large     # ~8B parameters
        }
        self.config = config

    def generate_with_flow_blending(self, prompt, num_steps=50):
        """Adaptive model selection based on timestep"""
        x_t = torch.randn(batch_size, channels, height, width)

        for step in range(num_steps):
            # Determine which model to use based on timestep
            stage = self.identify_stage(step, num_steps)
            model = self.select_model_for_stage(stage)

            # Denoise step with selected model
            noise_pred = model.predict_noise(
                x_t,
                timestep=step,
                prompt_embedding=self.encode_prompt(prompt)
            )

            # Update: x_t ← denoise(x_t, noise_pred, step)
            x_t = self.diffusion_step(x_t, noise_pred, step)

        return x_t

    def identify_stage(self, current_step, total_steps):
        """Map timestep to stage (early, middle, late)"""
        progress = current_step / total_steps
        if progress < 0.3:  # First 30% of steps
            return 'early'
        elif progress < 0.7:  # Middle 40% of steps
            return 'middle'
        else:  # Final 30% of steps
            return 'late'

    def select_model_for_stage(self, stage):
        """Choose model size for capacity requirements"""
        if stage == 'early':
            return self.models['large']   # Largest capacity needed
        elif stage == 'middle':
            return self.models['small']   # Small sufficient
        else:  # late
            return self.models['large']   # Largest capacity needed for details

    def diffusion_step(self, x_t, noise_pred, step):
        """Standard DDIM/DDPM update step"""
        alpha = self.get_alpha(step)
        alpha_prev = self.get_alpha(step - 1)
        sigma = self.get_sigma(step)

        # Predicted original sample
        x_0_pred = (x_t - torch.sqrt(1 - alpha) * noise_pred) / torch.sqrt(alpha)

        # Update
        x_prev = (torch.sqrt(alpha_prev) * x_0_pred +
                 torch.sqrt(1 - alpha_prev) * noise_pred)
        return x_prev
```

## Empirical Performance Results

From the paper, tested on LTX-Video and WAN 2.1 models:

| Metric | Large Only | FlowBlending | Improvement |
|--------|---|---|---|
| Speed (frames/sec) | 0.6 fps | 1.0 fps | **1.65x faster** |
| FLOPs per sample | 1.0 | 0.4265 | **57.35% reduction** |
| LPIPS (visual quality) | 0.082 | 0.084 | -2.4% (negligible) |
| Temporal coherence | 0.91 | 0.89 | -2.2% (acceptable) |

Key: Performance gains with minimal quality loss.

## Stage Transitions and Smoothness

Switching models between stages could cause artifacts. The paper addresses this:

1. **Overlapping transitions**: Use larger model for 2-3 steps overlapping stage boundaries
2. **Momentum-based blending**: Smooth predictions from both models at boundaries
3. **Consistency regularization**: Ensure predictions don't diverge across model switch

```python
def smooth_stage_transition(self, step, num_steps):
    """Smooth model switching at stage boundaries"""
    progress = step / num_steps
    transition_width = 0.05  # 5% overlap on each side of boundary

    early_boundary = 0.30
    late_boundary = 0.70

    if abs(progress - early_boundary) < transition_width:
        # Near early→middle boundary: blend models
        weight_large = 1.0 - (progress - (early_boundary - transition_width)) / transition_width
        return self.blend_models(self.models['large'], self.models['small'], weight_large)
    # ... similar for middle→late boundary
```

## Velocity-Divergence Computation

To determine stage thresholds for your own models:

```python
def compute_velocity_divergence_analysis(model_small, model_base, model_large, prompts, num_steps=50):
    """Analyze where capacity matters"""
    divergence_by_step = []

    for step in range(num_steps):
        divergences = []
        for prompt in prompts:
            x_random = torch.randn(...)  # Same noise for fair comparison

            # Get predictions from each model
            pred_small = model_small.predict(x_random, step, prompt)
            pred_base = model_base.predict(x_random, step, prompt)
            pred_large = model_large.predict(x_random, step, prompt)

            # Compute divergence as variance of predictions
            all_preds = torch.stack([pred_small, pred_base, pred_large])
            divergence = torch.var(all_preds, dim=0).mean()
            divergences.append(divergence)

        avg_divergence = torch.stack(divergences).mean()
        divergence_by_step.append(avg_divergence)

    # Find inflection points: where divergence is low
    low_divergence_steps = [i for i, d in enumerate(divergence_by_step) if d < threshold]
    return divergence_by_step, low_divergence_steps
```

## Trade-offs and Limitations

| Aspect | Trade-off |
|--------|-----------|
| **Quality** | 2-3% visual quality loss vs. large-only is typical |
| **Consistency** | Temporal coherence slightly reduced at model switches |
| **Flexibility** | Requires multiple model sizes (not all apps have this) |
| **Complexity** | Stage detection + blending adds ~5% overhead |
| **Benefit** | 1.5-1.7x speedup justifies the trade for most use cases |

## Composability with Other Techniques

FlowBlending stacks with other acceleration approaches:

| Technique | Combination | Result |
|---|---|---|
| **Flash Diffusion** | Use faster schedules within stages | +1.5x speedup (combined: 2.5x) |
| **Quantization** | Quantize smaller models more aggressively | +1.2x speedup (combined: 2.0x) |
| **Knowledge distillation** | Distill large→small at stage level | Better small model → 2.0x speedup |
| **Early stopping** | Skip late stages for draft-quality | +2x speedup, -10% quality |

## Implementation Checklist

- Multiple model size checkpoints available (or create via distillation)
- Analyze velocity divergence for your models/domain
- Define stage boundaries (typically: 0-30%, 30-70%, 70-100%)
- Implement smooth transitions between models
- Profile real latency gains on your hardware
- Evaluate on visual quality metrics (LPIPS, temporal coherence, semantic consistency)

## When It Doesn't Help

FlowBlending shows diminishing returns when:
- Already using very fast inference techniques (e.g., latent diffusion)
- Model capacity is bottleneck (use faster architectures instead)
- Memory is the constraint (can't fit multiple models)
- Quality is absolute priority (accept longer latency)

## References

- Original paper: https://arxiv.org/abs/2512.24724
- Related: LTX-Video, WAN 2.1, consistency models, progressive distillation
- Velocity field: Velocity-scaled score matching in diffusion models

