|
24 | 24 | # Reduce NUM_BLOCKS when it happens. |
25 | 25 | NUM_BLOCKS = 4321 # Arbitrary values for testing |
26 | 26 | PARTITION_SIZE_ROCM = 256 |
27 | | -DTYPES = [torch.bfloat16] |
| 27 | +DTYPES = [torch.bfloat16, torch.float16] |
28 | 28 | NUM_GEN_SEQS = [7] # Arbitrary values for testing |
29 | 29 | NUM_PREFILL_SEQS = [3] # Arbitrary values for testing |
30 | 30 | NUM_HEADS = [(32, 8), (40, 40), (64, 8)] # Arbitrary values for testing |
@@ -346,3 +346,54 @@ def test_num_heads_not_divisible_by_num_kv_heads(attention_cls: type) -> None: |
346 | 346 | scale=scale, |
347 | 347 | num_kv_heads=num_kv_heads, |
348 | 348 | ) |
| 349 | + |
| 350 | + |
| 351 | +UNSUPPORTED_HEAD_SIZES = [32, 80, 96, 160, 192, 224, 256] |
| 352 | + |
| 353 | + |
| 354 | +@pytest.mark.skipif( |
| 355 | + not current_platform.is_rocm(), reason="ROCm-only paged attention kernel" |
| 356 | +) |
| 357 | +@pytest.mark.parametrize("head_size", UNSUPPORTED_HEAD_SIZES) |
| 358 | +def test_paged_attention_unsupported_head_sizes( |
| 359 | + kv_cache_factory, head_size: int |
| 360 | +) -> None: |
| 361 | + """Verify ROCm paged attention rejects unsupported head sizes.""" |
| 362 | + torch.set_default_device("cuda") |
| 363 | + num_seqs, num_kv_heads, block_size, max_seq_len = 1, 8, 16, 128 |
| 364 | + scale = head_size**-0.5 |
| 365 | + |
| 366 | + query = torch.empty(num_seqs, num_kv_heads, head_size, dtype=torch.bfloat16) |
| 367 | + key_caches, value_caches = kv_cache_factory( |
| 368 | + NUM_BLOCKS, block_size, 1, num_kv_heads, head_size, "auto", torch.bfloat16, 0 |
| 369 | + ) |
| 370 | + block_tables = torch.zeros(num_seqs, 1, dtype=torch.int32) |
| 371 | + seq_lens = torch.tensor([max_seq_len], dtype=torch.int32) |
| 372 | + |
| 373 | + output = torch.empty_like(query) |
| 374 | + num_partitions = (max_seq_len + PARTITION_SIZE_ROCM - 1) // PARTITION_SIZE_ROCM |
| 375 | + tmp_output = torch.empty(num_seqs, num_kv_heads, num_partitions, head_size) |
| 376 | + exp_sums = torch.empty(num_seqs, num_kv_heads, num_partitions, dtype=torch.float32) |
| 377 | + k_scale = v_scale = torch.tensor(1.0, dtype=torch.float32, device="cuda") |
| 378 | + |
| 379 | + with pytest.raises(RuntimeError, match="Unsupported head size"): |
| 380 | + ops.paged_attention_rocm( |
| 381 | + output, |
| 382 | + exp_sums, |
| 383 | + torch.empty_like(exp_sums), |
| 384 | + tmp_output, |
| 385 | + query, |
| 386 | + key_caches[0], |
| 387 | + value_caches[0], |
| 388 | + num_kv_heads, |
| 389 | + scale, |
| 390 | + block_tables, |
| 391 | + seq_lens, |
| 392 | + None, |
| 393 | + block_size, |
| 394 | + max_seq_len, |
| 395 | + None, |
| 396 | + "auto", |
| 397 | + k_scale, |
| 398 | + v_scale, |
| 399 | + ) |
0 commit comments