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 13, 08:15 UTC
[ROCM] Fix ROCm warnings, environment flag access, and GEMM kernel naming for consistency in `_aiter_ops.py` (#28464)
Signed-off-by: vllmellm <vllm.ellm@embeddedllm.com>
vllmellm committed
Nov 13, 2025 at 05:46 UTC
d8140b98337a253f73dedd58c7d1e9b8832a9e3f
5 files changed
+33
-29
vllm/_aiter_ops.py
+27
-22
@@ -32,13 +32,13 @@ def if_aiter_supported(func: Callable) -> Callable:
32
def wrapper(*args, **kwargs):
33
# checks the platform, device arch and aiter library existance.
34
35
- from vllm.platforms.rocm import on_gfx9
35
+ if current_platform.is_rocm() and IS_AITER_FOUND:
36
+ from vllm.platforms.rocm import on_gfx9
37
37
- if current_platform.is_rocm() and on_gfx9() and IS_AITER_FOUND:
38
- return func(*args, **kwargs)
39
- else:
40
- # Return None or do nothing if not supported
41
- return None
38
+ if on_gfx9():
39
+ return func(*args, **kwargs)
40
+
41
+ return None
42
43
return wrapper
44
@@ -296,7 +296,7 @@ def _rocm_aiter_mla_decode_fwd_fake(
296
pass
297
298
299
-def _rocm_aiter_gemm_w8a8_impl(
299
+def _rocm_aiter_gemm_a8w8_impl(
300
A: torch.Tensor,
301
B: torch.Tensor,
302
As: torch.Tensor,
@@ -313,7 +313,7 @@ def _rocm_aiter_gemm_w8a8_impl(
313
return gemm_a8w8_CK(A, B, As, Bs, bias, output_dtype)
314
315
316
-def _rocm_aiter_gemm_w8a8_fake(
316
+def _rocm_aiter_gemm_a8w8_fake(
317
A: torch.Tensor,
318
B: torch.Tensor,
319
As: torch.Tensor,
@@ -327,7 +327,7 @@ def _rocm_aiter_gemm_w8a8_fake(
327
return Y
328
329
330
-def _rocm_aiter_gemm_w8a8_blockscale_impl(
330
+def _rocm_aiter_gemm_a8w8_blockscale_impl(
331
A: torch.Tensor,
332
B: torch.Tensor,
333
As: torch.Tensor,
@@ -339,7 +339,7 @@ def _rocm_aiter_gemm_w8a8_blockscale_impl(
339
return gemm_a8w8_blockscale(A, B, As, Bs, dtype=output_dtype)
340
341
342
-def _rocm_aiter_gemm_w8a8_blockscale_fake(
342
+def _rocm_aiter_gemm_a8w8_blockscale_fake(
343
A: torch.Tensor,
344
B: torch.Tensor,
345
As: torch.Tensor,
@@ -419,6 +419,7 @@ class rocm_aiter_ops:
419
_FP4_GEMM_DYNAMIC_QUANT_ASM = envs.VLLM_ROCM_USE_AITER_FP4_ASM_GEMM
420
_TRITON_ROTARY_EMBED = envs.VLLM_ROCM_USE_AITER_TRITON_ROPE
421
_MOE_SHARED_EXPERTS_ENABLED = envs.VLLM_ROCM_USE_AITER_FUSION_SHARED_EXPERTS
422
+ _TRITON_UNQUANT_GEMM = envs.VLLM_ROCM_USE_AITER_TRITON_GEMM
423
424
@classmethod
425
@if_aiter_supported
@@ -494,6 +495,11 @@ class rocm_aiter_ops:
495
def is_triton_rotary_embed_enabled(cls) -> bool:
496
return cls._AITER_ENABLED and cls._TRITON_ROTARY_EMBED
497
498
+ @classmethod
499
+ @if_aiter_supported
500
+ def is_triton_gemm_enabled(cls) -> bool:
501
+ return cls._AITER_ENABLED and cls._TRITON_UNQUANT_GEMM
502
+
503
@staticmethod
504
@if_aiter_supported
505
def register_ops_once() -> None:
@@ -555,18 +561,18 @@ class rocm_aiter_ops:
561
)
562
563
direct_register_custom_op(
558
- op_name="rocm_aiter_gemm_w8a8",
559
- op_func=_rocm_aiter_gemm_w8a8_impl,
564
+ op_name="rocm_aiter_gemm_a8w8",
565
+ op_func=_rocm_aiter_gemm_a8w8_impl,
566
mutates_args=[],
561
- fake_impl=_rocm_aiter_gemm_w8a8_fake,
567
+ fake_impl=_rocm_aiter_gemm_a8w8_fake,
568
dispatch_key=current_platform.dispatch_key,
569
)
570
571
direct_register_custom_op(
566
- op_name="rocm_aiter_gemm_w8a8_blockscale",
567
- op_func=_rocm_aiter_gemm_w8a8_blockscale_impl,
572
+ op_name="rocm_aiter_gemm_a8w8_blockscale",
573
+ op_func=_rocm_aiter_gemm_a8w8_blockscale_impl,
574
mutates_args=[],
569
- fake_impl=_rocm_aiter_gemm_w8a8_blockscale_fake,
575
+ fake_impl=_rocm_aiter_gemm_a8w8_blockscale_fake,
576
dispatch_key=current_platform.dispatch_key,
577
)
578
@@ -606,7 +612,7 @@ class rocm_aiter_ops:
612
return torch.ops.vllm.rocm_aiter_rms_norm(x, weight, variance_epsilon)
613
614
@staticmethod
609
- def gemm_w8a8(
615
+ def gemm_a8w8(
616
A: torch.Tensor,
617
B: torch.Tensor,
618
As: torch.Tensor,
@@ -614,10 +620,10 @@ class rocm_aiter_ops:
620
bias: torch.Tensor | None = None,
621
output_dtype: torch.dtype = torch.float16,
622
) -> torch.Tensor:
617
- return torch.ops.vllm.rocm_aiter_gemm_w8a8(A, B, As, Bs, bias, output_dtype)
623
+ return torch.ops.vllm.rocm_aiter_gemm_a8w8(A, B, As, Bs, bias, output_dtype)
624
625
@staticmethod
620
- def gemm_w8a8_blockscale(
626
+ def gemm_a8w8_blockscale(
627
A: torch.Tensor,
628
B: torch.Tensor,
629
As: torch.Tensor,
@@ -625,7 +631,7 @@ class rocm_aiter_ops:
631
block_size: list[int],
632
output_dtype: torch.dtype = torch.float16,
633
) -> torch.Tensor:
628
- return torch.ops.vllm.rocm_aiter_gemm_w8a8_blockscale(
634
+ return torch.ops.vllm.rocm_aiter_gemm_a8w8_blockscale(
635
A, B, As, Bs, output_dtype
636
)
637
@@ -938,5 +944,4 @@ class rocm_aiter_ops:
944
return tuple(shuffle_weight(tensor, layout=layout) for tensor in tensors)
945
946
941
-if IS_AITER_FOUND:
942
- rocm_aiter_ops.register_ops_once()
947
+rocm_aiter_ops.register_ops_once()
vllm/model_executor/layers/quantization/kernels/scaled_mm/aiter.py
+1
-1
@@ -117,4 +117,4 @@ class AiterScaledMMLinearKernel(CutlassScaledMMLinearKernel):
117
# a to be [M, K]
118
# b to be [N, K]
119
# CutlassScaledMMLinearKernel prepare weight `w_q` in [K, N] format
120
- return rocm_aiter_ops.gemm_w8a8(x_q, w_q.t(), x_s, w_s, bias, out_dtype)
120
+ return rocm_aiter_ops.gemm_a8w8(x_q, w_q.t(), x_s, w_s, bias, out_dtype)
vllm/model_executor/layers/quantization/utils/fp8_utils.py
+1
-1
@@ -328,7 +328,7 @@ class W8A8BlockFp8LinearOp:
328
if use_triton:
329
gemm_a8w8_blockscale_op = rocm_aiter_ops.triton_gemm_a8w8_blockscale
330
else:
331
- gemm_a8w8_blockscale_op = rocm_aiter_ops.gemm_w8a8_blockscale
331
+ gemm_a8w8_blockscale_op = rocm_aiter_ops.gemm_a8w8_blockscale
332
333
if input_scale is not None:
334
q_input = input_2d
vllm/model_executor/layers/utils.py
+2
-2
@@ -8,6 +8,7 @@ import torch
8
9
from vllm import _custom_ops as ops
10
from vllm import envs
11
+from vllm._aiter_ops import rocm_aiter_ops
12
from vllm.logger import init_logger
13
from vllm.platforms import CpuArchEnum, current_platform
14
from vllm.utils.torch_utils import direct_register_custom_op
@@ -105,8 +106,7 @@ def default_unquantized_gemm(
106
107
def use_aiter_triton_gemm(n, m, k, dtype):
108
if (
108
- envs.VLLM_ROCM_USE_AITER == 0
109
- or envs.VLLM_ROCM_USE_AITER_TRITON_GEMM == 0
109
+ not rocm_aiter_ops.is_triton_gemm_enabled()
110
# MI300's - fp8nuz=True
111
or current_platform.is_fp8_fnuz()
112
or dtype not in [torch.float16, torch.bfloat16]
vllm/platforms/rocm.py
+2
-3
@@ -325,6 +325,7 @@ class RocmPlatform(Platform):
325
326
@classmethod
327
def check_and_update_config(cls, vllm_config: "VllmConfig") -> None:
328
+ from vllm._aiter_ops import rocm_aiter_ops
329
from vllm.config.compilation import CUDAGraphMode
330
331
cache_config = vllm_config.cache_config
@@ -332,9 +333,7 @@ class RocmPlatform(Platform):
333
parallel_config = vllm_config.parallel_config
334
is_eager_execution = compilation_config == CUDAGraphMode.NONE
335
335
- use_aiter_rms_norm = (
336
- envs.VLLM_ROCM_USE_AITER and envs.VLLM_ROCM_USE_AITER_RMSNORM
337
- )
336
+ use_aiter_rms_norm = rocm_aiter_ops.is_rmsnorm_enabled()
337
338
if cache_config and cache_config.block_size is None:
339
cache_config.block_size = 16