#027

rms_norm

bf16 vllm · both · vllm.csrc.layernorm_kernels · importance 2.8%

Reference Implementation

reference.py
import torch
import torch.nn as nn

class Model(nn.Module):

    def __init__(self, eps: float=1e-06) -> None:
        super().__init__()
        self.eps = float(eps)

    def forward(self, x: torch.Tensor, weight: torch.Tensor) -> torch.Tensor:
        x_f = x.float()
        variance = x_f.square().mean(dim=-1, keepdim=True)
        out = x_f * torch.rsqrt(variance + self.eps) * weight.float()
        return out.to(x.dtype)

Shapes

TSOL hardware:
# token_counthidden_size TSOL(XPU-A)TProdS
0 25001024 1.93 us 9.90 us 19.5%
1 49681024 3.84 us 14.10 us 27.2%
2 100001024 7.73 us 22.80 us 33.9%
3 162001024 12.52 us 32.70 us 38.3%
4 221001024 17.08 us 42.10 us 40.6%
5 3601152 0.31 us 7.80 us 4.0%
6 7201152 0.63 us 8.10 us 7.8%
7 12001152 1.04 us 9.20 us 11.3%
8 21161152 1.84 us 12.30 us 15.0%
9 38441152 3.34 us 17.70 us 18.9%
10 81361152 7.07 us 31.10 us 22.7%
11 150001152 13.04 us 52.10 us 25.0%
12 243681152 21.19 us 81.20 us 26.1%
13 491521152 42.73 us 157.40 us 27.1%
14 655561152 57.00 us 208.00 us 27.4%
15 3128 0.00 us 7.50 us 0.0%
16 1504128 0.15 us 7.70 us 1.9%
17 2048128 0.20 us 7.70 us 2.6%
18 4096128 0.40 us 8.70 us 4.6%
19 8192128 0.79 us 11.80 us 6.7%
20 16384128 1.58 us 18.50 us 8.5%
21 24544128 2.37 us 24.40 us 9.7%
22 49024128 4.74 us 42.00 us 11.3%
23 65488128 6.33 us 53.90 us 11.7%
24 95952128 9.27 us 75.80 us 12.2%
25 131072128 12.66 us 101.10 us 12.5%
26 247680128 23.93 us 190.80 us 12.5%
27 505888128 48.87 us 371.20 us 13.2%
28 71280 0.01 us 7.50 us 0.1%
29 247521280 23.91 us 82.10 us 29.1%
30 17361536 2.01 us 11.60 us 17.3%
31 50001536 5.80 us 22.10 us 26.2%
32 1282048 0.20 us 7.70 us 2.6%
33 2562048 0.40 us 7.80 us 5.1%
34 5122048 0.79 us 8.20 us 9.6%
35 10292048 1.59 us 9.10 us 17.5%
36 20102048 3.11 us 12.60 us 24.7%
37 41742048 6.45 us 21.00 us 30.7%
38 82902048 12.81 us 34.90 us 36.7%
39 165302048 25.55 us 62.80 us 40.7%
40 205382048 31.75 us 80.50 us 39.4%
41 3256 0.00 us 7.50 us 0.0%
42 16722560 3.23 us 14.20 us 22.7%
43 2983584 0.81 us 7.90 us 10.3%
44 5143584 1.39 us 8.70 us 16.0%
45 10243584 2.77 us 11.40 us 24.3%
46 3512 0.00 us 7.40 us 0.0%
47 15120 0.01 us 7.50 us 0.1%
48 537168 0.29 us 7.70 us 3.8%
49 1417168 0.77 us 7.90 us 9.7%
50 6327168 3.42 us 12.90 us 26.5%
51 9177168 4.96 us 16.40 us 30.2%
52 16887168 9.13 us 24.90 us 36.7%
53 38047168 20.58 us 46.50 us 44.3%
54 1548192 0.96 us 8.00 us 12.0%
55 5108192 3.16 us 12.40 us 25.5%

Input Generation

input.py
import torch

def _make_inputs(token_count: int, hidden_size: int) -> dict[str, torch.Tensor]:
    x = torch.randn(token_count, hidden_size, dtype=torch.bfloat16, device='cuda') * 0.02
    weight = torch.randn(hidden_size, dtype=torch.bfloat16, device='cuda') * 0.02 + 1.0
    return {'x': x, 'weight': weight}