73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
|
|
|
"""
|
|
System test for Ulysses sequence parallel backend.
|
|
|
|
This test verifies that Ulysses-SP (DeepSpeed Ulysses Sequence Parallel) works
|
|
correctly with diffusion models. It uses minimal settings to keep test time
|
|
short for CI.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
import torch
|
|
|
|
# ruff: noqa: E402
|
|
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
if str(REPO_ROOT) not in sys.path:
|
|
sys.path.insert(0, str(REPO_ROOT))
|
|
|
|
from vllm_omni import Omni
|
|
from vllm_omni.diffusion.data import DiffusionParallelConfig
|
|
from vllm_omni.diffusion.distributed.parallel_state import device_count
|
|
from vllm_omni.diffusion.envs import get_device_name
|
|
|
|
os.environ["VLLM_TEST_CLEAN_GPU_MEMORY"] = "1"
|
|
|
|
# Use random weights model for testing
|
|
models = ["riverclouds/qwen_image_random"]
|
|
|
|
|
|
@pytest.mark.parametrize("model_name", models)
|
|
@pytest.mark.parametrize("ulysses_degree", [1, 2])
|
|
@pytest.mark.parametrize("ring_degree", [1])
|
|
def test_sequence_parallel(model_name: str, ulysses_degree: int, ring_degree: int):
|
|
"""Test SP (Ulysses-SP + Ring-SP) backend with diffusion model."""
|
|
# Skip if not enough GPUs available
|
|
if device_count() < ulysses_degree:
|
|
pytest.skip(f"Test requires {ulysses_degree} GPUs but only {device_count()} available")
|
|
|
|
# Configure sequence parallel with DiffusionParallelConfig
|
|
parallel_config = DiffusionParallelConfig(ulysses_degree=ulysses_degree, ring_degree=ring_degree)
|
|
|
|
m = Omni(
|
|
model=model_name,
|
|
parallel_config=parallel_config,
|
|
)
|
|
|
|
# Use minimal settings for fast testing
|
|
height = 256
|
|
width = 256
|
|
num_inference_steps = 4 # Minimal steps for fast test
|
|
|
|
images = m.generate(
|
|
"a photo of a cat sitting on a laptop keyboard",
|
|
height=height,
|
|
width=width,
|
|
num_inference_steps=num_inference_steps,
|
|
guidance_scale=0.0,
|
|
generator=torch.Generator(get_device_name()).manual_seed(42),
|
|
num_outputs_per_prompt=1, # Single output for speed
|
|
)
|
|
|
|
# Verify generation succeeded
|
|
assert images is not None
|
|
assert len(images) == 1
|
|
# Check image size
|
|
assert images[0].width == width
|
|
assert images[0].height == height
|