108 lines
3.3 KiB
Python
108 lines
3.3 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
|
|
|
"""
|
|
Tests for FluxKontext model pipeline.
|
|
|
|
FluxKontext is a text-to-image and image-to-image diffusion model that supports:
|
|
- Text-to-image generation
|
|
- Image editing with text guidance
|
|
"""
|
|
|
|
import pytest
|
|
from PIL import Image
|
|
from vllm.assets.image import ImageAsset
|
|
|
|
from tests.helpers.runtime import OmniRunner
|
|
from vllm_omni.diffusion.data import DiffusionParallelConfig
|
|
from vllm_omni.inputs.data import OmniDiffusionSamplingParams
|
|
|
|
MODEL = "black-forest-labs/FLUX.1-Kontext-dev"
|
|
|
|
|
|
@pytest.mark.core_model
|
|
@pytest.mark.diffusion
|
|
def test_flux_kontext_text_to_image():
|
|
"""Test FluxKontext text-to-image generation with real model."""
|
|
with OmniRunner(
|
|
MODEL,
|
|
parallel_config=DiffusionParallelConfig(
|
|
tensor_parallel_size=2,
|
|
),
|
|
enable_cpu_offload=False,
|
|
) as runner:
|
|
omni_outputs = list(
|
|
runner.omni.generate(
|
|
prompts=["A photo of a cat sitting on a laptop"],
|
|
sampling_params_list=OmniDiffusionSamplingParams(
|
|
height=512,
|
|
width=512,
|
|
num_inference_steps=2,
|
|
seed=42,
|
|
),
|
|
)
|
|
)
|
|
|
|
assert len(omni_outputs) > 0
|
|
output = omni_outputs[0]
|
|
images = None
|
|
if output.images:
|
|
images = output.images
|
|
elif hasattr(output, "request_output") and output.request_output:
|
|
for stage_out in output.request_output:
|
|
if hasattr(stage_out, "images") and stage_out.images:
|
|
images = stage_out.images
|
|
break
|
|
|
|
assert images is not None
|
|
assert len(images) > 0
|
|
assert isinstance(images[0], Image.Image)
|
|
assert images[0].size == (512, 512)
|
|
|
|
|
|
@pytest.mark.core_model
|
|
@pytest.mark.diffusion
|
|
def test_flux_kontext_image_edit():
|
|
"""Test FluxKontext image-to-image editing with real model."""
|
|
input_image = ImageAsset("2560px-Gfp-wisconsin-madison-the-nature-boardwalk").pil_image.convert("RGB")
|
|
with OmniRunner(
|
|
MODEL,
|
|
parallel_config=DiffusionParallelConfig(
|
|
tensor_parallel_size=2,
|
|
),
|
|
enable_cpu_offload=False,
|
|
) as runner:
|
|
omni_outputs = list(
|
|
runner.omni.generate(
|
|
prompts=[
|
|
{
|
|
"prompt": "Transform this image into a Vincent van Gogh style painting",
|
|
"multi_modal_data": {"img2img": input_image},
|
|
"modalities": ["img2img"],
|
|
}
|
|
],
|
|
sampling_params_list=OmniDiffusionSamplingParams(
|
|
height=512,
|
|
width=512,
|
|
num_inference_steps=2,
|
|
seed=42,
|
|
),
|
|
)
|
|
)
|
|
|
|
assert len(omni_outputs) > 0
|
|
output = omni_outputs[0]
|
|
images = None
|
|
if output.images:
|
|
images = output.images
|
|
elif hasattr(output, "request_output") and output.request_output:
|
|
for stage_out in output.request_output:
|
|
if hasattr(stage_out, "images") and stage_out.images:
|
|
images = stage_out.images
|
|
break
|
|
|
|
assert images is not None
|
|
assert len(images) > 0
|
|
assert isinstance(images[0], Image.Image)
|
|
assert images[0].size == (512, 512)
|