@@ -3024,22 +3024,20 @@ def _flash_attention_3_varlen_hub(
30243024
30253025 if attn_mask is not None :
30263026 attn_mask = _normalize_attn_mask (attn_mask , batch_size , seq_len_kv )
3027-
3028- (_ , seqlens_k ), (cu_seqlens_q , cu_seqlens_k ), (max_seqlen_q , max_seqlen_k ) = (
3029- _prepare_for_flash_attn_or_sage_varlen (
3030- batch_size , seq_len_q , seq_len_kv , attn_mask = attn_mask , device = query .device
3027+ (_ , _ ), (cu_seqlens_q , cu_seqlens_k ), (max_seqlen_q , max_seqlen_k ) = (
3028+ _prepare_for_flash_attn_or_sage_varlen_with_mask (batch_size , seq_len_q , attn_mask , query .device )
30313029 )
3032- )
3033-
3034- key_valid , value_valid = [], []
3035- for b in range (batch_size ):
3036- valid_len = seqlens_k [b ]
3037- key_valid .append (key [b , :valid_len ])
3038- value_valid .append (value [b , :valid_len ])
3030+ indices_k = attn_mask .flatten ().nonzero (as_tuple = False ).flatten ()
3031+ key_packed = key .reshape (- 1 , * key .shape [2 :])[indices_k ]
3032+ value_packed = value .reshape (- 1 , * value .shape [2 :])[indices_k ]
3033+ else :
3034+ (_ , _ ), (cu_seqlens_q , cu_seqlens_k ), (max_seqlen_q , max_seqlen_k ) = (
3035+ _prepare_for_flash_attn_or_sage_varlen_without_mask (batch_size , seq_len_q , seq_len_kv , query .device )
3036+ )
3037+ key_packed = key .flatten (0 , 1 )
3038+ value_packed = value .flatten (0 , 1 )
30393039
30403040 query_packed = query .flatten (0 , 1 )
3041- key_packed = torch .cat (key_valid , dim = 0 )
3042- value_packed = torch .cat (value_valid , dim = 0 )
30433041
30443042 func = _HUB_KERNELS_REGISTRY [AttentionBackendName ._FLASH_3_VARLEN_HUB ].kernel_fn
30453043 result = func (
0 commit comments