Files
vllm-omni/vllm_omni/engine/diffusion_engine.py
T

133 lines
4.2 KiB
Python
Raw Normal View History

2025-09-28 22:09:13 +08:00
"""Diffusion engine adapters for diffusers-backed DiT stages."""
from __future__ import annotations
2025-09-28 21:58:48 +08:00
from typing import Any, Optional
from ..config import DiTConfig
from ..worker.gpu_diffusion_worker import (
DiffusionGPUWorker,
DiffusionRunnerOutput,
)
class DiffusionEngine:
2025-09-28 22:09:13 +08:00
"""Base diffusion engine storing shared DiT configuration."""
2025-09-28 21:58:48 +08:00
def __init__(
self,
dit_config: DiTConfig,
2025-09-28 22:09:13 +08:00
model_path: Optional[str] = None,
2025-09-28 21:58:48 +08:00
log_stats: bool = False,
2025-09-28 22:09:13 +08:00
multiprocess_mode: bool = False,
2025-09-28 21:58:48 +08:00
) -> None:
self.dit_config = dit_config
2025-09-28 22:09:13 +08:00
model_cfg = getattr(dit_config, "model_config", None)
config_model_path = None
if model_cfg is not None:
if isinstance(model_cfg, dict):
config_model_path = (
model_cfg.get("model")
or model_cfg.get("model_path")
)
else:
config_model_path = (
getattr(model_cfg, "model", None)
or getattr(model_cfg, "model_path", None)
)
self.model_path = model_path or config_model_path
2025-09-28 21:58:48 +08:00
self.model_config = dit_config.model_config
self.cache_config = dit_config.dit_cache_config
self.height = dit_config.height
self.width = dit_config.width
self.num_inference_steps = dit_config.num_inference_steps
self.guidance_scale = dit_config.guidance_scale
2025-09-28 22:09:13 +08:00
2025-09-28 21:58:48 +08:00
self.log_stats = log_stats
self.multiprocess_mode = multiprocess_mode
2025-09-28 22:09:13 +08:00
def generate(self, *args, **kwargs): # pragma: no cover - placeholder
2025-09-28 21:58:48 +08:00
raise NotImplementedError("This method should be implemented in subclasses.")
class DiffusersPipelineEngine(DiffusionEngine):
2025-09-28 22:09:13 +08:00
"""Adapter that invokes a diffusers pipeline via DiffusionGPUWorker."""
2025-09-28 21:58:48 +08:00
def __init__(
self,
dit_config: DiTConfig,
2025-09-28 22:09:13 +08:00
model_path: Optional[str] = None,
2025-09-28 21:58:48 +08:00
log_stats: bool = False,
2025-09-28 22:09:13 +08:00
multiprocess_mode: bool = False,
2025-09-28 21:58:48 +08:00
) -> None:
2025-09-28 22:09:13 +08:00
super().__init__(dit_config, model_path, log_stats, multiprocess_mode)
resolved_model_path = self.model_path
if resolved_model_path is None:
raise ValueError("Model path must be provided for DiffusersPipelineEngine.")
device_cfg = getattr(dit_config, "device_config", None)
model_cfg = getattr(dit_config, "model_config", None)
device = None
dtype = None
if device_cfg:
if isinstance(device_cfg, dict):
device = device_cfg.get("device")
dtype = device_cfg.get("dtype")
else:
device = getattr(device_cfg, "device", None)
dtype = getattr(device_cfg, "dtype", None)
if dtype is None and model_cfg:
if isinstance(model_cfg, dict):
dtype = model_cfg.get("dtype")
else:
dtype = getattr(model_cfg, "dtype", None)
2025-09-28 21:58:48 +08:00
self.worker = DiffusionGPUWorker(
2025-09-28 22:09:13 +08:00
resolved_model_path,
2025-09-28 21:58:48 +08:00
pipeline_name=dit_config.diffusers_pipeline,
2025-09-28 22:09:13 +08:00
device=device,
dtype=dtype,
2025-09-28 21:58:48 +08:00
)
def generate(
self,
prompt: str,
*,
2025-09-28 22:09:13 +08:00
height: Optional[int] = None,
width: Optional[int] = None,
num_inference_steps: Optional[int] = None,
guidance_scale: Optional[float] = None,
2025-09-28 21:58:48 +08:00
negative_prompt: Optional[str] = None,
seed: Optional[int] = None,
image: Optional[Any] = None,
) -> DiffusionRunnerOutput:
2025-09-28 22:09:13 +08:00
height = int(height) if height is not None else self.height
width = int(width) if width is not None else self.width
num_steps = (
int(num_inference_steps)
if num_inference_steps is not None
else self.num_inference_steps
)
guidance = (
float(guidance_scale)
if guidance_scale is not None
else self.guidance_scale
)
2025-09-28 21:58:48 +08:00
return self.worker.generate(
prompt=prompt,
2025-09-28 22:09:13 +08:00
height=height,
width=width,
num_inference_steps=num_steps,
guidance_scale=guidance,
2025-09-28 21:58:48 +08:00
negative_prompt=negative_prompt,
seed=seed,
image=image,
)