Reject non-positive Flux2 Klein inference steps (#3717)

Signed-off-by: MmMaiIIi <2360655509@qq.com>
This commit is contained in:
JiaHong authored and GitHub committed 2026-05-19 11:52:41 +08:00
1 parent 3ac739817f
commit ca9fd0b71c
2 files changed
+124 -1

No files matched your search

@@ -0,0 +1,119 @@
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
from unittest.mock import MagicMock
import pytest
from vllm_omni.diffusion.models.flux2_klein.pipeline_flux2_klein import (
Flux2KleinPipeline,
)
from vllm_omni.inputs.data import OmniDiffusionSamplingParams
pytestmark = [pytest.mark.core_model, pytest.mark.cpu, pytest.mark.diffusion]
class _StopAfterCheckInputsError(Exception):
pass
def _make_pipeline():
pipeline = object.__new__(Flux2KleinPipeline)
pipeline.vae_scale_factor = 8
pipeline.is_distilled = True
pipeline._guidance_scale = 0.0
return pipeline
def _make_minimal_request(
prompt="valid prompt",
*,
num_inference_steps=None,
):
"""Build a minimal OmniDiffusionRequest-like object that forward() reads from."""
params = OmniDiffusionSamplingParams(
height=512,
width=512,
num_inference_steps=num_inference_steps,
seed=42,
)
req = MagicMock()
req.sampling_params = params
req.prompts = [prompt]
req.multi_modal_data = {}
return req
def _capture_num_inference_steps(pipe, steps):
"""Run pipe.forward() and capture the num_inference_steps passed to check_inputs."""
captured = {}
def fake_check_inputs(**kwargs):
captured["num_inference_steps"] = kwargs.get("num_inference_steps")
raise _StopAfterCheckInputsError
original = pipe.check_inputs
pipe.check_inputs = fake_check_inputs
try:
req = _make_minimal_request(num_inference_steps=steps)
pipe.forward(req)
except _StopAfterCheckInputsError:
pass
finally:
pipe.check_inputs = original
return captured.get("num_inference_steps")
# --- Forward resolution tests (the actual regression) ---
def test_forward_preserves_zero_not_default():
"""#3703: num_inference_steps=0 must reach validation as 0, not as default 50."""
pipe = _make_pipeline()
captured = _capture_num_inference_steps(pipe, 0)
assert captured == 0, f"Expected 0, got {captured}"
def test_forward_preserves_negative():
pipe = _make_pipeline()
captured = _capture_num_inference_steps(pipe, -1)
assert captured == -1
def test_forward_none_uses_default():
"""None means unset — forward() should substitute the pipeline default."""
pipe = _make_pipeline()
captured = _capture_num_inference_steps(pipe, None)
assert captured == 50
def test_forward_preserves_positive():
pipe = _make_pipeline()
captured = _capture_num_inference_steps(pipe, 9)
assert captured == 9
# --- check_inputs validation tests ---
@pytest.mark.parametrize("steps", [0, -1])
def test_check_inputs_rejects_non_positive(steps):
pipe = _make_pipeline()
with pytest.raises(ValueError):
pipe.check_inputs(
prompt="valid prompt",
height=512,
width=512,
num_inference_steps=steps,
)
def test_check_inputs_accepts_none():
pipe = _make_pipeline()
pipe.check_inputs(prompt="valid prompt", height=512, width=512, num_inference_steps=None)
@pytest.mark.parametrize("steps", [1, 2])
def test_check_inputs_accepts_positive(steps):
pipe = _make_pipeline()
pipe.check_inputs(prompt="valid prompt", height=512, width=512, num_inference_steps=steps)
@@ -865,7 +865,11 @@ class Flux2KleinPipeline(nn.Module, CFGParallelMixin, SupportImageInput, Diffusi
height = req.sampling_params.height or height
width = req.sampling_params.width or width
num_inference_steps = req.sampling_params.num_inference_steps or num_inference_steps
num_inference_steps = (
req.sampling_params.num_inference_steps
if req.sampling_params.num_inference_steps is not None
else num_inference_steps
)
sigmas = req.sampling_params.sigmas or sigmas
guidance_scale = (
req.sampling_params.guidance_scale if req.sampling_params.guidance_scale is not None else guidance_scale