[NPU] adaptation to support operator FA3 in deterministic inference on NPU. (#26724)
This commit is contained in:
@@ -316,6 +316,7 @@ class AscendAttnBackend(AttentionBackend):
|
|||||||
self.token_to_kv_pool = model_runner.token_to_kv_pool
|
self.token_to_kv_pool = model_runner.token_to_kv_pool
|
||||||
self.req_to_token = model_runner.req_to_token_pool.req_to_token
|
self.req_to_token = model_runner.req_to_token_pool.req_to_token
|
||||||
self.graph_mode = False
|
self.graph_mode = False
|
||||||
|
self.use_fa = get_bool_env_var("ASCEND_USE_FA", "False")
|
||||||
self.use_fia = get_bool_env_var("ASCEND_USE_FIA", "False")
|
self.use_fia = get_bool_env_var("ASCEND_USE_FIA", "False")
|
||||||
self.enable_torch_compile = model_runner.server_args.enable_torch_compile
|
self.enable_torch_compile = model_runner.server_args.enable_torch_compile
|
||||||
self.speculative_num_draft_tokens = (
|
self.speculative_num_draft_tokens = (
|
||||||
@@ -1401,6 +1402,44 @@ class AscendAttnBackend(AttentionBackend):
|
|||||||
attn_output = attn_output.view(
|
attn_output = attn_output.view(
|
||||||
-1, layer.tp_q_head_num * layer.v_head_dim
|
-1, layer.tp_q_head_num * layer.v_head_dim
|
||||||
)
|
)
|
||||||
|
elif self.use_fa:
|
||||||
|
from flash_attn_npu_v3 import flash_attn_with_kvcache
|
||||||
|
|
||||||
|
q = q.reshape(-1, layer.tp_q_head_num, layer.qk_head_dim)
|
||||||
|
k = k_cache.view(
|
||||||
|
-1, self.page_size, layer.tp_k_head_num, layer.qk_head_dim
|
||||||
|
)
|
||||||
|
v = v_cache.view(
|
||||||
|
-1, self.page_size, layer.tp_v_head_num, layer.v_head_dim
|
||||||
|
)
|
||||||
|
extend_seq_lens = self.forward_metadata.extend_seq_lens_cpu_int.npu()
|
||||||
|
cu_seqlens_q = torch.cat(
|
||||||
|
[
|
||||||
|
torch.zeros(1, dtype=torch.int32).npu(),
|
||||||
|
extend_seq_lens.cumsum(0).to(torch.int32),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
max_seqlen_q = extend_seq_lens.max().item()
|
||||||
|
attn_output = flash_attn_with_kvcache(
|
||||||
|
q,
|
||||||
|
k,
|
||||||
|
v,
|
||||||
|
cache_seqlens=self.forward_metadata.seq_lens,
|
||||||
|
page_table=self.forward_metadata.block_tables,
|
||||||
|
cu_seqlens_q=cu_seqlens_q,
|
||||||
|
max_seqlen_q=max_seqlen_q,
|
||||||
|
softmax_scale=layer.scaling,
|
||||||
|
causal=True,
|
||||||
|
window_size=[-1, -1],
|
||||||
|
softcap=0.0,
|
||||||
|
rotary_interleaved=False,
|
||||||
|
num_splits=0,
|
||||||
|
sm_margin=0,
|
||||||
|
return_softmax_lse=False,
|
||||||
|
)
|
||||||
|
attn_output = attn_output.view(
|
||||||
|
-1, layer.tp_q_head_num * layer.v_head_dim
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
causal = True
|
causal = True
|
||||||
if (
|
if (
|
||||||
@@ -2543,6 +2582,26 @@ class AscendAttnBackend(AttentionBackend):
|
|||||||
],
|
],
|
||||||
dim=0,
|
dim=0,
|
||||||
)
|
)
|
||||||
|
elif self.use_fa:
|
||||||
|
from flash_attn_npu_v3 import flash_attn_with_kvcache
|
||||||
|
|
||||||
|
q = q.view(
|
||||||
|
forward_batch.batch_size, -1, layer.tp_q_head_num, layer.qk_head_dim
|
||||||
|
)
|
||||||
|
k = k_cache.view(
|
||||||
|
-1, self.page_size, layer.tp_k_head_num, layer.qk_head_dim
|
||||||
|
)
|
||||||
|
v = v_cache.view(
|
||||||
|
-1, self.page_size, layer.tp_v_head_num, layer.v_head_dim
|
||||||
|
)
|
||||||
|
attn_output = flash_attn_with_kvcache(
|
||||||
|
q,
|
||||||
|
k,
|
||||||
|
v,
|
||||||
|
page_table=self.forward_metadata.block_tables,
|
||||||
|
cache_seqlens=self.forward_metadata.seq_lens,
|
||||||
|
softmax_scale=layer.scaling,
|
||||||
|
)
|
||||||
# there are some accuracy issues in cross attention scene to use torch_npu._npu_flash_attention_qlens
|
# there are some accuracy issues in cross attention scene to use torch_npu._npu_flash_attention_qlens
|
||||||
# forward_batch.encoder_lens is not None in cross attention scend, we add native attn to solve accuracy issues
|
# forward_batch.encoder_lens is not None in cross attention scend, we add native attn to solve accuracy issues
|
||||||
elif forward_batch.encoder_lens is None and layer.logit_cap == 0:
|
elif forward_batch.encoder_lens is None and layer.logit_cap == 0:
|
||||||
|
|||||||
Reference in New Issue
Block a user