|
|
| import torch |
| import triton |
|
|
|
|
| @triton.testing.perf_report( |
| triton.testing.Benchmark( |
| x_names=['B', 'T', 'H', 'chunk_size'], |
| x_vals=[ |
| (b, t, h, c) |
| for b in [8] |
| for t in [2048, 4096, 8192] |
| for h in [16, 64] |
| for c in [16, 32, 64] |
| ], |
| line_arg='provider', |
| line_vals=[ |
| 'solve_tril_tma', |
| ], |
| line_names=[ |
| 'solve_tril_tma', |
| ], |
| styles=[('green', '-'), ('green', '--')], |
| ylabel="Time (ms)", |
| plot_name="solve_tril_performance", |
| args={}, |
| ), |
| ) |
| def benchmark(B, T, H, chunk_size, provider): |
| from fla.ops.utils.solve_tril import solve_tril |
| from fla.utils import device |
|
|
| requires_grad = True |
| dtype = torch.float32 |
|
|
| k = torch.randn((B, H, T, 64), dtype=dtype, device=device, requires_grad=requires_grad) |
| k = torch.nn.functional.normalize(k, dim=-1) |
|
|
| padding_size = (chunk_size - T % chunk_size) % chunk_size |
| T_padded = T + padding_size |
| k_padded = torch.nn.functional.pad(k, (0, 0, 0, padding_size, 0, 0, 0, 0)) |
| k_padded = k_padded.reshape(B, H, T_padded // chunk_size, chunk_size, 64) |
|
|
| A = (k_padded @ k_padded.transpose(-1, -2)).tril(-1) |
| A = A.permute(0, 2, 1, 3, 4).contiguous() |
| A = A.view(B, T_padded, H, chunk_size) |
| A = A[:, :T, :, :] |
|
|
| results = triton.testing.do_bench( |
| lambda: solve_tril(A), |
| quantiles=[0.5, 0.2, 0.8], |
| ) |
| return results |
|
|
|
|
| if __name__ == '__main__': |
| benchmark.run(print_data=True, save_path=".") |
|
|