@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / fc1d8be3dc
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 12, 11:00 UTC

[Attention] Update attention imports (#29540)

Signed-off-by: Matthew Bonanni <mbonanni@redhat.com>

Matthew Bonanni committed Nov 27, 2025 at 11:19 UTC fc1d8be3dc97e33ade7fb578451006bb044a5e60
38 files changed +63 -126
tests/v1/attention/test_rocm_attention_backends_selection.py
+3 -6
@@ -139,14 +139,13 @@ def test_standard_attention_backend_selection(
139 import importlib
140
141 import vllm.envs as envs
142 - from vllm.attention.backends.registry import _Backend
142
143 importlib.reload(envs)
144
145 # Convert string backend to enum if provided
146 backend_enum = None
147 if selected_backend:
149 - backend_enum = getattr(_Backend, selected_backend)
148 + backend_enum = getattr(AttentionBackendEnum, selected_backend)
149
150 # Get the backend class path
151 from vllm.platforms.rocm import RocmPlatform
@@ -253,7 +252,6 @@ def test_mla_backend_selection(
252 import importlib
253
254 import vllm.envs as envs
256 - from vllm.attention.backends.registry import _Backend
255
256 importlib.reload(envs)
257
@@ -269,7 +267,7 @@ def test_mla_backend_selection(
267 # Convert string backend to enum if provided
268 backend_enum = None
269 if selected_backend:
272 - backend_enum = getattr(_Backend, selected_backend)
270 + backend_enum = getattr(AttentionBackendEnum, selected_backend)
271
272 from vllm.platforms.rocm import RocmPlatform
273
@@ -301,7 +299,6 @@ def test_mla_backend_selection(
299
300 def test_aiter_fa_requires_gfx9(mock_vllm_config):
301 """Test that ROCM_AITER_FA requires gfx9 architecture."""
304 - from vllm.attention.backends.registry import _Backend
302 from vllm.platforms.rocm import RocmPlatform
303
304 # Mock on_gfx9 to return False
@@ -313,7 +310,7 @@ def test_aiter_fa_requires_gfx9(mock_vllm_config):
310 ),
311 ):
312 RocmPlatform.get_attn_backend_cls(
316 - selected_backend=_Backend.ROCM_AITER_FA,
313 + selected_backend=AttentionBackendEnum.ROCM_AITER_FA,
314 head_size=128,
315 dtype=torch.float16,
316 kv_cache_dtype="auto",
tests/v1/kv_connector/unit/test_backwards_compatibility.py
+3 -3
@@ -14,6 +14,7 @@ from unittest.mock import patch
14
15 import pytest
16
17 +from vllm.attention.backends.abstract import AttentionMetadata
18 from vllm.distributed.kv_transfer.kv_connector.factory import KVConnectorFactory
19 from vllm.distributed.kv_transfer.kv_connector.v1 import (
20 KVConnectorBase_V1,
@@ -24,7 +25,6 @@ from vllm.v1.core.sched.output import SchedulerOutput
25 from .utils import create_scheduler, create_vllm_config
26
27 if TYPE_CHECKING:
27 - from vllm.attention.backends.abstract import AttentionMetadata
28 from vllm.config import VllmConfig
29 from vllm.forward_context import ForwardContext
30 from vllm.v1.core.kv_cache_manager import KVCacheBlocks
@@ -68,7 +68,7 @@ class OldStyleTestConnector(KVConnectorBase_V1):
68 self,
69 layer_name: str,
70 kv_layer,
71 - attn_metadata: "AttentionMetadata",
71 + attn_metadata: AttentionMetadata,
72 **kwargs,
73 ) -> None:
74 pass
@@ -119,7 +119,7 @@ class NewStyleTestConnector(KVConnectorBase_V1):
119 self,
120 layer_name: str,
121 kv_layer,
122 - attn_metadata: "AttentionMetadata",
122 + attn_metadata: AttentionMetadata,
123 **kwargs,
124 ) -> None:
125 pass
vllm/attention/backends/abstract.py
+4 -7
@@ -6,11 +6,10 @@ from typing import TYPE_CHECKING, ClassVar, Generic, Protocol, TypeVar, get_args
6
7 import torch
8
9 -from vllm.model_executor.layers.linear import ColumnParallelLinear
10 -from vllm.model_executor.layers.quantization.utils.quant_utils import QuantKey
11 -
9 if TYPE_CHECKING:
10 from vllm.config.cache import CacheDType
11 + from vllm.model_executor.layers.linear import ColumnParallelLinear
12 + from vllm.model_executor.layers.quantization.utils.quant_utils import QuantKey
13 from vllm.platforms.interface import DeviceCapability
14 from vllm.v1.attention.backends.utils import KVCacheLayoutType
15
@@ -178,8 +177,6 @@ class AttentionBackend(ABC):
177 By default, only supports decoder attention.
178 Backends should override this to support other attention types.
179 """
181 - from vllm.attention.backends.abstract import AttentionType
182 -
180 return attn_type == AttentionType.DECODER
181
182 @classmethod
@@ -360,7 +357,7 @@ class AttentionImpl(ABC, Generic[T]):
357 ) -> torch.Tensor:
358 raise NotImplementedError
359
363 - def fused_output_quant_supported(self, quant_key: QuantKey):
360 + def fused_output_quant_supported(self, quant_key: "QuantKey"):
361 """
362 Does this attention implementation support fused output quantization.
363 This is used by the AttnFusionPass to only fuse output quantization
@@ -412,7 +409,7 @@ class MLAAttentionImpl(AttentionImpl[T], Generic[T]):
409 qk_rope_head_dim: int,
410 qk_head_dim: int,
411 v_head_dim: int,
415 - kv_b_proj: ColumnParallelLinear,
412 + kv_b_proj: "ColumnParallelLinear",
413 indexer: object | None = None,
414 ) -> None:
415 raise NotImplementedError
vllm/attention/layers/chunked_local_attention.py
+1 -2
@@ -5,6 +5,7 @@ import functools
5 import torch
6
7 from vllm.attention.backends.abstract import AttentionBackend, AttentionMetadata
8 +from vllm.attention.layer import Attention
9 from vllm.attention.selector import get_attn_backend
10 from vllm.config import CacheConfig
11 from vllm.config.vllm import VllmConfig
@@ -22,8 +23,6 @@ from vllm.v1.kv_cache_interface import (
23 KVCacheSpec,
24 )
25
25 -from ..layer import Attention
26 -
26
27 @functools.lru_cache
28 def create_chunked_local_attention_backend(
vllm/config/model.py
+1 -2
@@ -14,6 +14,7 @@ from safetensors.torch import _TYPES as _SAFETENSORS_TO_TORCH_DTYPE
14 from transformers.configuration_utils import ALLOWED_LAYER_TYPES
15
16 import vllm.envs as envs
17 +from vllm.attention.backends.registry import AttentionBackendEnum
18 from vllm.config.multimodal import MMCacheType, MMEncoderTPMode, MultiModalConfig
19 from vllm.config.pooler import PoolerConfig
20 from vllm.config.scheduler import RunnerType
@@ -53,7 +54,6 @@ if TYPE_CHECKING:
54
55 import vllm.model_executor.layers.quantization as me_quant
56 import vllm.model_executor.models as me_models
56 - from vllm.attention.backends.registry import AttentionBackendEnum
57 from vllm.config.load import LoadConfig
58 from vllm.config.parallel import ParallelConfig
59 from vllm.model_executor.layers.quantization import QuantizationMethods
@@ -61,7 +61,6 @@ if TYPE_CHECKING:
61 else:
62 PretrainedConfig = Any
63
64 - AttentionBackendEnum = Any
64 me_quant = LazyLoader(
65 "model_executor", globals(), "vllm.model_executor.layers.quantization"
66 )
vllm/config/multimodal.py
+2 -9
@@ -2,19 +2,15 @@
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 from collections.abc import Mapping
5 -from typing import TYPE_CHECKING, Any, Literal, TypeAlias
5 +from typing import Any, Literal, TypeAlias
6
7 from pydantic import ConfigDict, Field, field_validator, model_validator
8 from pydantic.dataclasses import dataclass
9
10 +from vllm.attention.backends.registry import AttentionBackendEnum
11 from vllm.config.utils import config
12 from vllm.utils.hashing import safe_hash
13
13 -if TYPE_CHECKING:
14 - from vllm.attention.backends.registry import AttentionBackendEnum
15 -else:
16 - AttentionBackendEnum = Any
17 -
14
15 @dataclass
16 class BaseDummyOptions:
@@ -170,9 +166,6 @@ class MultiModalConfig:
166 def _validate_mm_encoder_attn_backend(
167 cls, value: str | AttentionBackendEnum | None
168 ) -> AttentionBackendEnum | None:
173 - # We need to import the real type here (deferred to avoid circular import).
174 - from vllm.attention.backends.registry import AttentionBackendEnum
175 -
169 if isinstance(value, str) and value.upper() == "XFORMERS":
170 raise ValueError(
171 "Attention backend 'XFORMERS' has been removed (See PR #29262 for "
vllm/distributed/kv_transfer/kv_connector/v1/base.py
+2 -2
@@ -42,12 +42,12 @@ from typing import TYPE_CHECKING, Any, ClassVar, Literal, Optional
42
43 import torch
44
45 +from vllm.attention.backends.abstract import AttentionBackend, AttentionMetadata
46 from vllm.logger import init_logger
47 from vllm.v1.core.sched.output import SchedulerOutput
48 from vllm.v1.outputs import KVConnectorOutput
49
50 if TYPE_CHECKING:
50 - from vllm.attention.backends.abstract import AttentionBackend, AttentionMetadata
51 from vllm.config import VllmConfig
52 from vllm.distributed.kv_events import KVCacheEvent
53 from vllm.distributed.kv_transfer.kv_connector.v1.metrics import (
@@ -239,7 +239,7 @@ class KVConnectorBase_V1(ABC):
239 return
240
241 def register_cross_layers_kv_cache(
242 - self, kv_cache: torch.Tensor, attn_backend: type["AttentionBackend"]
242 + self, kv_cache: torch.Tensor, attn_backend: type[AttentionBackend]
243 ):
244 """
245 Initialize with a single KV cache tensor used by all layers.
vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py
+2 -2
@@ -36,6 +36,7 @@ from typing import TYPE_CHECKING, Any, Optional
36
37 import torch
38
39 +from vllm.attention.backends.abstract import AttentionMetadata
40 from vllm.distributed.kv_transfer.kv_connector.v1 import (
41 KVConnectorBase_V1,
42 KVConnectorRole,
@@ -45,7 +46,6 @@ from vllm.logger import init_logger
46 from vllm.utils.math_utils import cdiv
47
48 if TYPE_CHECKING:
48 - from vllm.attention.backends.abstract import AttentionMetadata
49 from vllm.config import VllmConfig
50 from vllm.forward_context import ForwardContext
51 from vllm.v1.core.kv_cache_manager import KVCacheBlocks
@@ -117,7 +117,7 @@ class DecodeBenchConnector(KVConnectorBase_V1):
117 self,
118 layer_name: str,
119 kv_layer: torch.Tensor,
120 - attn_metadata: "AttentionMetadata",
120 + attn_metadata: AttentionMetadata,
121 **kwargs: Any,
122 ) -> None:
123 # This connector doesn't save KV cache (benchmarking only)
vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py
+2 -2
@@ -7,6 +7,7 @@ from lmcache.integration.vllm.vllm_v1_adapter import (
7 LMCacheConnectorV1Impl as LMCacheConnectorLatestImpl,
8 )
9
10 +from vllm.attention.backends.abstract import AttentionMetadata
11 from vllm.config import VllmConfig
12 from vllm.distributed.kv_transfer.kv_connector.v1.base import (
13 KVConnectorBase_V1,
@@ -17,7 +18,6 @@ from vllm.logger import init_logger
18 from vllm.v1.core.sched.output import SchedulerOutput
19
20 if TYPE_CHECKING:
20 - from vllm.attention.backends.abstract import AttentionMetadata
21 from vllm.forward_context import ForwardContext
22 from vllm.v1.core.kv_cache_manager import KVCacheBlocks
23 from vllm.v1.kv_cache_interface import KVCacheConfig
@@ -91,7 +91,7 @@ class LMCacheConnectorV1(KVConnectorBase_V1):
91 self,
92 layer_name: str,
93 kv_layer: torch.Tensor,
94 - attn_metadata: "AttentionMetadata",
94 + attn_metadata: AttentionMetadata,
95 **kwargs: Any,
96 ) -> None:
97 """
vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py
+2 -2
@@ -29,6 +29,7 @@ from lmcache.v1.lookup_client.lmcache_async_lookup_client import (
29 from lmcache.v1.offload_server.zmq_server import ZMQOffloadServer
30 from lmcache.v1.plugin.plugin_launcher import PluginLauncher
31
32 +from vllm.attention.backends.abstract import AttentionMetadata
33 from vllm.config import VllmConfig
34 from vllm.distributed.kv_transfer.kv_connector.v1.base import (
35 KVConnectorBase_V1,
@@ -50,7 +51,6 @@ from vllm.v1.core.sched.output import SchedulerOutput
51 from vllm.version import __version__ as VLLM_VERSION
52
53 if TYPE_CHECKING:
53 - from vllm.attention.backends.abstract import AttentionMetadata
54 from vllm.forward_context import ForwardContext
55 from vllm.multimodal.inputs import PlaceholderRange
56 from vllm.v1.core.kv_cache_manager import KVCacheManager
@@ -915,7 +915,7 @@ class LMCacheConnectorV1Impl:
915 self,
916 layer_name: str,
917 kv_layer: torch.Tensor,
918 - attn_metadata: "AttentionMetadata",
918 + attn_metadata: AttentionMetadata,
919 **kwargs,
920 ) -> None:
921 """Start saving the a layer of KV cache from vLLM's paged buffer
vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py
+2 -2
@@ -10,6 +10,7 @@ import zmq
10 from lmcache.integration.vllm.utils import mla_enabled
11 from lmcache.utils import init_logger as lmcache_init_logger
12
13 +from vllm.attention.backends.abstract import AttentionMetadata
14 from vllm.config import VllmConfig
15 from vllm.distributed.kv_transfer.kv_connector.v1.base import (
16 KVConnectorBase_V1,
@@ -26,7 +27,6 @@ from vllm.v1.outputs import KVConnectorOutput
27 from vllm.v1.utils import ConstantList
28
29 if TYPE_CHECKING:
29 - from vllm.attention.backends.abstract import AttentionMetadata
30 from vllm.config import VllmConfig
31 from vllm.distributed.kv_events import KVCacheEvent
32 from vllm.distributed.kv_transfer.kv_connector.v1.metrics import (
@@ -490,7 +490,7 @@ class LMCacheMPConnector(KVConnectorBase_V1):
490 self,
491 layer_name: str,
492 kv_layer: torch.Tensor,
493 - attn_metadata: "AttentionMetadata",
493 + attn_metadata: AttentionMetadata,
494 **kwargs: Any,
495 ) -> None:
496 """
vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py
+2 -2
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Any
7
8 import torch
9
10 +from vllm.attention.backends.abstract import AttentionMetadata
11 from vllm.config import VllmConfig
12 from vllm.config.kv_transfer import KVTransferConfig
13 from vllm.distributed.kv_transfer.kv_connector.base import KVConnectorBaseType
@@ -27,7 +28,6 @@ from vllm.v1.core.sched.output import SchedulerOutput
28 from vllm.v1.outputs import KVConnectorOutput
29
30 if TYPE_CHECKING:
30 - from vllm.attention.backends.abstract import AttentionMetadata
31 from vllm.distributed.kv_events import KVCacheEvent
32 from vllm.forward_context import ForwardContext
33 from vllm.v1.core.kv_cache_manager import KVCacheBlocks
@@ -216,7 +216,7 @@ class MultiConnector(KVConnectorBase_V1):
216 self,
217 layer_name: str,
218 kv_layer: torch.Tensor,
219 - attn_metadata: "AttentionMetadata",
219 + attn_metadata: AttentionMetadata,
220 **kwargs,
221 ) -> None:
222 for c in self._connectors:
vllm/distributed/kv_transfer/kv_connector/v1/nixl_connector.py
+2 -3
@@ -20,7 +20,7 @@ import torch
20 import zmq
21
22 from vllm import envs
23 -from vllm.attention.backends.abstract import AttentionBackend
23 +from vllm.attention.backends.abstract import AttentionBackend, AttentionMetadata
24 from vllm.attention.backends.registry import AttentionBackendEnum
25 from vllm.attention.selector import get_attn_backend
26 from vllm.config import VllmConfig
@@ -51,7 +51,6 @@ from vllm.v1.core.sched.output import SchedulerOutput
51 from vllm.v1.worker.block_table import BlockTable
52
53 if TYPE_CHECKING:
54 - from vllm.attention.backends.abstract import AttentionMetadata
54 from vllm.v1.core.kv_cache_manager import KVCacheBlocks
55 from vllm.v1.kv_cache_interface import KVCacheConfig
56 from vllm.v1.request import Request
@@ -308,7 +307,7 @@ class NixlConnector(KVConnectorBase_V1):
307 self,
308 layer_name: str,
309 kv_layer: torch.Tensor,
311 - attn_metadata: "AttentionMetadata",
310 + attn_metadata: AttentionMetadata,
311 **kwargs,
312 ) -> None:
313 """NixlConnector does not save explicitly."""
vllm/distributed/kv_transfer/kv_connector/v1/p2p/p2p_nccl_connector.py
+2 -2
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Any, Optional
7 import regex as re
8 import torch
9
10 +from vllm.attention.backends.abstract import AttentionMetadata
11 from vllm.config import VllmConfig
12 from vllm.distributed.kv_transfer.kv_connector.v1.base import (
13 KVConnectorBase_V1,
@@ -22,7 +23,6 @@ from vllm.v1.attention.backends.mla.common import MLACommonMetadata
23 from vllm.v1.core.sched.output import SchedulerOutput
24
25 if TYPE_CHECKING:
25 - from vllm.attention.backends.abstract import AttentionMetadata
26 from vllm.forward_context import ForwardContext
27 from vllm.v1.core.kv_cache_manager import KVCacheBlocks
28 from vllm.v1.kv_cache_interface import KVCacheConfig
@@ -243,7 +243,7 @@ class P2pNcclConnector(KVConnectorBase_V1):
243 self,
244 layer_name: str,
245 kv_layer: torch.Tensor,
246 - attn_metadata: "AttentionMetadata",
246 + attn_metadata: AttentionMetadata,
247 **kwargs: Any,
248 ) -> None:
249 """Start saving the KV cache of the layer from vLLM's paged buffer
vllm/distributed/kv_transfer/kv_connector/v1/shared_storage_connector.py
+2 -2
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Any, Optional
7 import safetensors
8 import torch
9
10 +from vllm.attention.backends.abstract import AttentionMetadata
11 from vllm.config import VllmConfig
12 from vllm.distributed.kv_transfer.kv_connector.v1.base import (
13 KVConnectorBase_V1,
@@ -19,7 +20,6 @@ from vllm.v1.attention.backends.mla.common import MLACommonMetadata
20 from vllm.v1.core.sched.output import SchedulerOutput
21
22 if TYPE_CHECKING:
22 - from vllm.attention.backends.abstract import AttentionMetadata
23 from vllm.forward_context import ForwardContext
24 from vllm.v1.core.kv_cache_manager import KVCacheBlocks
25 from vllm.v1.kv_cache_interface import KVCacheConfig
@@ -211,7 +211,7 @@ class SharedStorageConnector(KVConnectorBase_V1):
211 self,
212 layer_name: str,
213 kv_layer: torch.Tensor,
214 - attn_metadata: "AttentionMetadata",
214 + attn_metadata: AttentionMetadata,
215 **kwargs: Any,
216 ) -> None:
217 """Start saving the KV cache of the layer from vLLM's paged buffer
vllm/forward_context.py
+3 -5
@@ -5,19 +5,17 @@ import time
5 from collections import defaultdict
6 from contextlib import contextmanager
7 from dataclasses import dataclass
8 -from typing import TYPE_CHECKING, Any, NamedTuple
8 +from typing import Any, NamedTuple
9
10 import torch
11
12 import vllm.envs as envs
13 +from vllm.attention.backends.abstract import AttentionMetadata
14 from vllm.config import CUDAGraphMode, ParallelConfig, VllmConfig
15 from vllm.logger import init_logger
16 from vllm.v1.worker.dp_utils import coordinate_batch_across_dp
17 from vllm.v1.worker.ubatch_utils import UBatchSlices
18
18 -if TYPE_CHECKING:
19 - from vllm.attention.backends.abstract import AttentionMetadata
20 -
19 logger = init_logger(__name__)
20
21 track_batchsize: bool = envs.VLLM_LOG_BATCHSIZE_INTERVAL >= 0
@@ -195,7 +193,7 @@ class ForwardContext:
193 for each microbatch.
194 Set dynamically for each forward pass
195 """
198 - attn_metadata: dict[str, "AttentionMetadata"] | list[dict[str, "AttentionMetadata"]]
196 + attn_metadata: dict[str, AttentionMetadata] | list[dict[str, AttentionMetadata]]
197 # TODO: remove after making all virtual_engines share the same kv cache
198 virtual_engine: int # set dynamically for each forward pass
199 # set dynamically for each forward pass
vllm/model_executor/layers/attention_layer_base.py
+2 -5
@@ -3,14 +3,11 @@
3 """Base class for attention-like layers."""
4
5 from abc import ABC, abstractmethod
6 -from typing import TYPE_CHECKING
6
7 +from vllm.attention.backends.abstract import AttentionBackend
8 from vllm.config import VllmConfig
9 from vllm.v1.kv_cache_interface import KVCacheSpec
10
11 -if TYPE_CHECKING:
12 - from vllm.attention.backends.abstract import AttentionBackend
13 -
11
12 class AttentionLayerBase(ABC):
13 """
@@ -22,7 +19,7 @@ class AttentionLayerBase(ABC):
19 """
20
21 @abstractmethod
25 - def get_attn_backend(self) -> type["AttentionBackend"]:
22 + def get_attn_backend(self) -> type[AttentionBackend]:
23 """Get the attention backend class for this layer."""
24 pass
25
vllm/model_executor/layers/mamba/abstract.py
+2 -5
@@ -2,18 +2,15 @@
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 from abc import abstractmethod
4 from collections.abc import Iterable
5 -from typing import TYPE_CHECKING
5
6 import torch
7
8 +from vllm.attention.backends.abstract import AttentionBackend
9 from vllm.attention.selector import get_mamba_attn_backend
10 from vllm.config import VllmConfig
11 from vllm.model_executor.layers.attention_layer_base import AttentionLayerBase
12 from vllm.v1.kv_cache_interface import KVCacheSpec, MambaSpec
13
14 -if TYPE_CHECKING:
15 - from vllm.attention.backends.abstract import AttentionBackend
16 -
14
15 class MambaBase(AttentionLayerBase):
16 """
@@ -66,6 +63,6 @@ class MambaBase(AttentionLayerBase):
63 ),
64 )
65
69 - def get_attn_backend(self) -> type["AttentionBackend"]:
66 + def get_attn_backend(self) -> type[AttentionBackend]:
67 """Get the attention backend class for this Mamba layer."""
68 return get_mamba_attn_backend(self.mamba_type)
vllm/model_executor/layers/quantization/compressed_tensors/compressed_tensors.py
+1 -2
@@ -18,6 +18,7 @@ from compressed_tensors.quantization import (
18 from compressed_tensors.transform import TransformConfig
19
20 import vllm.envs as envs
21 +from vllm.attention.layer import Attention
22 from vllm.logger import init_logger
23 from vllm.model_executor.layers.fused_moe import FusedMoE
24 from vllm.model_executor.layers.linear import (
@@ -131,8 +132,6 @@ class CompressedTensorsConfig(QuantizationConfig):
132 layer: torch.nn.Module,
133 prefix: str,
134 ) -> Optional["QuantizeMethodBase"]:
134 - from vllm.attention.layer import Attention # Avoid circular import
135 -
135 if isinstance(layer, LinearBase):
136 # collect schemes
137 quant_scheme = self.get_scheme(layer=layer, layer_name=prefix)
vllm/model_executor/layers/quantization/fp8.py
+1 -3
@@ -14,6 +14,7 @@ import vllm.envs as envs
14 import vllm.model_executor.layers.fused_moe.modular_kernel as mk
15 from vllm import _custom_ops as ops
16 from vllm._aiter_ops import rocm_aiter_ops
17 +from vllm.attention.layer import Attention
18 from vllm.distributed import get_tensor_model_parallel_world_size
19 from vllm.logger import init_logger
20 from vllm.model_executor.layers.batch_invariant import (
@@ -277,7 +278,6 @@ class Fp8Config(QuantizationConfig):
278 def get_xpu_quant_method(
279 self, layer: torch.nn.Module, prefix: str
280 ) -> Optional["QuantizeMethodBase"]:
280 - from vllm.attention.layer import Attention
281 from vllm.model_executor.layers.quantization.ipex_quant import (
282 XPUFp8LinearMethod,
283 XPUFp8MoEMethod,
@@ -307,8 +307,6 @@ class Fp8Config(QuantizationConfig):
307 def get_quant_method(
308 self, layer: torch.nn.Module, prefix: str
309 ) -> Optional["QuantizeMethodBase"]:
310 - from vllm.attention.layer import Attention # Avoid circular import
311 -
310 if current_platform.is_xpu():
311 return self.get_xpu_quant_method(layer, prefix)
312 if isinstance(layer, LinearBase):
vllm/model_executor/layers/quantization/modelopt.py
+1 -2
@@ -12,6 +12,7 @@ from torch.nn.parameter import Parameter
12 import vllm.envs as envs
13 import vllm.model_executor.layers.fused_moe.modular_kernel as mk
14 from vllm._custom_ops import cutlass_scaled_fp4_mm, scaled_fp4_quant
15 +from vllm.attention.layer import Attention
16 from vllm.logger import init_logger
17 from vllm.model_executor.layers.fused_moe.config import (
18 FusedMoEQuantConfig,
@@ -149,8 +150,6 @@ class ModelOptQuantConfigBase(QuantizationConfig):
150 def get_quant_method(
151 self, layer: torch.nn.Module, prefix: str
152 ) -> Optional["QuantizeMethodBase"]:
152 - from vllm.attention.layer import Attention # Avoid circular import
153 -
153 # handle kv-cache first so we can focus only on weight quantization thereafter
154 if isinstance(layer, Attention):
155 return self.KVCacheMethodCls(self)
vllm/model_executor/layers/quantization/mxfp4.py
+1 -2
@@ -8,6 +8,7 @@ import torch
8 from torch.nn.parameter import Parameter
9
10 from vllm import envs
11 +from vllm.attention.layer import Attention
12 from vllm.config import get_current_vllm_config
13 from vllm.logger import init_logger
14 from vllm.model_executor.layers.fused_moe import (
@@ -184,8 +185,6 @@ class Mxfp4Config(QuantizationConfig):
185 def get_quant_method(
186 self, layer: torch.nn.Module, prefix: str
187 ) -> Optional["QuantizeMethodBase"]:
187 - from vllm.attention.layer import Attention # Avoid circular import
188 -
188 if isinstance(layer, LinearBase):
189 if self.ignored_layers and is_layer_skipped(
190 prefix=prefix,
vllm/model_executor/layers/quantization/petit.py
+1 -2
@@ -8,6 +8,7 @@ import regex as re
8 import torch
9 from torch.nn.parameter import Parameter
10
11 +from vllm.attention.layer import Attention
12 from vllm.logger import init_logger
13 from vllm.model_executor.layers.linear import (
14 LinearBase,
@@ -159,8 +160,6 @@ class PetitNvFp4Config(QuantizationConfig):
160 def get_quant_method(
161 self, layer: torch.nn.Module, prefix: str
162 ) -> Optional["QuantizeMethodBase"]:
162 - from vllm.attention.layer import Attention # Avoid circular import
163 -
163 exclude = self.require_exclude_modules()
164
165 if isinstance(layer, LinearBase):
vllm/model_executor/layers/quantization/ptpc_fp8.py
+1 -2
@@ -7,6 +7,7 @@ import torch
7 from torch.nn.parameter import Parameter
8
9 from vllm import _custom_ops as ops
10 +from vllm.attention.layer import Attention
11 from vllm.logger import init_logger
12 from vllm.model_executor.layers.linear import LinearBase, UnquantizedLinearMethod
13 from vllm.model_executor.layers.quantization import QuantizationMethods
@@ -65,8 +66,6 @@ class PTPCFp8Config(Fp8Config):
66 def get_quant_method(
67 self, layer: torch.nn.Module, prefix: str
68 ) -> Optional["QuantizeMethodBase"]:
68 - from vllm.attention.layer import Attention # Avoid circular import
69 -
69 if isinstance(layer, LinearBase):
70 if is_layer_skipped(prefix, self.ignored_layers):
71 return UnquantizedLinearMethod()
vllm/model_executor/layers/quantization/quark/quark.py
+1 -2
@@ -6,6 +6,7 @@ from typing import TYPE_CHECKING, Any, Optional, cast
6
7 import torch
8
9 +from vllm.attention.layer import Attention
10 from vllm.logger import init_logger
11 from vllm.model_executor.layers.fused_moe import FusedMoE
12 from vllm.model_executor.layers.linear import (
@@ -102,8 +103,6 @@ class QuarkConfig(QuantizationConfig):
103 def get_quant_method(
104 self, layer: torch.nn.Module, prefix: str
105 ) -> Optional["QuantizeMethodBase"]:
105 - from vllm.attention.layer import Attention # Avoid circular import
106 -
106 # Check if the layer is skipped for quantization.
107 exclude_layers = cast(list[str], self.quant_config.get("exclude"))
108 if should_ignore_layer(
vllm/platforms/cpu.py
+1 -4
@@ -14,6 +14,7 @@ import regex as re
14 import torch
15
16 from vllm import envs
17 +from vllm.attention.backends.registry import AttentionBackendEnum
18 from vllm.logger import init_logger
19
20 from .interface import CpuArchEnum, Platform, PlatformEnum
@@ -21,10 +22,8 @@ from .interface import CpuArchEnum, Platform, PlatformEnum
22 logger = init_logger(__name__)
23
24 if TYPE_CHECKING:
24 - from vllm.attention.backends.registry import AttentionBackendEnum
25 from vllm.config import VllmConfig
26 else:
27 - AttentionBackendEnum = None
27 VllmConfig = None
28
29
@@ -135,8 +134,6 @@ class CpuPlatform(Platform):
134 use_sparse: bool,
135 attn_type: str | None = None,
136 ) -> str:
138 - from vllm.attention.backends.registry import AttentionBackendEnum
139 -
137 if selected_backend and selected_backend != AttentionBackendEnum.CPU_ATTN:
138 logger.info("Cannot use %s backend on CPU.", selected_backend)
139 if use_mla:
vllm/platforms/cuda.py
+2 -8
@@ -15,6 +15,8 @@ from typing_extensions import ParamSpec
15 # import custom ops, trigger op registration
16 import vllm._C # noqa
17 import vllm.envs as envs
18 +from vllm.attention.backends.abstract import AttentionType
19 +from vllm.attention.backends.registry import AttentionBackendEnum
20 from vllm.logger import init_logger
21 from vllm.utils.import_utils import import_pynvml
22 from vllm.utils.torch_utils import cuda_device_count_stateless
@@ -22,11 +24,9 @@ from vllm.utils.torch_utils import cuda_device_count_stateless
24 from .interface import DeviceCapability, Platform, PlatformEnum
25
26 if TYPE_CHECKING:
25 - from vllm.attention.backends.registry import AttentionBackendEnum
27 from vllm.config import VllmConfig
28 from vllm.config.cache import CacheDType
29 else:
29 - AttentionBackendEnum = None
30 VllmConfig = None
31 CacheDType = None
32
@@ -48,8 +48,6 @@ def _get_backend_priorities(
48 device_capability: DeviceCapability,
49 ) -> list[AttentionBackendEnum]:
50 """Get backend priorities with lazy import to avoid circular dependency."""
51 - from vllm.attention.backends.registry import AttentionBackendEnum
52 -
51 if use_mla:
52 if device_capability.major == 10:
53 return [
@@ -265,8 +263,6 @@ class CudaPlatformBase(Platform):
263 def get_vit_attn_backend(
264 cls, head_size: int, dtype: torch.dtype
265 ) -> "AttentionBackendEnum":
268 - from vllm.attention.backends.registry import AttentionBackendEnum
269 -
266 # Try FlashAttention first
267 try:
268 backend_class = AttentionBackendEnum.FLASH_ATTN.get_class()
@@ -335,8 +331,6 @@ class CudaPlatformBase(Platform):
331 use_sparse: bool,
332 attn_type: str | None = None,
333 ) -> str:
338 - from vllm.attention.backends.abstract import AttentionType
339 -
334 if attn_type is None:
335 attn_type = AttentionType.DECODER
336
vllm/platforms/interface.py
+1 -4
@@ -12,12 +12,12 @@ from typing import TYPE_CHECKING, Any, NamedTuple
12 import numpy as np
13 import torch
14
15 +from vllm.attention.backends.registry import AttentionBackendEnum
16 from vllm.logger import init_logger
17
18 if TYPE_CHECKING:
19 from torch.distributed import PrefixStore, ProcessGroup
20
20 - from vllm.attention.backends.registry import AttentionBackendEnum
21 from vllm.config import VllmConfig
22 from vllm.config.cache import CacheDType
23 from vllm.inputs import ProcessorInputs, PromptType
@@ -226,9 +226,6 @@ class Platform:
226 def get_vit_attn_backend(
227 cls, head_size: int, dtype: torch.dtype
228 ) -> "AttentionBackendEnum":
229 - # Import AttentionBackendEnum here to avoid circular import.
230 - from vllm.attention.backends.registry import AttentionBackendEnum
231 -
229 return AttentionBackendEnum.TORCH_SDPA
230
231 @classmethod
vllm/platforms/rocm.py
+1 -5
@@ -8,16 +8,14 @@ from typing import TYPE_CHECKING
8 import torch
9
10 import vllm.envs as envs
11 +from vllm.attention.backends.registry import AttentionBackendEnum
12 from vllm.logger import init_logger
13 from vllm.utils.torch_utils import cuda_device_count_stateless
14
15 from .interface import DeviceCapability, Platform, PlatformEnum
16
17 if TYPE_CHECKING:
17 - from vllm.attention.backends.registry import AttentionBackendEnum
18 from vllm.config import VllmConfig
19 -else:
20 - AttentionBackendEnum = None
19
20 logger = init_logger(__name__)
21
@@ -196,7 +194,6 @@ class RocmPlatform(Platform):
194 from importlib.util import find_spec
195
196 from vllm._aiter_ops import rocm_aiter_ops
199 - from vllm.attention.backends.registry import AttentionBackendEnum
197
198 if rocm_aiter_ops.is_mha_enabled():
199 # Note: AITER FA is only supported for Qwen-VL models.
@@ -222,7 +219,6 @@ class RocmPlatform(Platform):
219 attn_type: str | None = None,
220 ) -> str:
221 from vllm._aiter_ops import rocm_aiter_ops
225 - from vllm.attention.backends.registry import AttentionBackendEnum
222
223 if use_sparse:
224 if kv_cache_dtype.startswith("fp8"):
vllm/platforms/tpu.py
+1 -4
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, cast
7 import torch
8 from tpu_info import device
9
10 +from vllm.attention.backends.registry import AttentionBackendEnum
11 from vllm.inputs import ProcessorInputs, PromptType
12 from vllm.logger import init_logger
13
@@ -15,7 +16,6 @@ from .interface import Platform, PlatformEnum
16 if TYPE_CHECKING:
17 from typing import TypeAlias
18
18 - from vllm.attention.backends.registry import AttentionBackendEnum
19 from vllm.config import VllmConfig
20 from vllm.config.cache import BlockSize
21 from vllm.pooling_params import PoolingParams
@@ -26,7 +26,6 @@ else:
26 BlockSize = None
27 VllmConfig = None
28 PoolingParams = None
29 - AttentionBackendEnum = None
29 ParamsType = None
30
31 logger = init_logger(__name__)
@@ -67,8 +66,6 @@ class TpuPlatform(Platform):
66 use_sparse,
67 attn_type: str | None = None,
68 ) -> str:
70 - from vllm.attention.backends.registry import AttentionBackendEnum
71 -
69 if use_sparse:
70 raise NotImplementedError("Sparse Attention is not supported on TPU.")
71 if selected_backend != AttentionBackendEnum.PALLAS:
vllm/platforms/xpu.py
+1 -6
@@ -8,16 +8,15 @@ from typing import TYPE_CHECKING
8 import torch
9
10 import vllm.envs as envs
11 +from vllm.attention.backends.registry import AttentionBackendEnum
12 from vllm.logger import init_logger
13
14 from .interface import DeviceCapability, Platform, PlatformEnum
15
16 if TYPE_CHECKING:
16 - from vllm.attention.backends.registry import AttentionBackendEnum
17 from vllm.config import VllmConfig
18 else:
19 VllmConfig = None
20 - AttentionBackendEnum = None
20
21 logger = init_logger(__name__)
22
@@ -60,8 +59,6 @@ class XPUPlatform(Platform):
59 "only NHD layout is supported by XPU attention kernels."
60 )
61
63 - from vllm.attention.backends.registry import AttentionBackendEnum
64 -
62 if use_sparse:
63 raise NotImplementedError("Sparse Attention is not supported on XPU.")
64 if selected_backend == AttentionBackendEnum.TRITON_ATTN:
@@ -116,8 +113,6 @@ class XPUPlatform(Platform):
113 def get_vit_attn_backend(
114 cls, head_size: int, dtype: torch.dtype
115 ) -> "AttentionBackendEnum":
119 - from vllm.attention.backends.registry import AttentionBackendEnum
120 -
116 return AttentionBackendEnum.FLASH_ATTN
117
118 @classmethod
vllm/v1/attention/backends/cpu_attn.py
-2
@@ -51,8 +51,6 @@ class CPUAttentionBackend(AttentionBackend):
51 @classmethod
52 def supports_attn_type(cls, attn_type: str) -> bool:
53 """CPU attention supports decoder and encoder-only attention."""
54 - from vllm.attention.backends.abstract import AttentionType
55 -
54 return attn_type in (
55 AttentionType.DECODER,
56 AttentionType.ENCODER,
vllm/v1/attention/backends/flash_attn.py
-2
@@ -84,8 +84,6 @@ class FlashAttentionBackend(AttentionBackend):
84 @classmethod
85 def supports_attn_type(cls, attn_type: str) -> bool:
86 """FlashAttention supports all attention types."""
87 - from vllm.attention.backends.abstract import AttentionType
88 -
87 return attn_type in (
88 AttentionType.DECODER,
89 AttentionType.ENCODER,
vllm/v1/attention/backends/flex_attention.py
-2
@@ -87,8 +87,6 @@ class FlexAttentionBackend(AttentionBackend):
87 @classmethod
88 def supports_attn_type(cls, attn_type: str) -> bool:
89 """FlexAttention supports both decoder and encoder-only attention."""
90 - from vllm.attention.backends.abstract import AttentionType
91 -
90 return attn_type in (AttentionType.DECODER, AttentionType.ENCODER_ONLY)
91
92 @staticmethod
vllm/v1/attention/backends/utils.py
+5 -2
@@ -24,12 +24,15 @@ from vllm.config import VllmConfig, get_layers_from_vllm_config
24 from vllm.utils.math_utils import cdiv
25
26 if TYPE_CHECKING:
27 - from vllm.attention.backends.abstract import AttentionImpl
27 from vllm.v1.core.sched.output import SchedulerOutput
28 from vllm.v1.worker.gpu_input_batch import InputBatch
29
30 import vllm.envs as envs
32 -from vllm.attention.backends.abstract import AttentionBackend, AttentionMetadata
31 +from vllm.attention.backends.abstract import (
32 + AttentionBackend,
33 + AttentionImpl,
34 + AttentionMetadata,
35 +)
36 from vllm.distributed.kv_transfer.kv_connector.utils import (
37 get_kv_connector_cache_layout,
38 )
vllm/v1/kv_offload/spec.py
+2 -2
@@ -6,12 +6,12 @@ from typing import TYPE_CHECKING
6
7 import torch
8
9 +from vllm.attention.backends.abstract import AttentionBackend
10 from vllm.logger import init_logger
11 from vllm.v1.kv_offload.abstract import LoadStoreSpec, OffloadingManager
12 from vllm.v1.kv_offload.worker.worker import OffloadingHandler
13
14 if TYPE_CHECKING:
14 - from vllm.attention.backends.abstract import AttentionBackend
15 from vllm.config import VllmConfig
16
17 logger = init_logger(__name__)
@@ -51,7 +51,7 @@ class OffloadingSpec(ABC):
51 def get_handlers(
52 self,
53 kv_caches: dict[str, torch.Tensor],
54 - attn_backends: dict[str, type["AttentionBackend"]],
54 + attn_backends: dict[str, type[AttentionBackend]],
55 ) -> Iterator[tuple[type[LoadStoreSpec], type[LoadStoreSpec], OffloadingHandler]]:
56 """
57 Get offloading handlers along with their respective src and dst types.
vllm/v1/spec_decode/eagle.py
+1 -2
@@ -8,6 +8,7 @@ import numpy as np
8 import torch
9 import torch.nn as nn
10
11 +from vllm.attention.backends.registry import AttentionBackendEnum
12 from vllm.config import (
13 CompilationMode,
14 CUDAGraphMode,
@@ -157,8 +158,6 @@ class EagleProposer:
158 )
159
160 # Determine allowed attention backends once during initialization.
160 - from vllm.attention.backends.registry import AttentionBackendEnum
161 -
161 self.allowed_attn_types: tuple | None = None
162 if current_platform.is_rocm():
163 rocm_types = [TritonAttentionMetadata, FlashAttentionMetadata]
vllm/v1/worker/utils.py
+2 -5
@@ -2,11 +2,11 @@
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 from collections import defaultdict
4 from dataclasses import dataclass, field
5 -from typing import TYPE_CHECKING
5
6 import torch
7
8 from vllm.attention.backends.abstract import AttentionBackend
9 +from vllm.attention.layer import Attention
10 from vllm.config import ModelConfig, SchedulerConfig, VllmConfig
11 from vllm.model_executor.models.interfaces import MultiModalEmbeddings
12 from vllm.model_executor.models.utils import extract_layer_index
@@ -17,9 +17,6 @@ from vllm.v1.attention.backends.utils import AttentionMetadataBuilder
17 from vllm.v1.core.encoder_cache_manager import compute_mm_encoder_budget
18 from vllm.v1.kv_cache_interface import KVCacheGroupSpec, KVCacheSpec
19
20 -if TYPE_CHECKING:
21 - from vllm.attention.layer import Attention
22 -
20
21 class MultiModalBudget:
22 """Helper class to calculate budget information for multi-modal models."""
@@ -278,7 +275,7 @@ def add_kv_sharing_layers_to_kv_cache_groups(
275
276 def bind_kv_cache(
277 kv_caches: dict[str, torch.Tensor],
281 - forward_context: dict[str, "Attention"],
278 + forward_context: dict[str, Attention],
279 runner_kv_caches: list[torch.Tensor],
280 num_attn_module: int = 1,
281 ) -> None: