[diffusion] chore: use model-aware vae channels_last_3d policy (#26214)

This commit is contained in:
Mick
2026-05-25 00:25:34 +08:00
committed by GitHub
parent 36eb72bf12
commit 5c3775823e
6 changed files with 147 additions and 9 deletions
+3 -3
View File
@@ -56,7 +56,7 @@ if TYPE_CHECKING:
# model loading
SGLANG_USE_RUNAI_MODEL_STREAMER: bool = True
SGLANG_DIFFUSION_FLASHINFER_FP4_GEMM_BACKEND: str | None = None
SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D: bool = True
SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D: str = "auto"
SGLANG_USE_CUDA_HUNYUANVIDEO_GROUP_NORM_SILU: bool = False
SGLANG_USE_ROCM_VAE: bool = False
SGLANG_USE_ROCM_CUDNN_BENCHMARK: bool = False
@@ -250,8 +250,8 @@ environment_variables: dict[str, Callable[[], Any]] = {
# If set, sgl_diffusion will enable stage logging, which will print the time
# taken for each stage
"SGLANG_DIFFUSION_STAGE_LOGGING": _lazy_bool("SGLANG_DIFFUSION_STAGE_LOGGING"),
"SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D": _lazy_bool(
"SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D", "true"
"SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D": _lazy_str(
"SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D", "auto"
),
# ================== cache-dit Env Vars ==================
# Enable cache-dit acceleration for DiT inference
@@ -60,7 +60,9 @@ def _convert_conv3d_weights_to_channels_last_3d(module: nn.Module) -> int:
return num_converted
def _should_use_channels_last_3d(server_args: ServerArgs, component_name: str) -> bool:
def _should_use_channels_last_3d(
server_args: ServerArgs | None, component_name: str
) -> bool:
if component_name not in (
"vae",
"video_vae",
@@ -68,9 +70,18 @@ def _should_use_channels_last_3d(server_args: ServerArgs, component_name: str) -
return False
override = os.getenv(VAE_CHANNELS_LAST_3D_ENV)
if override is None or override.strip().lower() == "auto":
if override is not None and override.strip().lower() != "auto":
return get_bool_env_var(VAE_CHANNELS_LAST_3D_ENV)
if server_args is None:
return False
pipeline_name = server_args.pipeline_config.__class__.__name__
if pipeline_name.startswith("QwenImage"):
return True
return get_bool_env_var(VAE_CHANNELS_LAST_3D_ENV)
if "Wan" in pipeline_name and server_args.num_gpus == 1:
return True
return False
class VAELoader(ComponentLoader):
@@ -15,7 +15,9 @@ from sglang.multimodal_gen.test.server.accuracy_utils import (
)
from sglang.multimodal_gen.test.server.component_accuracy import AccuracyEngine
VAE_CHANNELS_LAST_3D_PARITY_CASE_IDS = {"wan2_1_t2v_1.3b"}
VAE_CHANNELS_LAST_3D_PARITY_CASE_IDS = {
"wan2_1_t2v_1.3b",
}
VAE_CHANNELS_LAST_3D_PARITY_CASES = [
case
for case in ACCURACY_ONE_GPU_CASES
@@ -15,7 +15,9 @@ from sglang.multimodal_gen.test.server.accuracy_utils import (
)
from sglang.multimodal_gen.test.server.component_accuracy import AccuracyEngine
VAE_CHANNELS_LAST_3D_PARITY_CASE_IDS = {"wan2_2_i2v_a14b_2gpu"}
VAE_CHANNELS_LAST_3D_PARITY_CASE_IDS = {
"wan2_2_i2v_a14b_2gpu",
}
VAE_CHANNELS_LAST_3D_PARITY_CASES = [
case
for case in ACCURACY_TWO_GPU_CASES
@@ -33,7 +33,7 @@ if TYPE_CHECKING:
logger = init_logger(__name__)
SGL_TEST_FILES_CI_DATA_REVISION = "5b728ad6dee869c0c720ef3b668ac7a0d98b0f9a"
SGL_TEST_FILES_CI_DATA_REVISION = "b7455318873fc5af399c8447b3bb0d9471a5084c"
SGL_TEST_FILES_CONSISTENCY_GT_ROOT = (
"https://raw.githubusercontent.com/"
f"sgl-project/ci-data/{SGL_TEST_FILES_CI_DATA_REVISION}/"
@@ -3,12 +3,40 @@ from unittest.mock import patch
import torch
from sglang.multimodal_gen.runtime.loader.component_loaders import vae_loader
from sglang.multimodal_gen.runtime.loader.component_loaders.vae_loader import (
_backfill_ltx2_audio_vae_latent_stats,
_should_use_channels_last_3d,
)
from sglang.multimodal_gen.runtime.models.vaes.parallel import wan_common_utils
class _FakeServerArgs:
def __init__(self, pipeline_config, num_gpus=1):
self.pipeline_config = pipeline_config
self.num_gpus = num_gpus
class QwenImagePipelineConfig:
pass
class WanT2V480PConfig:
pass
class FastWan2_2_TI2V_5B_Config:
pass
class Wan2_2_I2V_A14B_Config:
pass
class LTX2PipelineConfig:
pass
class TestVAELoader(unittest.TestCase):
def test_backfill_ltx2_audio_vae_latent_stats_maps_official_keys(self):
loaded = {
@@ -45,6 +73,101 @@ class TestVAELoader(unittest.TestCase):
self.assertNotIn("latents_mean", loaded)
self.assertNotIn("latents_std", loaded)
def test_channels_last_3d_defaults_true_for_qwen_image_on_cuda(self):
with (
patch.dict("os.environ", {}, clear=True),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(QwenImagePipelineConfig())
self.assertTrue(_should_use_channels_last_3d(server_args, "vae"))
def test_channels_last_3d_defaults_true_for_single_gpu_wan_on_cuda(self):
with (
patch.dict("os.environ", {}, clear=True),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(WanT2V480PConfig(), num_gpus=1)
self.assertTrue(_should_use_channels_last_3d(server_args, "video_vae"))
def test_channels_last_3d_defaults_true_for_single_gpu_fast_wan_on_cuda(self):
with (
patch.dict("os.environ", {}, clear=True),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(FastWan2_2_TI2V_5B_Config(), num_gpus=1)
self.assertTrue(_should_use_channels_last_3d(server_args, "video_vae"))
def test_channels_last_3d_defaults_false_for_multi_gpu_wan_on_cuda(self):
with (
patch.dict("os.environ", {}, clear=True),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(Wan2_2_I2V_A14B_Config(), num_gpus=2)
self.assertFalse(_should_use_channels_last_3d(server_args, "video_vae"))
def test_channels_last_3d_defaults_false_for_ltx_on_cuda(self):
with (
patch.dict("os.environ", {}, clear=True),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(LTX2PipelineConfig(), num_gpus=2)
self.assertFalse(_should_use_channels_last_3d(server_args, "video_vae"))
def test_channels_last_3d_can_be_disabled_by_env(self):
with (
patch.dict(
"os.environ", {"SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D": "false"}
),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(QwenImagePipelineConfig())
self.assertFalse(_should_use_channels_last_3d(server_args, "vae"))
def test_channels_last_3d_can_be_enabled_by_env(self):
with (
patch.dict("os.environ", {"SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D": "true"}),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(LTX2PipelineConfig(), num_gpus=2)
self.assertTrue(_should_use_channels_last_3d(server_args, "video_vae"))
def test_channels_last_3d_auto_uses_model_policy(self):
with (
patch.dict("os.environ", {"SGLANG_DIFFUSION_VAE_CHANNELS_LAST_3D": "auto"}),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
wan_args = _FakeServerArgs(WanT2V480PConfig(), num_gpus=1)
ltx_args = _FakeServerArgs(LTX2PipelineConfig(), num_gpus=2)
self.assertTrue(_should_use_channels_last_3d(wan_args, "video_vae"))
self.assertFalse(_should_use_channels_last_3d(ltx_args, "video_vae"))
def test_channels_last_3d_skips_non_video_vae_components(self):
with (
patch.dict("os.environ", {}, clear=True),
patch.object(vae_loader.current_platform, "is_cuda", return_value=True),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(QwenImagePipelineConfig())
self.assertFalse(_should_use_channels_last_3d(server_args, "audio_vae"))
def test_channels_last_3d_skips_unsupported_platforms(self):
with (
patch.dict("os.environ", {}, clear=True),
patch.object(vae_loader.current_platform, "is_cuda", return_value=False),
patch.object(vae_loader.current_platform, "is_rocm", return_value=False),
):
server_args = _FakeServerArgs(QwenImagePipelineConfig())
self.assertFalse(_should_use_channels_last_3d(server_args, "vae"))
@unittest.skipUnless(
hasattr(torch, "channels_last_3d"), "channels_last_3d is unavailable"
)