[Feature] support aclgraph for model runner v2 (#7110)
### What this PR does / why we need it?
This PR aims to support aclgraph for model runner v2, please see RFC
#5208. The PR contains these modifications:
- adapt to newest commit of vllm main branch.
- supply a unified interface of extra forward context for both model
runner v1 and model runner v2.
- implement graph mode for main model.
### Does this PR introduce _any_ user-facing change?
no
### How was this patch tested?
- vLLM version: v0.16.0
- vLLM main:
4034c3d32e
---------
Signed-off-by: Ronald1995 <ronaldautomobile@163.com>
This commit is contained in:
@@ -23,7 +23,6 @@ import torch
|
||||
import torch_npu
|
||||
import vllm.envs as envs_vllm
|
||||
from vllm.config import VllmConfig, get_current_vllm_config
|
||||
from vllm.forward_context import ForwardContext, get_forward_context
|
||||
from vllm.utils.math_utils import cdiv
|
||||
from vllm.v1.attention.backend import ( # type: ignore
|
||||
AttentionBackend,
|
||||
@@ -40,6 +39,7 @@ from vllm.v1.attention.backends.registry import ( # type: ignore
|
||||
from vllm.v1.core.sched.output import SchedulerOutput
|
||||
from vllm.v1.kv_cache_interface import AttentionSpec, CrossAttentionSpec
|
||||
|
||||
from vllm_ascend.ascend_forward_context import _EXTRA_CTX
|
||||
from vllm_ascend.attention.attention_mask import AttentionMaskBuilder
|
||||
from vllm_ascend.attention.context_parallel.common_cp import AscendMetadataForDecode, AscendMetadataForPrefill
|
||||
from vllm_ascend.attention.utils import (
|
||||
@@ -392,7 +392,7 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
):
|
||||
if using_paged_attention(num_tokens, vllm_config):
|
||||
# Paged Attention update logic
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
graph_params = get_draft_graph_params()
|
||||
else:
|
||||
graph_params = get_graph_params()
|
||||
@@ -444,7 +444,7 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
event.record(update_stream)
|
||||
else:
|
||||
# FIA update logic
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
graph_params = get_draft_graph_params()
|
||||
attn_metadata = draft_attn_metadatas
|
||||
attn_keys = list(attn_metadata[0].keys())
|
||||
@@ -462,7 +462,7 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
num_layers = len(attn_keys)
|
||||
if num_layers == 0:
|
||||
return
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
attn_keys = attn_keys * (len(graph_params.attn_params[num_tokens]) // num_layers)
|
||||
attn_count = 0
|
||||
with torch.npu.stream(update_stream):
|
||||
@@ -488,7 +488,7 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
softmax_lse,
|
||||
) = param
|
||||
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
draft_step = attn_count // num_layers
|
||||
seq_lens = attn_metadata[draft_step][key].seq_lens_list
|
||||
actual_seq_lengths_q = attn_metadata[draft_step][key].actual_seq_lengths_q
|
||||
@@ -535,8 +535,7 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
key, value, block_size, block_table, actual_seq_lengths_kv = self._get_fia_params(key, value, attn_metadata)
|
||||
|
||||
num_tokens = attn_metadata.actual_seq_lengths_q[-1]
|
||||
forward_context = get_forward_context()
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
graph_params = get_draft_graph_params()
|
||||
else:
|
||||
graph_params = get_graph_params()
|
||||
@@ -563,7 +562,7 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
sparse_mode=3,
|
||||
scale=self.scale,
|
||||
)
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
update_draft_graph_params_workspaces(num_tokens, workspace)
|
||||
else:
|
||||
update_graph_params_workspaces(num_tokens, workspace)
|
||||
@@ -625,9 +624,8 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
output: torch.Tensor | None = None,
|
||||
):
|
||||
graph_params = get_graph_params()
|
||||
forward_context: ForwardContext = get_forward_context()
|
||||
num_tokens = query.shape[0]
|
||||
if forward_context.capturing:
|
||||
if _EXTRA_CTX.capturing:
|
||||
# Get workspace from cache or calculate it if not present.
|
||||
workspace = graph_params.workspaces.get(num_tokens)
|
||||
if workspace is None:
|
||||
@@ -761,11 +759,10 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
attn_metadata: AscendMetadata,
|
||||
output: torch.Tensor,
|
||||
):
|
||||
forward_context: ForwardContext = get_forward_context()
|
||||
# we inherit ForwardContext in model runner v2, when enable model
|
||||
# runner v2, there is not capturing attribute in forward_context,
|
||||
# just use getattr to avoid attribute error.
|
||||
if getattr(forward_context, "capturing", False):
|
||||
if _EXTRA_CTX.capturing:
|
||||
attn_output, num_tokens = self.full_graph_fia(query, key, value, attn_metadata, output)
|
||||
output[:num_tokens] = attn_output[:num_tokens]
|
||||
return output
|
||||
@@ -841,8 +838,7 @@ class AscendAttentionBackendImpl(AttentionImpl):
|
||||
attn_metadata: AscendMetadata,
|
||||
output: torch.Tensor | None = None,
|
||||
) -> torch.Tensor:
|
||||
forward_context: ForwardContext = get_forward_context()
|
||||
if forward_context.capturing:
|
||||
if _EXTRA_CTX.capturing:
|
||||
return self.full_graph_pa(query, attn_metadata, output)
|
||||
torch_npu._npu_paged_attention(
|
||||
query=query,
|
||||
|
||||
@@ -29,10 +29,10 @@ from vllm.distributed import (
|
||||
get_decode_context_model_parallel_world_size,
|
||||
get_pcp_group,
|
||||
)
|
||||
from vllm.forward_context import ForwardContext, get_forward_context
|
||||
from vllm.v1.attention.backend import AttentionCGSupport
|
||||
from vllm.v1.kv_cache_interface import AttentionSpec
|
||||
|
||||
from vllm_ascend.ascend_forward_context import _EXTRA_CTX
|
||||
from vllm_ascend.attention.attention_v1 import (
|
||||
AscendAttentionBackendImpl,
|
||||
AscendAttentionMetadataBuilder,
|
||||
@@ -559,9 +559,8 @@ class AscendAttentionCPImpl(AscendAttentionBackendImpl):
|
||||
"actual_seq_lengths": torch.arange(attn_metadata.num_decodes_flatten) + 1,
|
||||
}
|
||||
graph_params = get_graph_params()
|
||||
forward_context: ForwardContext = get_forward_context()
|
||||
num_tokens = query.shape[0]
|
||||
if forward_context.capturing:
|
||||
if _EXTRA_CTX.capturing:
|
||||
stream = torch_npu.npu.current_stream()
|
||||
|
||||
event = torch.npu.ExternalEvent()
|
||||
|
||||
@@ -10,7 +10,6 @@ from vllm.distributed import (
|
||||
get_decode_context_model_parallel_world_size,
|
||||
get_pcp_group,
|
||||
)
|
||||
from vllm.forward_context import ForwardContext, get_forward_context
|
||||
from vllm.utils.math_utils import cdiv
|
||||
from vllm.v1.attention.backend import AttentionCGSupport
|
||||
from vllm.v1.kv_cache_interface import AttentionSpec, MLAAttentionSpec
|
||||
@@ -30,6 +29,7 @@ from vllm_ascend.attention.mla_v1 import (
|
||||
)
|
||||
# isort: on
|
||||
|
||||
from vllm_ascend.ascend_forward_context import _EXTRA_CTX
|
||||
from vllm_ascend.attention.context_parallel.common_cp import (
|
||||
AscendPCPMetadata,
|
||||
CPChunkedContextMetadata,
|
||||
@@ -294,7 +294,7 @@ class AscendMlaCPImpl(AscendMLAImpl):
|
||||
num_dcp_pcp_tokens=None,
|
||||
draft_attn_metadatas=None,
|
||||
):
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
graph_params = get_draft_graph_params()
|
||||
else:
|
||||
graph_params = get_graph_params()
|
||||
@@ -659,12 +659,11 @@ class AscendMlaCPImpl(AscendMLAImpl):
|
||||
"softmax_lse_flag": True,
|
||||
}
|
||||
|
||||
forward_context: ForwardContext = get_forward_context()
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
graph_params = get_draft_graph_params()
|
||||
else:
|
||||
graph_params = get_graph_params()
|
||||
if forward_context.capturing:
|
||||
if _EXTRA_CTX.capturing:
|
||||
stream = torch_npu.npu.current_stream()
|
||||
event = torch.npu.ExternalEvent()
|
||||
event.wait(stream)
|
||||
|
||||
@@ -6,16 +6,20 @@ import torch
|
||||
import torch_npu
|
||||
import vllm.envs as envs_vllm
|
||||
from vllm.config import VllmConfig, get_current_vllm_config
|
||||
from vllm.forward_context import ForwardContext, get_forward_context
|
||||
from vllm.logger import logger
|
||||
from vllm.model_executor.layers.attention.mla_attention import MLACommonMetadataBuilder
|
||||
from vllm.model_executor.layers.linear import UnquantizedLinearMethod
|
||||
from vllm.utils.math_utils import cdiv, round_down
|
||||
from vllm.v1.attention.backend import AttentionBackend, AttentionCGSupport, MLAAttentionImpl # type: ignore
|
||||
from vllm.v1.attention.backend import (
|
||||
AttentionBackend, # type: ignore
|
||||
AttentionCGSupport,
|
||||
MLAAttentionImpl,
|
||||
)
|
||||
from vllm.v1.attention.backends.utils import PAD_SLOT_ID # type: ignore
|
||||
from vllm.v1.kv_cache_interface import AttentionSpec, MLAAttentionSpec
|
||||
|
||||
from vllm_ascend.ascend_config import get_ascend_config
|
||||
from vllm_ascend.ascend_forward_context import _EXTRA_CTX
|
||||
from vllm_ascend.attention.attention_mask import AttentionMaskBuilder
|
||||
from vllm_ascend.attention.attention_v1 import AscendAttentionState
|
||||
from vllm_ascend.attention.context_parallel.common_cp import AscendPCPMetadata, CPChunkedContextMetadata
|
||||
@@ -44,12 +48,7 @@ from vllm_ascend.ops.layer_shard_linear import (
|
||||
)
|
||||
from vllm_ascend.ops.rotary_embedding import get_cos_and_sin_mla
|
||||
from vllm_ascend.quantization.methods import AscendW8A8LinearMethod
|
||||
from vllm_ascend.utils import (
|
||||
ACL_FORMAT_FRACTAL_ND,
|
||||
get_weight_prefetch_method,
|
||||
maybe_trans_nz,
|
||||
weak_ref_tensors,
|
||||
)
|
||||
from vllm_ascend.utils import ACL_FORMAT_FRACTAL_ND, get_weight_prefetch_method, maybe_trans_nz, weak_ref_tensors
|
||||
from vllm_ascend.worker.npu_input_batch import NPUInputBatch
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@@ -737,7 +736,7 @@ class AscendMLAImpl(MLAAttentionImpl):
|
||||
num_dcp_pcp_tokens=None,
|
||||
draft_attn_metadatas=None,
|
||||
):
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
graph_params = get_draft_graph_params()
|
||||
else:
|
||||
graph_params = get_graph_params()
|
||||
@@ -769,12 +768,12 @@ class AscendMLAImpl(MLAAttentionImpl):
|
||||
softmax_lse,
|
||||
) = param
|
||||
seq_lens_list = forward_context.attn_metadata[key].decode.seq_lens_list
|
||||
if speculative_config and speculative_config.method == "mtp" and not forward_context.is_draft_model:
|
||||
if speculative_config and speculative_config.method == "mtp" and not _EXTRA_CTX.is_draft_model:
|
||||
actual_seq_lengths = forward_context.attn_metadata[key].decode.actual_seq_lengths_q
|
||||
spec_multiple = speculative_config.num_speculative_tokens + 1
|
||||
seq_lens_list = seq_lens_list + [0] * (num_tokens // spec_multiple - len(seq_lens_list))
|
||||
actual_seq_lengths = [spec_multiple * (i + 1) for i in range(num_tokens // spec_multiple)]
|
||||
elif forward_context.is_draft_model:
|
||||
elif _EXTRA_CTX.is_draft_model:
|
||||
actual_seq_lengths = forward_context.attn_metadata[key].decode.actual_seq_lengths_q
|
||||
block_table = forward_context.attn_metadata[key].decode.block_table
|
||||
# TODO: This is a hack and should be fixed in the future.
|
||||
@@ -1243,12 +1242,11 @@ class AscendMLAImpl(MLAAttentionImpl):
|
||||
"actual_seq_lengths": actual_seq_lengths,
|
||||
"actual_seq_lengths_kv": decode_meta.seq_lens_list,
|
||||
}
|
||||
forward_context: ForwardContext = get_forward_context()
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
graph_params = get_draft_graph_params()
|
||||
else:
|
||||
graph_params = get_graph_params()
|
||||
if forward_context.capturing:
|
||||
if _EXTRA_CTX.capturing:
|
||||
stream = torch_npu.npu.current_stream()
|
||||
|
||||
event = torch.npu.ExternalEvent()
|
||||
@@ -1261,7 +1259,7 @@ class AscendMLAImpl(MLAAttentionImpl):
|
||||
workspace = torch_npu._npu_fused_infer_attention_score_get_max_workspace(
|
||||
q_nope, k_nope, k_nope, **common_kwargs
|
||||
)
|
||||
if forward_context.is_draft_model:
|
||||
if _EXTRA_CTX.is_draft_model:
|
||||
update_draft_graph_params_workspaces(num_tokens, workspace)
|
||||
else:
|
||||
update_graph_params_workspaces(num_tokens, workspace)
|
||||
@@ -1493,7 +1491,6 @@ class AscendMLAImpl(MLAAttentionImpl):
|
||||
reach_layer_for_shard_weight_series(layer)
|
||||
return output.fill_(0)
|
||||
|
||||
forward_context = get_forward_context()
|
||||
num_actual_tokens = self.get_num_actual_tokens(attn_metadata)
|
||||
assert (
|
||||
attn_metadata.num_decodes is not None
|
||||
@@ -1505,7 +1502,7 @@ class AscendMLAImpl(MLAAttentionImpl):
|
||||
num_decode_tokens = attn_metadata.num_decode_tokens
|
||||
# Inputs and outputs may be padded for CUDA graphs
|
||||
output_padded = output
|
||||
o_proj_input_shape = (forward_context.num_tokens, self.num_heads * self.v_head_dim)
|
||||
o_proj_input_shape = (_EXTRA_CTX.num_tokens, self.num_heads * self.v_head_dim)
|
||||
o_proj_input = torch.empty(o_proj_input_shape, dtype=hidden_states.dtype, device=hidden_states.device)
|
||||
|
||||
# MLA Preprocess
|
||||
|
||||
@@ -7,16 +7,20 @@ import vllm.envs as envs_vllm
|
||||
from torch import nn
|
||||
from vllm.config import VllmConfig, get_current_vllm_config
|
||||
from vllm.distributed import get_tensor_model_parallel_world_size, get_tp_group
|
||||
from vllm.forward_context import get_forward_context
|
||||
from vllm.logger import logger
|
||||
from vllm.model_executor.layers.attention.mla_attention import MLACommonMetadataBuilder
|
||||
from vllm.model_executor.layers.linear import UnquantizedLinearMethod
|
||||
from vllm.triton_utils import HAS_TRITON
|
||||
from vllm.v1.attention.backend import AttentionBackend, AttentionCGSupport, MLAAttentionImpl # type: ignore
|
||||
from vllm.v1.attention.backend import (
|
||||
AttentionBackend, # type: ignore
|
||||
AttentionCGSupport,
|
||||
MLAAttentionImpl,
|
||||
)
|
||||
from vllm.v1.kv_cache_interface import AttentionSpec
|
||||
|
||||
from vllm_ascend import envs
|
||||
from vllm_ascend.ascend_config import get_ascend_config
|
||||
from vllm_ascend.ascend_forward_context import _EXTRA_CTX
|
||||
from vllm_ascend.attention.attention_mask import AttentionMaskBuilder
|
||||
from vllm_ascend.attention.attention_v1 import AscendAttentionState
|
||||
from vllm_ascend.attention.context_parallel.common_cp import AscendPCPMetadata
|
||||
@@ -967,10 +971,9 @@ class AscendSFAImpl(MLAAttentionImpl):
|
||||
output: torch.Tensor | None = None,
|
||||
) -> torch.Tensor:
|
||||
assert output is not None, "Output tensor must be provided."
|
||||
forward_context = get_forward_context()
|
||||
if attn_metadata is None:
|
||||
# Profiling run.
|
||||
if self.enable_dsa_cp_with_layer_shard and not forward_context.in_profile_run:
|
||||
if self.enable_dsa_cp_with_layer_shard and not _EXTRA_CTX.in_profile_run:
|
||||
for layer in self.layer_sharding_kwargs or []:
|
||||
if is_hidden_layer(layer):
|
||||
reach_layer_for_shard_weight_series(layer)
|
||||
|
||||
Reference in New Issue
Block a user