@@ -3219,22 +3219,20 @@ def _flash_attention_3_varlen_hub(
32193219 if _parallel_config is None :
32203220 if attn_mask is not None :
32213221 attn_mask = _normalize_attn_mask (attn_mask , batch_size , seq_len_kv )
3222-
3223- (_ , seqlens_k ), (cu_seqlens_q , cu_seqlens_k ), (max_seqlen_q , max_seqlen_k ) = (
3224- _prepare_for_flash_attn_or_sage_varlen (
3225- batch_size , seq_len_q , seq_len_kv , attn_mask = attn_mask , device = query .device
3222+ (_ , _ ), (cu_seqlens_q , cu_seqlens_k ), (max_seqlen_q , max_seqlen_k ) = (
3223+ _prepare_for_flash_attn_or_sage_varlen_with_mask (batch_size , seq_len_q , attn_mask , query .device )
32263224 )
3227- )
3228-
3229- key_valid , value_valid = [], []
3230- for b in range (batch_size ):
3231- valid_len = seqlens_k [b ]
3232- key_valid .append (key [b , :valid_len ])
3233- value_valid .append (value [b , :valid_len ])
3225+ indices_k = attn_mask .flatten ().nonzero (as_tuple = False ).flatten ()
3226+ key_packed = key .reshape (- 1 , * key .shape [2 :])[indices_k ]
3227+ value_packed = value .reshape (- 1 , * value .shape [2 :])[indices_k ]
3228+ else :
3229+ (_ , _ ), (cu_seqlens_q , cu_seqlens_k ), (max_seqlen_q , max_seqlen_k ) = (
3230+ _prepare_for_flash_attn_or_sage_varlen_without_mask (batch_size , seq_len_q , seq_len_kv , query .device )
3231+ )
3232+ key_packed = key .flatten (0 , 1 )
3233+ value_packed = value .flatten (0 , 1 )
32343234
32353235 query_packed = query .flatten (0 , 1 )
3236- key_packed = torch .cat (key_valid , dim = 0 )
3237- value_packed = torch .cat (value_valid , dim = 0 )
32383236
32393237 func = _HUB_KERNELS_REGISTRY [AttentionBackendName ._FLASH_3_VARLEN_HUB ].kernel_fn
32403238 result = func (
0 commit comments