#015

l2_norm

bf16 vllm · both · vllm.model_executor.layers.fla.ops.l2norm · importance 0.5%

Reference Implementation

reference.py
import torch
import torch.nn as nn

class Model(nn.Module):

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

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x_float = x.float()
        norm_sq = (x_float * x_float).sum(dim=-1, keepdim=True)
        return (x_float * torch.rsqrt(norm_sq + self.eps)).to(x.dtype)

Shapes

TSOL hardware:
# num_tokenshidden_size TSOL(XPU-A)TProdS
0 12048 0.00 us 7.60 us 0.0%
1 1282048 0.20 us 7.70 us 2.6%
2 2562048 0.40 us 7.90 us 5.1%
3 4802048 0.74 us 9.00 us 8.2%
4 23042048 3.56 us 21.50 us 16.6%
5 40642048 6.28 us 30.00 us 20.9%
6 87362048 13.50 us 59.00 us 22.9%
7 166082048 25.67 us 117.20 us 21.9%
8 244802048 37.84 us 173.30 us 21.8%
9 487042048 75.28 us 315.90 us 23.8%
10 657922048 101.69 us 430.00 us 23.6%
11 988802048 152.83 us 635.00 us 24.1%
12 1310722048 202.59 us 853.10 us 23.7%

Input Generation

input.py
import torch

def _make_inputs(num_tokens: int, hidden_size: int, dtype: str='bfloat16') -> dict[str, torch.Tensor]:
    dt = getattr(torch, dtype)
    return {'x': torch.randn(num_tokens, hidden_size, dtype=dt, device='cuda')}

def get_inputs() -> list[torch.Tensor]:
    return list(_make_inputs(num_tokens=1024, hidden_size=128).values())

def get_init_inputs() -> dict[str, object]:
    return {'hidden_size': 128}