Files
vllm-omni/vllm_omni/diffusion/offloader/__init__.py
T
2026-02-27 14:52:15 +08:00

81 lines
2.5 KiB
Python

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
import torch
from vllm.logger import init_logger
from vllm_omni.diffusion.data import OmniDiffusionConfig
from vllm_omni.platforms import current_omni_platform
from .base import OffloadBackend, OffloadConfig, OffloadStrategy
from .layerwise_backend import LayerWiseOffloadBackend
from .sequential_backend import (
ModelLevelOffloadBackend,
apply_sequential_offload,
remove_sequential_offload,
)
logger = init_logger(__name__)
__all__ = [
"OffloadBackend",
"OffloadConfig",
"OffloadStrategy",
"LayerWiseOffloadBackend",
"ModelLevelOffloadBackend",
"apply_sequential_offload",
"remove_sequential_offload",
"get_offload_backend",
]
def get_offload_backend(
od_config: OmniDiffusionConfig,
device: torch.device | None = None,
) -> OffloadBackend | None:
"""Create appropriate offload backend based on configuration.
Args:
od_config: OmniDiffusionConfig with offload settings
device: Target device (auto-detected if None)
Returns:
OffloadBackend instance or None if offloading disabled
Example:
>>> backend = get_offload_backend(od_config, device=torch.device("cuda:0"))
>>> if backend:
... backend.enable(pipeline)
"""
# Extract and validate configuration
config = OffloadConfig.from_od_config(od_config)
# Return None if no offloading requested
if config.strategy == OffloadStrategy.NONE:
return None
# Validate platform (CUDA required for now)
if not current_omni_platform.supports_cpu_offload() or current_omni_platform.get_device_count() < 1:
logger.warning(
"Current device: %s does not support CPU offloading. Skipping offloading.",
current_omni_platform.get_device_name(),
)
return None
# Detect device if not provided
if device is None:
try:
device = current_omni_platform.get_torch_device()
except (NotImplementedError, AttributeError) as exc:
logger.error("Failed to detect device: %s. Skipping offloading.", exc)
return None
# Create appropriate backend
if config.strategy == OffloadStrategy.MODEL_LEVEL:
return ModelLevelOffloadBackend(config, device)
elif config.strategy == OffloadStrategy.LAYER_WISE:
return LayerWiseOffloadBackend(config, device)
else:
logger.error("Unknown offload strategy: %s", config.strategy)
return None