|
13 | 13 | from typing_extensions import override |
14 | 14 |
|
15 | 15 | try: |
16 | | - import flash_attn_3_cuda # type: ignore[import-not-found] |
| 16 | + import flash_attn_3._C as _flash_attn_3_C # type: ignore[import-not-found,import-untyped] # noqa: F401,N812 |
| 17 | + |
| 18 | + _flash_attn_3_ops: Any = torch.ops.flash_attn_3 |
17 | 19 | except ImportError: |
18 | | - _has_flash_attn_3 = False |
19 | | -else: |
20 | | - _has_flash_attn_3 = True |
| 20 | + try: |
| 21 | + import flash_attn_3_cuda as _flash_attn_3_C # type: ignore[import-not-found,no-redef] # noqa: F401,N812 |
| 22 | + |
| 23 | + _flash_attn_3_ops = _flash_attn_3_C |
| 24 | + except ImportError: |
| 25 | + _flash_attn_3_ops = None |
| 26 | + |
| 27 | +_has_flash_attn_3 = _flash_attn_3_ops is not None |
21 | 28 |
|
22 | 29 | from fairseq2.error import NotSupportedError, OperationalError |
23 | 30 | from fairseq2.models.transformer.attention_bias import ( |
@@ -148,7 +155,7 @@ def _flash_attn_3_op( |
148 | 155 | v = _contiguous(v) |
149 | 156 |
|
150 | 157 | # fmt: off |
151 | | - out, softmax_lse, *_ = flash_attn_3_cuda.fwd( |
| 158 | + out, softmax_lse, *_ = _flash_attn_3_ops.fwd( |
152 | 159 | q, |
153 | 160 | k, |
154 | 161 | v, |
@@ -324,7 +331,7 @@ def _flash_attn_3_varlen_op( |
324 | 331 | cu_seqlens_k = _contiguous(cu_seqlens_k) |
325 | 332 |
|
326 | 333 | # fmt: off |
327 | | - out, softmax_lse, *_ = flash_attn_3_cuda.fwd( |
| 334 | + out, softmax_lse, *_ = _flash_attn_3_ops.fwd( |
328 | 335 | q, |
329 | 336 | k, |
330 | 337 | v, |
@@ -483,7 +490,7 @@ def _flash_attn_3_bwd_op( |
483 | 490 | rhs_window_size: int, |
484 | 491 | ) -> None: |
485 | 492 | # fmt: off |
486 | | - flash_attn_3_cuda.bwd( |
| 493 | + _flash_attn_3_ops.bwd( |
487 | 494 | dout, |
488 | 495 | q, |
489 | 496 | k, |
|
0 commit comments