Skip to content

Commit 195bed2

Browse files
committed
feat(mtp): MTP verify-decode infrastructure
Model-agnostic verify-decode machinery: MTP-verify dispatch in TpPartBaseModel, dedicated decode CUDA-graph capture/replay for the (mtp_step+1)-expanded verify layout, a shared mtp_verify_extra_state block on infer_struct/batch_objs, fa3 decode attention narrowed to the verify layout (b_att_seq_len + causal) for fp/fp8/mla, and env/kv-cache helpers for MTP added-layer accounting.
1 parent 41ed8e9 commit 195bed2

10 files changed

Lines changed: 477 additions & 192 deletions

File tree

lightllm/common/basemodel/attention/fa3/fp.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from lightllm.utils.envs_utils import get_env_start_args
88
from lightllm.common.basemodel.triton_kernel.fa3_utils import page_table_copy
99
from lightllm.common.basemodel.triton_kernel.gen_prefill_params import gen_cumsum_pad0_tensor
10+
from lightllm.common.basemodel.batch_objs import is_mtp_verify_decode as is_mtp_verify_decode_fn
1011

1112

1213
class Fa3AttBackend(BaseAttBackend):
@@ -125,8 +126,9 @@ class Fa3DecodeAttState(BaseDecodeAttState):
125126
def init_state(self):
126127
self.backend: Fa3AttBackend = self.backend
127128
args_mtp_step = get_env_start_args().mtp_step
129+
is_mtp_verify_decode = is_mtp_verify_decode_fn(args_mtp_step, self.infer_state.b_num_accepted_tokens)
128130

129-
if args_mtp_step > 0:
131+
if is_mtp_verify_decode:
130132
# 修正 mtp 在 fa3 下的输入。
131133
mtp_size = args_mtp_step + 1
132134
b_q_seq_len = torch.full(
@@ -143,8 +145,9 @@ def init_state(self):
143145
self.cu_seqlens_q = self.infer_state.b1_cu_q_seq_len.int()
144146
self.cu_seqlens_k = self.infer_state.b1_cu_kv_seq_len.int()
145147

146-
att_batch_size = self.infer_state.batch_size // (args_mtp_step + 1)
147-
assert self.infer_state.batch_size % (args_mtp_step + 1) == 0
148+
mtp_size = args_mtp_step + 1 if is_mtp_verify_decode else 1
149+
att_batch_size = self.infer_state.batch_size // mtp_size
150+
assert self.infer_state.batch_size % mtp_size == 0
148151

149152
model = self.backend.model
150153
# 可以使用 cuda graph的时候从 buffer中申请
@@ -163,7 +166,7 @@ def init_state(self):
163166
device=self.infer_state.input_ids.device,
164167
)
165168

166-
if args_mtp_step > 0:
169+
if is_mtp_verify_decode:
167170
page_table_copy(
168171
page_table=self.page_table[:, : self.infer_state.max_kv_seq_len],
169172
req_to_token_indexs=model.req_manager.req_to_token_indexs,

lightllm/common/basemodel/attention/fa3/fp8.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from ..base_att import AttControl
44
from typing import Optional, TYPE_CHECKING
55
from lightllm.utils.sgl_utils import flash_attn_with_kvcache
6-
from lightllm.utils.envs_utils import get_env_start_args
76
from lightllm.common.basemodel.triton_kernel.quantization.q_per_head_fp8_quant import q_per_head_fp8_quant
87
from lightllm.utils.vllm_utils import HAS_VLLM, vllm_ops
98
from typing import Union
@@ -45,9 +44,12 @@ def init_state(self):
4544
torch.arange(batch_size, device=device), self.infer_state.b_q_seq_len
4645
)
4746
# 为了减少推理计算量,在推理外部初始化k_descale和v_descale
48-
self.k_descale = offline_scales[:, :head_num].view(-1, 1, head_num).expand(offline_scales.shape[0], batch_size, head_num)
49-
self.v_descale = offline_scales[:, head_num:].view(-1, 1, head_num).expand(offline_scales.shape[0], batch_size, head_num)
50-
47+
self.k_descale = (
48+
offline_scales[:, :head_num].view(-1, 1, head_num).expand(offline_scales.shape[0], batch_size, head_num)
49+
)
50+
self.v_descale = (
51+
offline_scales[:, head_num:].view(-1, 1, head_num).expand(offline_scales.shape[0], batch_size, head_num)
52+
)
5153

5254
def prefill_att(
5355
self,
@@ -116,20 +118,19 @@ def init_state(self):
116118
super().init_state()
117119
self.backend: Fp8Fa3AttBackend = self.backend
118120

119-
args_mtp_step = get_env_start_args().mtp_step
120-
att_batch_size = self.infer_state.batch_size // (args_mtp_step + 1)
121-
assert self.infer_state.batch_size % (args_mtp_step + 1) == 0
122-
123-
device = self.infer_state.input_ids.device
124-
batch_size = att_batch_size
121+
batch_size = self.b_att_seq_len.shape[0]
125122
mem_manager = self.backend.model.mem_manager
126123

127124
offline_scales: torch.Tensor = mem_manager.scales
128125
head_num = mem_manager.head_num
129126

130127
# 为了减少推理计算量,在推理外部初始化k_descale和v_descale
131-
self.k_descale = offline_scales[:, :head_num].view(-1, 1, head_num).expand(offline_scales.shape[0], batch_size, head_num)
132-
self.v_descale = offline_scales[:, head_num:].view(-1, 1, head_num).expand(offline_scales.shape[0], batch_size, head_num)
128+
self.k_descale = (
129+
offline_scales[:, :head_num].view(-1, 1, head_num).expand(offline_scales.shape[0], batch_size, head_num)
130+
)
131+
self.v_descale = (
132+
offline_scales[:, head_num:].view(-1, 1, head_num).expand(offline_scales.shape[0], batch_size, head_num)
133+
)
133134

134135
return
135136

@@ -180,11 +181,11 @@ def _fp8_decode_att(
180181
k_cache=cache_k,
181182
v_cache=cache_v,
182183
page_table=self.page_table,
183-
cache_seqlens=self.infer_state.b_seq_len,
184+
cache_seqlens=self.b_att_seq_len,
184185
cu_seqlens_q=self.cu_seqlens_q,
185186
cu_seqlens_k_new=self.cu_seqlens_k,
186187
max_seqlen_q=self.decode_max_q_seq_len,
187-
causal=False,
188+
causal=True,
188189
window_size=(-1, -1),
189190
softcap=0.0,
190191
q_descale=q_scale.view(self.infer_state.batch_size, k_head_num),

lightllm/common/basemodel/attention/fa3/mla.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from lightllm.common.basemodel.triton_kernel.fa3_utils import page_table_copy
99
from lightllm.common.basemodel.triton_kernel.gen_prefill_params import gen_cumsum_pad0_tensor
1010
from lightllm.utils.sgl_utils import flash_attn_varlen_func
11+
from lightllm.common.basemodel.batch_objs import is_mtp_verify_decode as is_mtp_verify_decode_fn
1112

1213

1314
class MlaFa3AttBackend(BaseAttBackend):
@@ -108,8 +109,9 @@ class MlaFa3DecodeAttState(BaseDecodeAttState):
108109
def init_state(self):
109110
self.backend: MlaFa3AttBackend = self.backend
110111
args_mtp_step = get_env_start_args().mtp_step
112+
is_mtp_verify_decode = is_mtp_verify_decode_fn(args_mtp_step, self.infer_state.b_num_accepted_tokens)
111113

112-
if args_mtp_step > 0:
114+
if is_mtp_verify_decode:
113115
# 修正 mtp 在 fa3 下的输入。
114116
mtp_size = args_mtp_step + 1
115117
b_q_seq_len = torch.full(
@@ -126,8 +128,9 @@ def init_state(self):
126128
self.cu_seqlens_q = self.infer_state.b1_cu_q_seq_len.int()
127129
self.cu_seqlens_k = self.infer_state.b1_cu_kv_seq_len.int()
128130

129-
att_batch_size = self.infer_state.batch_size // (args_mtp_step + 1)
130-
assert self.infer_state.batch_size % (args_mtp_step + 1) == 0
131+
mtp_size = args_mtp_step + 1 if is_mtp_verify_decode else 1
132+
att_batch_size = self.infer_state.batch_size // mtp_size
133+
assert self.infer_state.batch_size % mtp_size == 0
131134

132135
model = self.backend.model
133136
# 可以使用 cuda graph的时候从 buffer中申请
@@ -146,7 +149,7 @@ def init_state(self):
146149
device=self.infer_state.input_ids.device,
147150
)
148151

149-
if args_mtp_step > 0:
152+
if is_mtp_verify_decode:
150153
page_table_copy(
151154
page_table=self.page_table[:, : self.infer_state.max_kv_seq_len],
152155
req_to_token_indexs=model.req_manager.req_to_token_indexs,

0 commit comments

Comments
 (0)