[Feature]: FP8 Quantization Support for DiT (#1034)
Signed-off-by: lishunyang <lishunyang12@163.com> Signed-off-by: SYLAR <125541396+lishunyang12@users.noreply.github.com>
This commit is contained in:
1 parent
f0bca6f66b
commit
830d261f9d
17 files changed
+688
-13
No files matched your search
@@ -4,7 +4,7 @@
|
||||
import enum
|
||||
import os
|
||||
import random
|
||||
from collections.abc import Callable
|
||||
from collections.abc import Callable, Mapping
|
||||
from dataclasses import dataclass, field, fields
|
||||
from typing import Any
|
||||
|
||||
@@ -14,6 +14,10 @@ from typing_extensions import Self
|
||||
from vllm.config.utils import config
|
||||
from vllm.logger import init_logger
|
||||
|
||||
from vllm_omni.diffusion.quantization import (
|
||||
DiffusionQuantizationConfig,
|
||||
get_diffusion_quant_config,
|
||||
)
|
||||
from vllm_omni.diffusion.utils.network_utils import is_port_available
|
||||
|
||||
logger = init_logger(__name__)
|
||||
@@ -369,6 +373,11 @@ class OmniDiffusionConfig:
|
||||
# Omni configuration (injected from stage config)
|
||||
omni_kv_config: dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
# Quantization settings
|
||||
# Supported methods: "fp8" (FP8 W8A8 on Ada/Hopper, weight-only on older GPUs)
|
||||
quantization: str | None = None
|
||||
quantization_config: "DiffusionQuantizationConfig | dict[str, Any] | None" = None
|
||||
|
||||
def settle_port(self, port: int, port_inc: int = 42, max_attempts: int = 100) -> int:
|
||||
"""
|
||||
Find an available port with retry logic.
|
||||
@@ -455,6 +464,33 @@ class OmniDiffusionConfig:
|
||||
# If it's neither dict nor DiffusionCacheConfig, convert to empty config
|
||||
self.cache_config = DiffusionCacheConfig()
|
||||
|
||||
# Convert quantization config
|
||||
if self.quantization is not None or self.quantization_config is not None:
|
||||
# Handle dict or DictConfig (from OmegaConf) - use Mapping for broader compatibility
|
||||
if isinstance(self.quantization_config, Mapping):
|
||||
# Convert DictConfig to dict if needed (OmegaConf compatibility)
|
||||
config_dict = dict(self.quantization_config)
|
||||
# Use get() instead of pop() to avoid mutating original dict
|
||||
quant_method = config_dict.get("method", self.quantization)
|
||||
# Filter out "method" key for kwargs
|
||||
quant_kwargs = {k: v for k, v in config_dict.items() if k != "method"}
|
||||
|
||||
# Validate conflicting methods
|
||||
if self.quantization is not None and quant_method is not None and quant_method != self.quantization:
|
||||
logger.warning(
|
||||
f"Conflicting quantization methods: quantization={self.quantization!r}, "
|
||||
f"quantization_config['method']={quant_method!r}. Using quantization_config['method']."
|
||||
)
|
||||
|
||||
self.quantization_config = get_diffusion_quant_config(quant_method, **quant_kwargs)
|
||||
elif self.quantization_config is None and self.quantization is not None:
|
||||
self.quantization_config = get_diffusion_quant_config(self.quantization)
|
||||
elif not isinstance(self.quantization_config, DiffusionQuantizationConfig):
|
||||
raise TypeError(
|
||||
f"quantization_config must be a DiffusionQuantizationConfig, dict, or None, "
|
||||
f"got {type(self.quantization_config)!r}"
|
||||
)
|
||||
|
||||
if self.max_cpu_loras is None:
|
||||
self.max_cpu_loras = 1
|
||||
elif self.max_cpu_loras < 1:
|
||||
|
||||
Reference in new issue
Block a user