|
48 | 48 | ) |
49 | 49 | from maxtext.layers.attentions import Attention |
50 | 50 | from maxtext.layers import embeddings |
| 51 | +from maxtext.kernels.attention import jax_flash_attention |
51 | 52 | from maxtext.configs import pyconfig |
52 | 53 | from maxtext.models.qwen3 import Qwen3NextGatedDeltaNet |
53 | 54 | import numpy as np |
|
57 | 58 | from tests.utils.test_helpers import get_test_config_path |
58 | 59 |
|
59 | 60 |
|
| 61 | +class JaxFlashAttentionTest(unittest.TestCase): |
| 62 | + """Tests for JAX flash attention.""" |
| 63 | + |
| 64 | + def test_flash_attention_block_masked_soft_cap(self): |
| 65 | + cap = 1.0 |
| 66 | + mask_value = -1.0e9 |
| 67 | + query = jnp.array([[[[10.0], [10.0]]]], dtype=jnp.float32) |
| 68 | + key = jnp.array([[[[10.0], [0.0]]]], dtype=jnp.float32) |
| 69 | + value = jnp.array([[[[1.0], [3.0]]]], dtype=jnp.float32) |
| 70 | + mask = jnp.array([[True, True], [True, False]]) |
| 71 | + |
| 72 | + output = jax_flash_attention.flash_attention_block_masked( |
| 73 | + query, |
| 74 | + key, |
| 75 | + value, |
| 76 | + segment_ids=None, |
| 77 | + block_kv=2, |
| 78 | + block_q=1, |
| 79 | + mask=mask, |
| 80 | + mask_value=mask_value, |
| 81 | + cap=cap, |
| 82 | + ) |
| 83 | + |
| 84 | + logits = jnp.einsum("bhqd,bhkd->bhqk", query, key) |
| 85 | + logits = jnp.tanh(logits / cap) * cap |
| 86 | + logits = jnp.where(mask[None, None, :, :], logits, mask_value) |
| 87 | + expected = jnp.einsum("bhqk,bhkd->bhqd", jax.nn.softmax(logits, axis=-1), value) |
| 88 | + np.testing.assert_allclose( |
| 89 | + np.asarray(output), |
| 90 | + np.asarray(expected), |
| 91 | + rtol=1e-6, |
| 92 | + atol=1e-6, |
| 93 | + ) |
| 94 | + |
| 95 | + |
60 | 96 | class SplashLocalMaskTest(unittest.TestCase): |
61 | 97 | """Tests for Splash local masks.""" |
62 | 98 |
|
|
0 commit comments