[Feat] Support MagCache (#1287)
Signed-off-by: Lancer <maruixiang6688@gmail.com> Co-authored-by: 汪志鹏 <wangzhipeng628@gmail.com> Co-authored-by: Gao Han <hgaoaf@connect.ust.hk>
This commit is contained in:
13 files changed
+1677
-11
No files matched your search
+148
@@ -19,6 +19,7 @@ from vllm_omni.diffusion.cache.cache_dit_backend import (
|
||||
CUSTOM_DIT_ENABLERS,
|
||||
CacheDiTBackend,
|
||||
)
|
||||
from vllm_omni.diffusion.cache.magcache.backend import MagCacheBackend
|
||||
from vllm_omni.diffusion.cache.selector import get_cache_backend
|
||||
from vllm_omni.diffusion.cache.teacache.backend import TeaCacheBackend
|
||||
from vllm_omni.diffusion.data import DiffusionCacheConfig
|
||||
@@ -313,3 +314,150 @@ class TestCacheSelector:
|
||||
"""Test getting invalid backend raises error."""
|
||||
with pytest.raises(ValueError, match="Unsupported cache backend"):
|
||||
get_cache_backend("invalid_backend", {})
|
||||
|
||||
|
||||
class TestMagCacheBackend:
|
||||
"""Test MagCacheBackend implementation."""
|
||||
|
||||
from vllm_omni.diffusion.cache.magcache.backend import MagCacheBackend
|
||||
|
||||
def test_init(self):
|
||||
"""Test initialization."""
|
||||
config = DiffusionCacheConfig(mag_threshold=0.1, mag_max_skip_steps=2, mag_calibrate=True)
|
||||
backend = MagCacheBackend(config)
|
||||
assert backend.config.mag_threshold == 0.1
|
||||
assert backend.config.mag_max_skip_steps == 2
|
||||
assert backend.enabled is False
|
||||
|
||||
@patch("vllm_omni.diffusion.cache.magcache.backend.apply_mag_cache_hook")
|
||||
def test_enable(self, mock_apply_hook):
|
||||
"""Test enabling MagCache on pipeline."""
|
||||
mock_pipeline = Mock()
|
||||
mock_pipeline.__class__.__name__ = "FluxPipeline"
|
||||
mock_transformer = Mock()
|
||||
mock_transformer.__class__.__name__ = "FluxTransformer2DModel"
|
||||
mock_pipeline.transformer = mock_transformer
|
||||
|
||||
mock_ratios = [1.0] * 28
|
||||
config = DiffusionCacheConfig(
|
||||
mag_ratios=mock_ratios,
|
||||
)
|
||||
backend = MagCacheBackend(config)
|
||||
backend.enable(mock_pipeline)
|
||||
|
||||
assert backend.enabled is True
|
||||
mock_apply_hook.assert_called_once()
|
||||
|
||||
call_args = mock_apply_hook.call_args
|
||||
assert call_args[0][0] == mock_transformer
|
||||
|
||||
@patch("vllm_omni.diffusion.cache.magcache.backend.apply_mag_cache_hook")
|
||||
def test_enable_with_calibration(self, mock_apply_hook):
|
||||
"""Test enabling MagCache in calibration mode."""
|
||||
mock_pipeline = Mock()
|
||||
mock_pipeline.__class__.__name__ = "FluxPipeline"
|
||||
mock_transformer = Mock()
|
||||
mock_transformer.__class__.__name__ = "FluxTransformer2DModel"
|
||||
mock_pipeline.transformer = mock_transformer
|
||||
|
||||
config = DiffusionCacheConfig(
|
||||
mag_calibrate=True,
|
||||
)
|
||||
backend = MagCacheBackend(config)
|
||||
backend.enable(mock_pipeline)
|
||||
|
||||
assert backend.enabled is True
|
||||
mock_apply_hook.assert_called_once()
|
||||
|
||||
def test_refresh(self):
|
||||
"""Test refreshing MagCache state calls enable when not registered."""
|
||||
mock_pipeline = Mock()
|
||||
mock_pipeline.__class__.__name__ = "FluxPipeline"
|
||||
mock_transformer = Mock()
|
||||
mock_transformer.__class__.__name__ = "FluxTransformer2DModel"
|
||||
mock_pipeline.transformer = mock_transformer
|
||||
|
||||
mock_transformer.named_children = Mock(return_value=[])
|
||||
|
||||
mock_ratios = [1.0] * 28
|
||||
config = DiffusionCacheConfig(
|
||||
mag_ratios=mock_ratios,
|
||||
)
|
||||
backend = MagCacheBackend(config)
|
||||
|
||||
assert backend._registered is False
|
||||
backend.refresh(mock_pipeline, num_inference_steps=50)
|
||||
assert backend._registered is True
|
||||
|
||||
def test_is_enabled(self):
|
||||
"""Test is_enabled method."""
|
||||
mock_ratios = [1.0] * 28
|
||||
config = DiffusionCacheConfig(mag_ratios=mock_ratios)
|
||||
backend = MagCacheBackend(config)
|
||||
assert backend.is_enabled() is False
|
||||
|
||||
def test_get_mag_cache_backend(self):
|
||||
"""Test getting MagCache backend via selector."""
|
||||
mock_ratios = [1.0] * 28
|
||||
config_dict = {
|
||||
"mag_ratios": mock_ratios,
|
||||
"num_inference_steps": 28,
|
||||
"threshold": 0.06,
|
||||
"max_skip_steps": 3,
|
||||
"retention_ratio": 0.2,
|
||||
}
|
||||
backend = get_cache_backend("mag_cache", config_dict)
|
||||
assert backend is not None
|
||||
assert isinstance(backend, MagCacheBackend)
|
||||
assert backend.config.threshold == 0.06
|
||||
|
||||
@patch("vllm_omni.diffusion.cache.magcache.backend.apply_mag_cache_hook")
|
||||
def test_enable_single_block(self, mock_apply_hook):
|
||||
"""Test enabling MagCache on single transformer block."""
|
||||
mock_pipeline = Mock()
|
||||
mock_pipeline.__class__.__name__ = "FluxPipeline"
|
||||
|
||||
mock_block = Mock()
|
||||
mock_block.__class__.__name__ = "FluxTransformer2DModel"
|
||||
mock_blocks = [mock_block]
|
||||
|
||||
mock_transformer = Mock()
|
||||
mock_transformer.__class__.__name__ = "FluxTransformer2DModel"
|
||||
mock_transformer.blocks = mock_blocks
|
||||
mock_pipeline.transformer = mock_transformer
|
||||
|
||||
mock_ratios = [1.0] * 28
|
||||
config = DiffusionCacheConfig(
|
||||
mag_ratios=mock_ratios,
|
||||
)
|
||||
backend = MagCacheBackend(config)
|
||||
backend.enable(mock_pipeline)
|
||||
|
||||
assert backend.enabled is True
|
||||
mock_apply_hook.assert_called_once()
|
||||
|
||||
call_args = mock_apply_hook.call_args
|
||||
assert call_args[0][0] == mock_transformer
|
||||
|
||||
@patch("vllm_omni.diffusion.cache.magcache.backend.apply_mag_cache_hook")
|
||||
def test_enable_multi_block(self, mock_apply_hook):
|
||||
"""Test enabling MagCache on multiple transformer blocks."""
|
||||
mock_pipeline = Mock()
|
||||
mock_pipeline.__class__.__name__ = "FluxPipeline"
|
||||
|
||||
mock_blocks = [Mock() for _ in range(24)]
|
||||
|
||||
mock_transformer = Mock()
|
||||
mock_transformer.__class__.__name__ = "FluxTransformer2DModel"
|
||||
mock_transformer.blocks = mock_blocks
|
||||
mock_pipeline.transformer = mock_transformer
|
||||
|
||||
mock_ratios = [1.0] * 28
|
||||
config = DiffusionCacheConfig(
|
||||
mag_ratios=mock_ratios,
|
||||
)
|
||||
backend = MagCacheBackend(config)
|
||||
backend.enable(mock_pipeline)
|
||||
|
||||
assert backend.enabled is True
|
||||
mock_apply_hook.assert_called_once()
|
||||
Reference in new issue
Block a user