nano-rmsnorm

nano-vllm/nanovllm/layers/layernorm.py · bb823b3 · L5–50 · 固定 commit 上游

这是固定版本源码的只读摘录;可在线阅读,也可通过上游链接查看原文件。

5class RMSNorm(nn.Module):
6
7    def __init__(
8        self,
9        hidden_size: int,
10        eps: float = 1e-6,
11    ) -> None:
12        super().__init__()
13        self.eps = eps
14        self.weight = nn.Parameter(torch.ones(hidden_size))
15
16    @torch.compile
17    def rms_forward(
18        self,
19        x: torch.Tensor,
20    ) -> torch.Tensor:
21        orig_dtype = x.dtype
22        x = x.float()
23        var = x.pow(2).mean(dim=-1, keepdim=True)
24        x.mul_(torch.rsqrt(var + self.eps))
25        x = x.to(orig_dtype).mul_(self.weight)
26        return x
27
28    @torch.compile
29    def add_rms_forward(
30        self,
31        x: torch.Tensor,
32        residual: torch.Tensor,
33    ) -> tuple[torch.Tensor, torch.Tensor]:
34        orig_dtype = x.dtype
35        x = x.float().add_(residual.float())
36        residual = x.to(orig_dtype)
37        var = x.pow(2).mean(dim=-1, keepdim=True)
38        x.mul_(torch.rsqrt(var + self.eps))
39        x = x.to(orig_dtype).mul_(self.weight)
40        return x, residual
41
42    def forward(
43        self,
44        x: torch.Tensor,
45        residual: torch.Tensor | None = None,
46    ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]:
47        if residual is None:
48            return self.rms_forward(x)
49        else:
50            return self.add_rms_forward(x, residual)