|
|
| import torch |
| import triton |
|
|
| from fla.modules.activations import fast_gelu_impl as gelu |
| from fla.modules.activations import logsigmoid, sigmoid, sqrelu, swiglu, swish |
| from fla.utils import device |
|
|
| DTYPE = torch.bfloat16 |
|
|
|
|
| def fwd(fn, *args): |
| return fn(*args) |
|
|
|
|
| def fwdbwd(fn, *args): |
| y = fn(*args) |
| g = torch.randn_like(y) |
| y.backward(g) |
|
|
|
|
| @triton.testing.perf_report( |
| triton.testing.Benchmark( |
| x_names=['B', 'T', 'D'], |
| x_vals=[ |
| (b, t, d) |
| for b in [4] |
| for t in [512, 1024, 2048, 4096, 8192] |
| for d in [1024, 2048, 4096] |
| ], |
| line_arg='provider', |
| line_vals=[ |
| 'sigmoid_fwd', 'sigmoid_fwdbwd', |
| 'logsigmoid_fwd', 'logsigmoid_fwdbwd', |
| 'swish_fwd', 'swish_fwdbwd', |
| 'gelu_fwd', 'gelu_fwdbwd', |
| 'sqrelu_fwd', 'sqrelu_fwdbwd', |
| 'swiglu_fwd', 'swiglu_fwdbwd', |
| ], |
| line_names=[ |
| 'sigmoid_fwd', 'sigmoid_fwdbwd', |
| 'logsigmoid_fwd', 'logsigmoid_fwdbwd', |
| 'swish_fwd', 'swish_fwdbwd', |
| 'gelu_fwd', 'gelu_fwdbwd', |
| 'sqrelu_fwd', 'sqrelu_fwdbwd', |
| 'swiglu_fwd', 'swiglu_fwdbwd', |
| ], |
| styles=[('green', '-'), ('green', '--'), |
| ('blue', '-'), ('blue', '--'), |
| ('red', '-'), ('red', '--'), |
| ('cyan', '-'), ('cyan', '--'), |
| ('magenta', '-'), ('magenta', '--'), |
| ('yellow', '-'), ('yellow', '--')], |
| ylabel="Time (ms)", |
| plot_name="activation_performance", |
| args={}, |
| ), |
| ) |
| def benchmark(B, T, D, provider): |
| requires_grad = True |
| x = torch.randn(B, T, D, device=device, dtype=DTYPE, requires_grad=requires_grad) |
|
|
| if 'swiglu' in provider: |
| y = torch.randn_like(x) |
| inputs = (x, y) |
| elif 'bias_gelu' in provider: |
| bias = torch.randn(D, device=device, dtype=DTYPE, requires_grad=True) |
| inputs = (x, bias) |
| else: |
| inputs = (x,) |
|
|
| if provider.startswith('sigmoid'): |
| fn = sigmoid |
| elif provider.startswith('logsigmoid'): |
| fn = logsigmoid |
| elif provider.startswith('swish'): |
| fn = swish |
| elif provider.startswith('gelu'): |
| fn = gelu |
| elif provider.startswith('sqrelu'): |
| fn = sqrelu |
| elif provider.startswith('swiglu'): |
| fn = swiglu |
| else: |
| raise ValueError(provider) |
|
|
| if provider.endswith('fwd'): |
| fn_to_call = lambda: fwd(fn, *inputs) |
| elif provider.endswith('fwdbwd'): |
| fn_to_call = lambda: fwdbwd(fn, *inputs) |
| else: |
| raise ValueError(provider) |
|
|
| ms, min_ms, max_ms = triton.testing.do_bench( |
| fn_to_call, |
| quantiles=[0.5, 0.2, 0.8], |
| ) |
| return ms, min_ms, max_ms |
|
|
|
|
| if __name__ == '__main__': |
| benchmark.run(print_data=True, save_path='./activation_benchmark') |
|
|