| import pytest |
| import torch |
| from kernels.rank_estimator import sketch_rank, estimate_prune_counts |
| from tests.conftest import make_softmax_matrix |
|
|
|
|
| def test_single_matrix(device): |
| P = make_softmax_matrix(1, 77, 196, device) |
| svd = torch.linalg.matrix_rank(P[0]).item() |
| skc = sketch_rank(P).item() |
| assert abs(svd - skc) <= 2 |
|
|
|
|
| def test_batched(device): |
| B, T, V = 8, 77, 196 |
| P = make_softmax_matrix(B, T, V, device) |
| svd = torch.stack([torch.linalg.matrix_rank(P[i]) for i in range(B)]).float() |
| skc = sketch_rank(P).float() |
| assert (svd - skc).abs().max().item() <= 2 |
|
|
|
|
| def test_known_low_rank(device): |
| torch.manual_seed(0) |
| U = torch.randn(50, 5, device=device) |
| V = torch.randn(5, 100, device=device) |
| A = (U @ V).unsqueeze(0) |
| assert abs(sketch_rank(A).item() - 5) <= 2 |
|
|
|
|
| def test_prune_counts_valid(device): |
| P = make_softmax_matrix(4, 32, 196, device) |
| counts = estimate_prune_counts(P, 196) |
| assert counts.shape == (4,) |
| assert (counts >= 0).all() |
| assert (counts < 196).all() |
|
|
|
|
| def test_high_res(device): |
| P = make_softmax_matrix(4, 128, 576, device) |
| ranks = sketch_rank(P) |
| assert ranks.shape == (4,) |
| assert (ranks > 0).all() |
|
|