Write a custom CUDA kernel for Layer Normalization.

The standard LayerNorm operation is defined as:

y = (x - E[x]) / sqrt(Var[x] + epsilon) * gamma + beta

Where:
- x is the input tensor
- E[x] is the mean of x
- Var[x] is the variance of x
- epsilon is a small value for numerical stability
- gamma and beta are learnable affine parameters

You should fuse the calculation of mean, variance, and the normalization into a single CUDA kernel. This avoids multiple passes over the data and reduces memory bandwidth usage.

You are given the following architecture:

import torch
import torch.nn as nn

class Model(nn.Module):
    def __init__(self, normalized_shape, eps=1e-5):
        super(Model, self).__init__()
        self.layer_norm = nn.LayerNorm(normalized_shape, eps=eps)
    
    def forward(self, x):
        return self.layer_norm(x)