import pytest import torch import torch.nn.functional as F from fla.modules.l2norm import l2_norm from fla.utils import assert_close, device @pytest.mark.parametrize( ('B', 'T', 'H', 'D', 'dtype'), [ pytest.param(*test, id="B{}-T{}-H{}-D{}-{}".format(*test)) for test in [ (1, 63, 1, 60, torch.float), (2, 500, 4, 64, torch.float), (2, 1000, 2, 100, torch.float), (3, 1024, 4, 128, torch.float), (4, 1024, 5, 1024, torch.float16), (4, 1024, 5, 1024, torch.bfloat16), (5, 1024, 6, 2048, torch.float16), (5, 1024, 6, 2048, torch.bfloat16), ] ], ) def test_l2norm(B: int, T: int, H: int, D: int, dtype: torch.dtype): torch.manual_seed(42) x = torch.randn(B, T, H, D, dtype=dtype).to(device).requires_grad_(True) x = x * 0.5 + 0.3 ref = F.normalize(x, dim=-1, p=2) tri = l2_norm(x) ref_dx = torch.autograd.grad(ref.sum(), x)[0] tri_dx = torch.autograd.grad(tri.sum(), x)[0] assert_close('y', ref, tri, 0.005) assert_close('dx', ref_dx, tri_dx, 0.005)