[diffusion] fix: fix temporary resolution workaround (#20046)

This commit is contained in:
xingsy97
2026-03-09 02:05:35 +08:00
committed by GitHub
parent 0ac6c63ae4
commit b77dd41db0
4 changed files with 42 additions and 26 deletions
@@ -6,7 +6,7 @@ This module provides generic sampling parameters that work with any diffusers pi
""" """
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import Any from typing import Any, ClassVar
from sglang.multimodal_gen.configs.sample.sampling_params import ( from sglang.multimodal_gen.configs.sample.sampling_params import (
DataType, DataType,
@@ -26,6 +26,9 @@ class DiffusersGenericSamplingParams(SamplingParams):
passed directly to the diffusers pipeline call. passed directly to the diffusers pipeline call.
""" """
_default_height: ClassVar[int] = 1024
_default_width: ClassVar[int] = 1024
# Override defaults with more conservative values that work across pipelines # Override defaults with more conservative values that work across pipelines
num_frames: int = 1 # default to image generation num_frames: int = 1 # default to image generation
height: int = 1024 height: int = 1024
@@ -44,9 +47,4 @@ class DiffusersGenericSamplingParams(SamplingParams):
else: else:
self.data_type = DataType.IMAGE self.data_type = DataType.IMAGE
if self.width is None: super().__post_init__()
self.width_not_provided = True
self.width = 1024
if self.height is None:
self.height_not_provided = True
self.height = 1024
@@ -2,25 +2,22 @@
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
from dataclasses import dataclass from dataclasses import dataclass
from typing import ClassVar
from sglang.multimodal_gen.configs.sample.sampling_params import SamplingParams from sglang.multimodal_gen.configs.sample.sampling_params import SamplingParams
@dataclass @dataclass
class FluxSamplingParams(SamplingParams): class FluxSamplingParams(SamplingParams):
_default_height: ClassVar[int] = 128 * 8 # default_sample_size * vae_scale_factor
_default_width: ClassVar[int] = 128 * 8
num_frames: int = 1 num_frames: int = 1
# Denoising stage # Denoising stage
guidance_scale: float = 1.0 guidance_scale: float = 1.0
negative_prompt: str = None negative_prompt: str = None
num_inference_steps: int = 50 num_inference_steps: int = 50
def __post_init__(self):
default_sample_size = 128
vae_scale_factor = 8
# FIXME
# self.height = default_sample_size * vae_scale_factor
# self.width = default_sample_size * vae_scale_factor
@dataclass @dataclass
class Flux2KleinSamplingParams(FluxSamplingParams): class Flux2KleinSamplingParams(FluxSamplingParams):
@@ -14,7 +14,7 @@ import unicodedata
import uuid import uuid
from dataclasses import dataclass from dataclasses import dataclass
from enum import Enum, auto from enum import Enum, auto
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any, ClassVar
from sglang.multimodal_gen.runtime.utils.logging_utils import init_logger from sglang.multimodal_gen.runtime.utils.logging_utils import init_logger
from sglang.multimodal_gen.utils import StoreBoolean, expand_path_fields from sglang.multimodal_gen.utils import StoreBoolean, expand_path_fields
@@ -123,11 +123,14 @@ class SamplingParams:
num_frames_round_down: bool = ( num_frames_round_down: bool = (
False # Whether to round down num_frames if it's not divisible by num_gpus False # Whether to round down num_frames if it's not divisible by num_gpus
) )
# Subclasses can set these to provide model-specific default resolutions.
# The base __post_init__ will apply them when height/width are not provided.
_default_height: ClassVar[int | None] = None
_default_width: ClassVar[int | None] = None
height: int | None = None height: int | None = None
width: int | None = None width: int | None = None
# NOTE: this is temporary, we need a way to know if width or height is not provided, or do the image resize earlier
height_not_provided: bool = False
width_not_provided: bool = False
fps: int = 24 fps: int = 24
# Resolution validation # Resolution validation
@@ -217,10 +220,10 @@ class SamplingParams:
def __post_init__(self) -> None: def __post_init__(self) -> None:
assert self.num_frames >= 1 assert self.num_frames >= 1
if self.width is None: if self.width is None and self._default_width is not None:
self.width_not_provided = True self.width = self._default_width
if self.height is None: if self.height is None and self._default_height is not None:
self.height_not_provided = True self.height = self._default_height
# Handle output_quality to output_compression conversion # Handle output_quality to output_compression conversion
if self.output_compression is None and self.output_quality is not None: if self.output_compression is None and self.output_quality is not None:
@@ -895,8 +898,6 @@ class SamplingParams:
sampling_params_fields = {attr.name for attr in dataclasses.fields(cls)} sampling_params_fields = {attr.name for attr in dataclasses.fields(cls)}
args_attrs = set(vars(args).keys()) args_attrs = set(vars(args).keys())
attrs = sampling_params_fields & args_attrs attrs = sampling_params_fields & args_attrs
args.height_not_provided = False
args.width_not_provided = False
return {attr: getattr(args, attr) for attr in attrs if hasattr(args, attr)} return {attr: getattr(args, attr) for attr in attrs if hasattr(args, attr)}
def output_file_path(self): def output_file_path(self):
@@ -927,8 +928,6 @@ class SamplingParams:
allow_override_protected or not is_protected_field allow_override_protected or not is_protected_field
): ):
setattr(self, field_name, user_value) setattr(self, field_name, user_value)
self.height_not_provided = user_params.height_not_provided
self.width_not_provided = user_params.width_not_provided
self.__post_init__() self.__post_init__()
@property @property
@@ -1,6 +1,10 @@
import math import math
import unittest import unittest
from sglang.multimodal_gen.configs.sample.diffusers_generic import (
DiffusersGenericSamplingParams,
)
from sglang.multimodal_gen.configs.sample.flux import FluxSamplingParams
from sglang.multimodal_gen.configs.sample.sampling_params import SamplingParams from sglang.multimodal_gen.configs.sample.sampling_params import SamplingParams
@@ -45,5 +49,23 @@ class TestSamplingParamsValidate(unittest.TestCase):
SamplingParams(boundary_ratio=math.nan) SamplingParams(boundary_ratio=math.nan)
class TestSamplingParamsSubclass(unittest.TestCase):
def test_flux_defaults_resolution_when_not_provided(self):
params = FluxSamplingParams()
self.assertEqual(params.height, 1024)
self.assertEqual(params.width, 1024)
def test_flux_preserves_user_resolution(self):
params = FluxSamplingParams(height=640, width=768)
self.assertEqual(params.height, 640)
self.assertEqual(params.width, 768)
def test_diffusers_generic_calls_base_post_init(self):
with self.assertRaises(AssertionError):
DiffusersGenericSamplingParams(num_frames=0)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()