206 lines
6.3 KiB
Markdown
206 lines
6.3 KiB
Markdown
# Pipeline Parallelism Guide
|
|
|
|
## Table of Content
|
|
|
|
- [Overview](#overview)
|
|
- [Quick Start](#quick-start)
|
|
- [Example Script](#example-script)
|
|
- [Configuration Parameters](#configuration-parameters)
|
|
- [Best Practices](#best-practices)
|
|
- [Troubleshooting](#troubleshooting)
|
|
- [Summary](#summary)
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
Pipeline Parallelism splits the denoising transformer block-wise into sequential stages across GPUs. Each rank owns only
|
|
part of the transformer, which reduces per-GPU model memory and enables larger diffusion models to run across multiple
|
|
devices.
|
|
|
|
It can also be combined with other distributed methods such as CFG-Parallel, Tensor Parallelism, and Sequence
|
|
Parallelism.
|
|
|
|
See supported models list in [Supported Models](../../diffusion_features.md#supported-models).
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
### Basic Usage
|
|
|
|
Simplest working example:
|
|
|
|
```python
|
|
from vllm_omni import Omni
|
|
from vllm_omni.diffusion.data import DiffusionParallelConfig
|
|
from vllm_omni.inputs.data import OmniDiffusionSamplingParams
|
|
|
|
omni = Omni(
|
|
model="Wan-AI/Wan2.2-TI2V-5B-Diffusers",
|
|
parallel_config=DiffusionParallelConfig(
|
|
pipeline_parallel_size=2,
|
|
),
|
|
)
|
|
|
|
outputs = omni.generate(
|
|
{"prompt": "A cinematic drone shot over snowy mountains"},
|
|
OmniDiffusionSamplingParams(
|
|
num_inference_steps=40,
|
|
num_frames=81,
|
|
height=704,
|
|
width=1280,
|
|
),
|
|
)
|
|
```
|
|
|
|
---
|
|
|
|
## Example Script
|
|
|
|
### Offline Inference
|
|
|
|
Use python scripts under:
|
|
|
|
- `examples/offline_inference/text_to_video/text_to_video.py`
|
|
- `examples/offline_inference/image_to_video/image_to_video.py`
|
|
|
|
Text-to-video example:
|
|
|
|
```bash
|
|
python examples/offline_inference/text_to_video/text_to_video.py \
|
|
--model=Wan-AI/Wan2.2-TI2V-5B-Diffusers \
|
|
--width=1280 \
|
|
--height=704 \
|
|
--guidance-scale=5.0 \
|
|
--prompt="Two anthropomorphic cats in comfy boxing gear and bright gloves fight intensely on a spotlighted stage" \
|
|
--output=t2v_5B_pp2.mp4 \
|
|
--pipeline-parallel-size=2
|
|
```
|
|
|
|
Pipeline Parallelism can also be combined with CFG-Parallel:
|
|
|
|
```bash
|
|
python examples/offline_inference/text_to_video/text_to_video.py \
|
|
--model=Wan-AI/Wan2.2-TI2V-5B-Diffusers \
|
|
--width=1280 \
|
|
--height=704 \
|
|
--guidance-scale=5.0 \
|
|
--prompt="Two anthropomorphic cats in comfy boxing gear and bright gloves fight intensely on a spotlighted stage" \
|
|
--output=t2v_5B_pp2_cfg2.mp4 \
|
|
--pipeline-parallel-size=2 \
|
|
--cfg-parallel-size=2
|
|
```
|
|
|
|
### Online Serving
|
|
|
|
Enable Pipeline Parallelism in online serving:
|
|
|
|
```bash
|
|
# Default PP configuration
|
|
vllm serve Wan-AI/Wan2.2-TI2V-5B-Diffusers --omni --port 8091 --pipeline-parallel-size 2
|
|
|
|
# PP + CFG-Parallel
|
|
vllm serve Wan-AI/Wan2.2-TI2V-5B-Diffusers --omni --port 8091 \
|
|
--pipeline-parallel-size 2 \
|
|
--cfg-parallel-size 2
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration Parameters
|
|
|
|
In `DiffusionParallelConfig`
|
|
|
|
| Parameter | Type | Default | Description |
|
|
|--------------------------|------|---------|------------------------------------------------------------------------------------------------------------------|
|
|
| `pipeline_parallel_size` | int | 1 | Number of pipeline-parallel stages. Set to a value greater than 1 to split the denoising transformer across GPUs |
|
|
|
|
> [!NOTE]
|
|
> Total GPU count is the product of all enabled distributed dimensions, for example
|
|
`pipeline_parallel_size * cfg_parallel_size * tensor_parallel_size * ulysses_degree * ring_degree`.
|
|
|
|
### Manual Layer Partitioning
|
|
|
|
By default, transformer layers are distributed evenly across PP ranks. You can override this with the
|
|
`VLLM_PP_LAYER_PARTITION` environment variable to assign a specific number of layers to each rank:
|
|
|
|
```bash
|
|
# Example: 40 layers across 4 PP ranks, assigning 8 / 12 / 12 / 8 layers
|
|
export VLLM_PP_LAYER_PARTITION=8,12,12,8
|
|
```
|
|
|
|
The value must be a comma-separated list of integers whose length equals `pipeline_parallel_size` and whose sum equals
|
|
the total number of transformer layers. This is useful when you want to balance memory or compute asymmetrically across
|
|
ranks.
|
|
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
### When to Use
|
|
|
|
**Good for:**
|
|
|
|
- Large diffusion transformers that do not fit comfortably on one GPU
|
|
- Multi-GPU setups where reducing per-GPU model memory is more important than minimizing communication
|
|
- Combining with CFG-Parallel or other distributed methods on supported models
|
|
|
|
**Not for:**
|
|
|
|
- Single GPU setups
|
|
- Models that do not support Pipeline Parallelism
|
|
(check [supported models](../../diffusion_features.md#supported-models))
|
|
- Very small models where inter-stage communication overhead may outweigh the benefit
|
|
|
|
### Expected Behavior
|
|
|
|
Pipeline Parallelism primarily reduces per-GPU memory usage by splitting the transformer into stage-local blocks.
|
|
Depending on the model, topology, and resolution, it may also help execution fit into available hardware, but it is not
|
|
primarily a latency optimization.
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issue 1: No benefit from Pipeline Parallelism
|
|
|
|
**Symptoms**: PP is enabled, but latency does not improve or becomes slightly worse.
|
|
|
|
**Solutions**:
|
|
|
|
1. **Check your goal:**
|
|
|
|
```python
|
|
# PP is mainly for memory scaling, not guaranteed latency speedup
|
|
parallel_config = DiffusionParallelConfig(pipeline_parallel_size=2)
|
|
```
|
|
|
|
2. **Check model support:**
|
|
- Verify your model in [supported models](../../diffusion_features.md#supported-models)
|
|
- PP is currently validated only on selected pipelines
|
|
|
|
3. **Combine with other methods when appropriate:**
|
|
- PP can be combined with CFG-Parallel, Tensor Parallelism, or Sequence Parallelism on supported models
|
|
|
|
### Common Issue 2: PP pipeline fails at import
|
|
|
|
**Symptoms**: Importing a custom pipeline raises a `TypeError` about `CFGParallelMixin` or mixin order.
|
|
|
|
**Solutions**:
|
|
|
|
1. Inherit both mixins.
|
|
2. Put `PipelineParallelMixin` before `CFGParallelMixin` in the class base list.
|
|
3. Use `class YourPipeline(nn.Module, PipelineParallelMixin, CFGParallelMixin): ...` as the reference pattern.
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
1. ✅ **Enable Pipeline Parallelism** - Set `pipeline_parallel_size > 1` in `DiffusionParallelConfig`
|
|
2. ✅ **Use Supported Models** - Verify your model supports PP in
|
|
[supported models](../../diffusion_features.md#supported-models)
|
|
3. ✅ **Combine When Needed** - PP can be combined with CFG-Parallel and other distributed methods on supported pipelines
|
|
4. ✅ **Scale for Memory** - Use PP primarily to reduce per-GPU model memory and fit larger transformers
|