@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / b2f78cbad4
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 14, 05:30 UTC

[small][batch invariance] Rename the env and internal flags to simplify usage (#26855)

Signed-off-by: Bram Wasti <bwasti@meta.com>

Bram Wasti committed Oct 16, 2025 at 14:40 UTC b2f78cbad4e86c484a0fcc518c9e8e3cded0e2cd
20 files changed +61 -61
csrc/core/batch_invariant.hpp
+4 -4
@@ -5,11 +5,11 @@
5
6 namespace vllm {
7
8 -// vllm_kernel_override_batch_invariant(); returns true
9 -// if env VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT=1
10 -inline bool vllm_kernel_override_batch_invariant() {
8 +// vllm_is_batch_invariant(); returns true
9 +// if env VLLM_BATCH_INVARIANT=1
10 +inline bool vllm_is_batch_invariant() {
11 static bool cached = []() {
12 - std::string env_key = "VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT";
12 + std::string env_key = "VLLM_BATCH_INVARIANT";
13 const char* val = std::getenv(env_key.c_str());
14 return (val && std::atoi(val) != 0) ? 1 : 0;
15 }();
csrc/layernorm_kernels.cu
+2 -2
@@ -426,7 +426,7 @@ void fused_add_rms_norm(torch::Tensor& input, // [..., hidden_size]
426 wt_ptr % req_alignment_bytes == 0;
427 bool offsets_are_multiple_of_vector_width =
428 hidden_size % vector_width == 0 && input_stride % vector_width == 0;
429 - bool batch_invariant_launch = vllm::vllm_kernel_override_batch_invariant();
429 + bool batch_invariant_launch = vllm::vllm_is_batch_invariant();
430 if (ptrs_are_aligned && offsets_are_multiple_of_vector_width &&
431 !batch_invariant_launch) {
432 LAUNCH_FUSED_ADD_RMS_NORM(8);
@@ -474,7 +474,7 @@ void poly_norm(torch::Tensor& out, // [..., hidden_size]
474 auto inp_ptr = reinterpret_cast<std::uintptr_t>(input.data_ptr());
475 auto out_ptr = reinterpret_cast<std::uintptr_t>(out.data_ptr());
476 bool ptrs_are_aligned = inp_ptr % 16 == 0 && out_ptr % 16 == 0;
477 - bool batch_invariant_launch = vllm::vllm_kernel_override_batch_invariant();
477 + bool batch_invariant_launch = vllm::vllm_is_batch_invariant();
478 if (ptrs_are_aligned && hidden_size % 8 == 0 && !batch_invariant_launch) {
479 LAUNCH_FUSED_POLY_NORM(8);
480 } else {
csrc/layernorm_quant_kernels.cu
+1 -1
@@ -254,7 +254,7 @@ void fused_add_rms_norm_static_fp8_quant(
254 auto wt_ptr = reinterpret_cast<std::uintptr_t>(weight.data_ptr());
255 bool ptrs_are_aligned =
256 inp_ptr % 16 == 0 && res_ptr % 16 == 0 && wt_ptr % 16 == 0;
257 - bool batch_invariant_launch = vllm::vllm_kernel_override_batch_invariant();
257 + bool batch_invariant_launch = vllm::vllm_is_batch_invariant();
258 if (ptrs_are_aligned && hidden_size % 8 == 0 && input_stride % 8 == 0 &&
259 !batch_invariant_launch) {
260 LAUNCH_FUSED_ADD_RMS_NORM(8);
tests/v1/e2e/test_async_sched_and_preempt.py
+1 -1
@@ -39,7 +39,7 @@ def test_preempt_and_async_scheduling_e2e(monkeypatch: pytest.MonkeyPatch):
39
40 with monkeypatch.context() as m:
41 m.setenv("VLLM_ATTENTION_BACKEND", "FLEX_ATTENTION")
42 - # m.setenv("VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT", "1")
42 + # m.setenv("VLLM_BATCH_INVARIANT", "1")
43
44 outputs: list[tuple[str, list]] = []
45 for test_preemption in [False, True]:
tests/v1/generation/test_batch_invariance.py
+12 -12
@@ -19,14 +19,14 @@ hopper_only = pytest.mark.skipif(
19 @pytest.fixture(autouse=True)
20 def enable_batch_invariant_mode():
21 """Automatically enable batch invariant kernel overrides for all tests."""
22 - old_value = os.environ.get("VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT")
23 - os.environ["VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT"] = "1"
22 + old_value = os.environ.get("VLLM_BATCH_INVARIANT")
23 + os.environ["VLLM_BATCH_INVARIANT"] = "1"
24 yield
25 # Restore original value after test
26 if old_value is None:
27 - os.environ.pop("VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT", None)
27 + os.environ.pop("VLLM_BATCH_INVARIANT", None)
28 else:
29 - os.environ["VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT"] = old_value
29 + os.environ["VLLM_BATCH_INVARIANT"] = old_value
30
31
32 def _random_prompt(min_words: int = 1024, max_words: int = 1024 * 2) -> str:
@@ -231,10 +231,10 @@ def test_logprobs_bitwise_batch_invariance_bs1_vs_bsN(backend):
231 # For batch invariance, disable custom all-reduce to ensure deterministic
232 # all-reduce operations (custom all-reduce may not be deterministic)
233 from vllm.model_executor.layers.batch_invariant import (
234 - vllm_kernel_override_batch_invariant,
234 + vllm_is_batch_invariant,
235 )
236
237 - disable_custom_ar = vllm_kernel_override_batch_invariant()
237 + disable_custom_ar = vllm_is_batch_invariant()
238
239 if disable_custom_ar:
240 print(f"\n{'=' * 80}")
@@ -494,8 +494,8 @@ def test_logprobs_WITHOUT_batch_invariance_should_FAIL(backend):
494 os.environ["VLLM_ATTENTION_BACKEND"] = backend
495
496 # CRITICAL: Disable batch invariance for this test
497 - old_value = os.environ.get("VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT")
498 - os.environ["VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT"] = "0"
497 + old_value = os.environ.get("VLLM_BATCH_INVARIANT")
498 + os.environ["VLLM_BATCH_INVARIANT"] = "0"
499
500 try:
501 seed = int(os.getenv("VLLM_TEST_SEED", "12345"))
@@ -687,9 +687,9 @@ def test_logprobs_WITHOUT_batch_invariance_should_FAIL(backend):
687 finally:
688 # Restore original value
689 if old_value is None:
690 - os.environ.pop("VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT", None)
690 + os.environ.pop("VLLM_BATCH_INVARIANT", None)
691 else:
692 - os.environ["VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT"] = old_value
692 + os.environ["VLLM_BATCH_INVARIANT"] = old_value
693
694
695 @hopper_only
@@ -718,10 +718,10 @@ def test_decode_logprobs_match_prefill_logprobs(backend):
718 tp_size = int(os.getenv("VLLM_TEST_TP_SIZE", "1"))
719
720 from vllm.model_executor.layers.batch_invariant import (
721 - vllm_kernel_override_batch_invariant,
721 + vllm_is_batch_invariant,
722 )
723
724 - disable_custom_ar = vllm_kernel_override_batch_invariant()
724 + disable_custom_ar = vllm_is_batch_invariant()
725
726 if disable_custom_ar:
727 print(f"\n{'=' * 80}")
vllm/config/model.py
+2 -2
@@ -21,7 +21,7 @@ from vllm.config.scheduler import RunnerType
21 from vllm.config.utils import assert_hashable, config, getattr_iter
22 from vllm.logger import init_logger
23 from vllm.model_executor.layers.batch_invariant import (
24 - vllm_kernel_override_batch_invariant,
24 + vllm_is_batch_invariant,
25 )
26 from vllm.platforms import current_platform
27 from vllm.transformers_utils.config import (
@@ -423,7 +423,7 @@ class ModelConfig:
423 video_pruning_rate: float | None,
424 ) -> None:
425 # Enable batch invariance settings if requested
426 - if vllm_kernel_override_batch_invariant():
426 + if vllm_is_batch_invariant():
427 self.enforce_eager = True
428
429 # Set the default seed to 0 in V1.
vllm/config/parallel.py
+2 -2
@@ -15,7 +15,7 @@ import vllm.envs as envs
15 from vllm.config.utils import config
16 from vllm.logger import init_logger
17 from vllm.model_executor.layers.batch_invariant import (
18 - vllm_kernel_override_batch_invariant,
18 + vllm_is_batch_invariant,
19 )
20 from vllm.platforms import current_platform
21 from vllm.utils import cuda_device_count_stateless, get_open_ports_list
@@ -565,7 +565,7 @@ class ParallelConfig:
565 from vllm.executor.executor_base import ExecutorBase
566
567 # Enable batch invariance settings if requested
568 - if vllm_kernel_override_batch_invariant():
568 + if vllm_is_batch_invariant():
569 self.disable_custom_all_reduce = True
570
571 if (
vllm/distributed/device_communicators/all_reduce_utils.py
+2 -2
@@ -20,7 +20,7 @@ import vllm.envs as envs
20 from vllm.distributed.device_communicators.cuda_wrapper import CudaRTLibrary
21 from vllm.logger import init_logger
22 from vllm.model_executor.layers.batch_invariant import (
23 - vllm_kernel_override_batch_invariant,
23 + vllm_is_batch_invariant,
24 )
25 from vllm.utils import cuda_device_count_stateless, update_environment_variables
26
@@ -74,7 +74,7 @@ def should_nccl_symm_mem_allreduce(world_size: int, input_tensor: torch.Tensor)
74 is_symmetric_memory_enabled,
75 )
76
77 - if vllm_kernel_override_batch_invariant():
77 + if vllm_is_batch_invariant():
78 return False
79
80 if not is_symmetric_memory_enabled():
vllm/distributed/device_communicators/symm_mem.py
+2 -2
@@ -10,7 +10,7 @@ from vllm.distributed.device_communicators.all_reduce_utils import (
10 )
11 from vllm.logger import init_logger
12 from vllm.model_executor.layers.batch_invariant import (
13 - vllm_kernel_override_batch_invariant,
13 + vllm_is_batch_invariant,
14 )
15 from vllm.platforms import current_platform
16
@@ -103,7 +103,7 @@ class SymmMemCommunicator:
103 return
104 self.force_multimem = force_multimem
105 self.disabled = False
106 - if vllm_kernel_override_batch_invariant():
106 + if vllm_is_batch_invariant():
107 self.disabled = True
108
109 def should_use_symm_mem(self, inp: torch.Tensor):
vllm/model_executor/layers/batch_invariant.py
+3 -3
@@ -741,8 +741,8 @@ def get_batch_invariant_attention_block_size() -> AttentionBlockSize:
741 return AttentionBlockSize(block_m=16, block_n=16)
742
743
744 -def vllm_kernel_override_batch_invariant():
745 - env_key = "VLLM_KERNEL_OVERRIDE_BATCH_INVARIANT"
744 +def vllm_is_batch_invariant():
745 + env_key = "VLLM_BATCH_INVARIANT"
746 is_overridden = False
747 val = os.getenv(env_key, "0")
748 try:
@@ -797,7 +797,7 @@ def override_envs_for_invariance():
797
798 def init_batch_invariance():
799 # this will hit all the csrc overrides as well
800 - if vllm_kernel_override_batch_invariant():
800 + if vllm_is_batch_invariant():
801 override_envs_for_invariance()
802 enable_batch_invariant_mode()
803
vllm/model_executor/layers/fused_moe/fused_moe.py
+5 -5
@@ -16,7 +16,7 @@ import vllm.model_executor.layers.fused_moe.modular_kernel as mk
16 from vllm import _custom_ops as ops
17 from vllm.logger import init_logger
18 from vllm.model_executor.layers.batch_invariant import (
19 - vllm_kernel_override_batch_invariant,
19 + vllm_is_batch_invariant,
20 )
21 from vllm.model_executor.layers.fused_moe.config import (
22 FUSED_MOE_UNQUANTIZED_CONFIG,
@@ -841,7 +841,7 @@ def get_moe_configs(
841 """
842
843 # Avoid optimizing for the batch invariant case. Use default config
844 - if vllm_kernel_override_batch_invariant():
844 + if vllm_is_batch_invariant():
845 return None
846
847 # First look up if an optimized configuration is available in the configs
@@ -976,7 +976,7 @@ def get_default_config(
976 dtype: str | None,
977 block_shape: list[int] | None = None,
978 ) -> dict[str, int]:
979 - if vllm_kernel_override_batch_invariant():
979 + if vllm_is_batch_invariant():
980 config = {
981 "BLOCK_SIZE_M": 64,
982 "BLOCK_SIZE_N": 64,
@@ -1136,7 +1136,7 @@ def fused_topk_bias(
1136 ) + e_score_correction_bias.unsqueeze(0)
1137
1138 # For batch invariance, use sorted=True to ensure deterministic expert selection
1139 - use_sorted = vllm_kernel_override_batch_invariant()
1139 + use_sorted = vllm_is_batch_invariant()
1140 topk_indices = torch.topk(scores_for_choice, k=topk, dim=-1, sorted=use_sorted)[1]
1141 topk_weights = scores.gather(1, topk_indices)
1142 if renormalize:
@@ -1200,7 +1200,7 @@ def grouped_topk(
1200 ) # [n, n_group]
1201
1202 # For batch invariance, use sorted=True to ensure deterministic expert selection
1203 - use_sorted = vllm_kernel_override_batch_invariant()
1203 + use_sorted = vllm_is_batch_invariant()
1204 group_idx = torch.topk(group_scores, k=topk_group, dim=-1, sorted=use_sorted)[
1205 1
1206 ] # [n, top_k_group]
vllm/model_executor/layers/layernorm.py
+3 -3
@@ -10,7 +10,7 @@ import vllm.envs as envs
10 from vllm.model_executor.custom_op import CustomOp
11 from vllm.model_executor.layers.batch_invariant import (
12 rms_norm_batch_invariant,
13 - vllm_kernel_override_batch_invariant,
13 + vllm_is_batch_invariant,
14 )
15 from vllm.platforms import current_platform
16 from vllm.utils import direct_register_custom_op
@@ -25,7 +25,7 @@ def rms_norm(
25 ) -> torch.Tensor:
26 from vllm import _custom_ops as ops
27
28 - if vllm_kernel_override_batch_invariant():
28 + if vllm_is_batch_invariant():
29 return rms_norm_batch_invariant(x, weight, variance_epsilon)
30 out = torch.empty_like(x)
31 ops.rms_norm(
@@ -45,7 +45,7 @@ def fused_add_rms_norm(
45 ) -> tuple[torch.Tensor, torch.Tensor]:
46 from vllm import _custom_ops as ops
47
48 - if vllm_kernel_override_batch_invariant():
48 + if vllm_is_batch_invariant():
49 return rms_norm_batch_invariant(
50 x + residual, weight, variance_epsilon
51 ), x + residual
vllm/model_executor/layers/quantization/fp8.py
+3 -3
@@ -15,7 +15,7 @@ from vllm import _custom_ops as ops
15 from vllm.distributed import get_tensor_model_parallel_world_size
16 from vllm.logger import init_logger
17 from vllm.model_executor.layers.batch_invariant import (
18 - vllm_kernel_override_batch_invariant,
18 + vllm_is_batch_invariant,
19 )
20 from vllm.model_executor.layers.fused_moe import (
21 FusedMoE,
@@ -356,7 +356,7 @@ class Fp8LinearMethod(LinearMethodBase):
356 # Disable marlin for rocm
357 if current_platform.is_rocm():
358 self.use_marlin = False
359 - if vllm_kernel_override_batch_invariant():
359 + if vllm_is_batch_invariant():
360 self.use_marlin = False
361
362 self.use_aiter_and_is_supported = check_aiter_fp8_linear_support()
@@ -540,7 +540,7 @@ class Fp8LinearMethod(LinearMethodBase):
540 bias: torch.Tensor | None = None,
541 ) -> torch.Tensor:
542 # If batch invariant mode is enabled, dequantize and use BF16 compute
543 - if vllm_kernel_override_batch_invariant():
543 + if vllm_is_batch_invariant():
544 # Dequantize FP8 weights to BF16
545 weight_fp8 = layer.weight.to(torch.bfloat16)
546 weight_scale = layer.weight_scale.to(torch.bfloat16)
vllm/v1/attention/backends/flash_attn.py
+5 -5
@@ -35,7 +35,7 @@ from vllm.config import VllmConfig, get_layers_from_vllm_config
35 from vllm.distributed.parallel_state import get_dcp_group
36 from vllm.logger import init_logger
37 from vllm.model_executor.layers.batch_invariant import (
38 - vllm_kernel_override_batch_invariant,
38 + vllm_is_batch_invariant,
39 )
40 from vllm.utils import cdiv
41 from vllm.v1.attention.backends.utils import (
@@ -308,7 +308,7 @@ class FlashAttentionMetadataBuilder(AttentionMetadataBuilder[FlashAttentionMetad
308 # we only set num_splits when using cuda graphs.
309 max_num_splits = self.max_num_splits
310
311 - if vllm_kernel_override_batch_invariant():
311 + if vllm_is_batch_invariant():
312 max_num_splits = 1
313
314 def schedule(
@@ -484,7 +484,7 @@ class FlashAttentionImpl(AttentionImpl):
484 self.attn_type = attn_type
485 self.vllm_flash_attn_version = get_flash_attn_version()
486 # Cache the batch invariant result for use in forward passes
487 - self.batch_invariant_enabled = vllm_kernel_override_batch_invariant()
487 + self.batch_invariant_enabled = vllm_is_batch_invariant()
488
489 if is_quantized_kv_cache(self.kv_cache_dtype) and not flash_attn_supports_fp8():
490 raise NotImplementedError(
@@ -963,7 +963,7 @@ def cascade_attention(
963 # s_aux is incorporated into prefix_lse inside the GPU kernel,
964 # enabling its effect during the final attention merge.
965 s_aux=s_aux,
966 - num_splits=1 if vllm_kernel_override_batch_invariant() else 0,
966 + num_splits=1 if vllm_is_batch_invariant() else 0,
967 )
968
969 descale_shape = (cu_query_lens.shape[0] - 1, key_cache.shape[-2])
@@ -988,7 +988,7 @@ def cascade_attention(
988 q_descale=q_descale.expand(descale_shape) if q_descale is not None else None,
989 k_descale=k_descale.expand(descale_shape) if k_descale is not None else None,
990 v_descale=v_descale.expand(descale_shape) if v_descale is not None else None,
991 - num_splits=1 if vllm_kernel_override_batch_invariant() else 0,
991 + num_splits=1 if vllm_is_batch_invariant() else 0,
992 )
993
994 # Merge prefix and suffix outputs, and store the result in output.
vllm/v1/attention/backends/flashinfer.py
+3 -3
@@ -25,7 +25,7 @@ from vllm.attention.backends.abstract import (
25 from vllm.config import CUDAGraphMode, VllmConfig
26 from vllm.logger import init_logger
27 from vllm.model_executor.layers.batch_invariant import (
28 - vllm_kernel_override_batch_invariant,
28 + vllm_is_batch_invariant,
29 )
30 from vllm.model_executor.layers.quantization.utils.quant_utils import (
31 QuantKey,
@@ -291,7 +291,7 @@ class FlashInferMetadataBuilder(AttentionMetadataBuilder[FlashInferMetadata]):
291 self._prefill_wrapper = None # Wrapper for prefill/append
292 self._decode_wrapper = None # Wrapper for decode (general shape)
293
294 - if vllm_kernel_override_batch_invariant():
294 + if vllm_is_batch_invariant():
295 self.decode_fixed_split_size = 2048
296 self.prefill_fixed_split_size = 4096
297 self.disable_split_kv = True
@@ -404,7 +404,7 @@ class FlashInferMetadataBuilder(AttentionMetadataBuilder[FlashInferMetadata]):
404 def _get_workspace_buffer(self):
405 if self._workspace_buffer is None:
406 buffer_size = FLASHINFER_WORKSPACE_BUFFER_SIZE
407 - if vllm_kernel_override_batch_invariant():
407 + if vllm_is_batch_invariant():
408 buffer_size = FLASHINFER_WORKSPACE_BUFFER_SIZE_BATCH_INVARIANT
409 self._workspace_buffer = torch.zeros(
410 buffer_size, dtype=torch.uint8, device=self.device
vllm/v1/attention/backends/flex_attention.py
+2 -2
@@ -26,7 +26,7 @@ from vllm.attention.backends.abstract import (
26 from vllm.config import VllmConfig
27 from vllm.logger import init_logger
28 from vllm.model_executor.layers.batch_invariant import (
29 - vllm_kernel_override_batch_invariant,
29 + vllm_is_batch_invariant,
30 )
31 from vllm.utils import cdiv, is_torch_equal_or_newer
32 from vllm.v1.attention.backends.utils import (
@@ -863,7 +863,7 @@ def get_kernel_options(
863 kernel_options: dict[str, int | bool] = {
864 "FORCE_USE_FLEX_ATTENTION": True,
865 }
866 - if vllm_kernel_override_batch_invariant():
866 + if vllm_is_batch_invariant():
867 kernel_options["BLOCK_M"] = 16
868 kernel_options["BLOCK_N"] = 16
869 kernel_options["IS_DIVISIBLE"] = False
vllm/v1/attention/backends/mla/common.py
+2 -2
@@ -212,7 +212,7 @@ from vllm.config import VllmConfig, get_current_vllm_config
212 from vllm.distributed.parallel_state import get_dcp_group, is_global_first_rank
213 from vllm.logger import init_logger
214 from vllm.model_executor.layers.batch_invariant import (
215 - vllm_kernel_override_batch_invariant,
215 + vllm_is_batch_invariant,
216 )
217 from vllm.model_executor.layers.linear import (
218 ColumnParallelLinear,
@@ -1283,7 +1283,7 @@ class MLACommonImpl(MLACommonBaseImpl[M], Generic[M]):
1283 # ROCm leverages the upstream flash_attn, which takes a parameter
1284 # called "return_attn_probs" instead of return_softmax_lse
1285 kwargs["return_attn_probs"] = return_softmax_lse
1286 - if vllm_kernel_override_batch_invariant():
1286 + if vllm_is_batch_invariant():
1287 kwargs["num_splits"] = 1
1288
1289 attn_out = self.flash_attn_varlen_func(
vllm/v1/attention/backends/mla/flashattn_mla.py
+3 -3
@@ -19,7 +19,7 @@ from vllm.attention.utils.fa_utils import (
19 from vllm.config import VllmConfig
20 from vllm.logger import init_logger
21 from vllm.model_executor.layers.batch_invariant import (
22 - vllm_kernel_override_batch_invariant,
22 + vllm_is_batch_invariant,
23 )
24 from vllm.v1.attention.backends.mla.common import (
25 MLACommonBackend,
@@ -110,7 +110,7 @@ class FlashAttnMLAMetadataBuilder(MLACommonMetadataBuilder[FlashAttnMLAMetadata]
110 # pre-allocated during capture.
111 self.max_num_splits = envs.VLLM_FLASH_ATTN_MAX_NUM_SPLITS_FOR_CUDA_GRAPH
112
113 - if vllm_kernel_override_batch_invariant():
113 + if vllm_is_batch_invariant():
114 self.max_num_splits = 1
115
116 def _schedule_decode(
@@ -181,7 +181,7 @@ class FlashAttnMLAMetadataBuilder(MLACommonMetadataBuilder[FlashAttnMLAMetadata]
181 # we only set num_splits when using cuda graphs.
182 max_num_splits = self.max_num_splits
183
184 - if vllm_kernel_override_batch_invariant():
184 + if vllm_is_batch_invariant():
185 max_num_splits = 1
186
187 metadata = FlashAttnMLADecodeMetadata(
vllm/v1/attention/backends/mla/flashmla.py
+2 -2
@@ -15,7 +15,7 @@ from vllm.attention.ops.flashmla import (
15 from vllm.config import VllmConfig
16 from vllm.logger import init_logger
17 from vllm.model_executor.layers.batch_invariant import (
18 - vllm_kernel_override_batch_invariant,
18 + vllm_is_batch_invariant,
19 )
20 from vllm.v1.attention.backends.mla.common import (
21 MLACommonBackend,
@@ -234,7 +234,7 @@ class FlashMLAImpl(MLACommonImpl[FlashMLAMetadata]):
234
235 tile_scheduler_metadata = attn_metadata.decode.tile_scheduler_metadata
236 num_splits = attn_metadata.decode.num_splits
237 - if vllm_kernel_override_batch_invariant():
237 + if vllm_is_batch_invariant():
238 device = q.device
239 dtype = torch.int32
240
vllm/v1/attention/backends/mla/triton_mla.py
+2 -2
@@ -14,7 +14,7 @@ from vllm.attention.ops.triton_decode_attention import decode_attention_fwd
14 from vllm.attention.ops.triton_flash_attention import triton_attention
15 from vllm.logger import init_logger
16 from vllm.model_executor.layers.batch_invariant import (
17 - vllm_kernel_override_batch_invariant,
17 + vllm_is_batch_invariant,
18 )
19 from vllm.platforms import current_platform
20 from vllm.triton_utils import HAS_TRITON
@@ -163,7 +163,7 @@ class TritonMLAImpl(MLACommonImpl[MLACommonMetadata]):
163 lse = torch.zeros(B, q_num_heads, dtype=q.dtype, device=q.device)
164
165 # For batch invariance, use only 1 split to ensure deterministic reduction
166 - num_kv_splits = 1 if vllm_kernel_override_batch_invariant() else 4
166 + num_kv_splits = 1 if vllm_is_batch_invariant() else 4
167
168 # TODO(lucas) Allocate ahead of time
169 attn_logits = torch.empty(