DeepseekV3RMSNorm 模块

代码

import torch
import torch.nn as nn


class DeepseekV3RMSNorm(nn.Module):
    def __init__(self, hidden_size, eps=1e-6):
        """
        DeepseekV3RMSNorm is equivalent to T5LayerNorm
        """
        super().__init__()
        self.weight = nn.Parameter(torch.ones(hidden_size))
        self.variance_epsilon = eps

    def forward(self, hidden_states):
        input_dtype = hidden_states.dtype
        hidden_states = hidden_states.to(torch.float32)
        variance = hidden_states.pow(2).mean(-1, keepdim=True)
        hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
        return self.weight * hidden_states.to(input_dtype)

    def extra_repr(self):
        return f"{tuple(self.weight.shape)}, eps={self.variance_epsilon}"

代码解释

类定义与初始化

class DeepseekV3RMSNorm(nn.Module):
    def __init__(self, hidden_size, eps=1e-6):
        """
        DeepseekV3RMSNorm is equivalent to T5LayerNorm
        """
        super().__init__()
        self.weight = nn.Parameter(torch.ones(hidden_size))
        self.variance_epsilon = eps
  • 继承自 nn.Module,是 PyTorch 的标准模块基类
  • 初始化方法接收两个参数:
    • hidden_size:隐藏层的大小,决定了权重参数的维度
    • eps:一个小常数,用于数值稳定性,默认为 1e-6
  • 创建了一个可学习的权重参数 weight,初始化为全 1 向量
  • 保存 epsilon 值用于后续计算

前向传播方法

def forward(self, hidden_states):
    input_dtype = hidden_states.dtype
    hidden_states = hidden_states.to(torch.float32)
    variance = hidden_states.pow(2).mean(-1, keepdim=True)
    hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
    return self.weight * hidden_states.to(input_dtype)

前向传播方法实现了 RMSNorm 的核心计算:

  1. 保存输入张量的原始数据类型
  2. 将输入转换为 float32 类型以确保计算精度
  3. 计算每个特征向量的均方值(沿最后一个维度):
    • pow(2) 对每个元素求平方
    • mean(-1, keepdim=True) 沿最后一个维度计算均值,保持维度
  4. 使用 torch.rsqrt 计算均方根的倒数(1/sqrt(x))
  5. 将输入张量乘以这个倒数进行归一化
  6. 应用可学习的权重参数进行缩放
  7. 将结果转换回原始数据类型并返回

额外表示方法

def extra_repr(self):
    return f"{tuple(self.weight.shape)}, eps={self.variance_epsilon}"

这个方法用于自定义模块的字符串表示,当打印模型时会显示权重形状和 epsilon 值。

与 LayerNorm 的区别

RMSNorm 与标准 LayerNorm 的主要区别在于:

  • LayerNorm 会减去均值并除以标准差
  • RMSNorm 只除以均方根,不减去均值

这种设计使 RMSNorm 计算更高效,同时保持了良好的归一化效果,特别适合大型语言模型。

代码运行结果

import torch
import torch.nn as nn


class DeepseekV3RMSNorm(nn.Module):
    def __init__(self, hidden_size, eps=1e-6):
        """
        DeepseekV3RMSNorm is equivalent to T5LayerNorm
        """
        super().__init__()
        self.weight = nn.Parameter(torch.ones(hidden_size))
        self.variance_epsilon = eps

    def forward(self, hidden_states):
        print(f"输入 hidden_states 的维度: {hidden_states.shape}")
        
        input_dtype = hidden_states.dtype
        hidden_states = hidden_states.to(torch.float32)
        print(f"转换为float32后的维度: {hidden_states.shape}")
        
        variance = hidden_states.pow(2).mean(-1, keepdim=True)
        print(f"variance的维度: {variance.shape}")
        
        rsqrt_result = torch.rsqrt(variance + self.variance_epsilon)
        print(f"rsqrt结果的维度: {rsqrt_result.shape}")
        
        hidden_states = hidden_states * rsqrt_result
        print(f"归一化后的维度: {hidden_states.shape}")
        
        weighted_result = self.weight * hidden_states.to(input_dtype)
        print(f"加权后的最终输出维度: {weighted_result.shape}")
        
        return weighted_result

    def extra_repr(self):
        return f"{tuple(self.weight.shape)}, eps={self.variance_epsilon}"

def main():
    # 设置随机种子以确保结果可重现
    torch.manual_seed(42)
    
    # 创建一个RMSNorm实例,隐藏层大小为8
    hidden_size = 8
    rms_norm = DeepseekV3RMSNorm(hidden_size=hidden_size)
    
    # 创建一个随机输入张量
    # 形状为 [2, 4, 8],表示 batch_size=2, seq_length=4, hidden_size=8
    x = torch.randn(2, 4, hidden_size)
    
    # 应用RMSNorm
    normalized_x = rms_norm(x)

   
main()
输入 hidden_states 的维度: torch.Size([2, 4, 8])
转换为float32后的维度: torch.Size([2, 4, 8])
variance的维度: torch.Size([2, 4, 1])
rsqrt结果的维度: torch.Size([2, 4, 1])
归一化后的维度: torch.Size([2, 4, 8])
加权后的最终输出维度: torch.Size([2, 4, 8])

代码可视化

在这里插入图片描述

### OpenWebUI 和 DeepSeekV3 使用指南 #### 关于 OpenWebUI 和 DeepSeekV3 的概述 OpenWebUI 是一款开源的 Web 用户界面工具,旨在简化复杂系统的操作流程并提供直观的操作体验[^1]。DeepSeekV3 则是一个专注于深度学习模型部署和服务化的框架版本,能够有效提升模型服务效率和稳定性[^2]。 #### 获取资源 对于希望获取这两个项目的开发者来说,可以从官方 GitHub 仓库下载最新版源码: - **OpenWebUI**: 访问 [GitHub](https://github.com/OpenWebUiProject/OpenWebUI),点击页面上的 "Clone or download" 按钮来克隆项目到本地环境。 - **DeepSeekV3**: 同样地,在 [GitHub](https://github.com/DeepSeekFramework/DeepSeekV3) 上可以找到该项目,并按照相同方式将其下载至个人计算机上。 #### 安装过程 安装前需确认已正确配置好 Python 环境以及 pip 工具。针对不同平台的具体依赖项列表可以在各自项目的 `README.md` 文件中查阅。 ##### OpenWebUI 安装命令如下: ```bash pip install -r requirements.txt ``` 这一步骤会自动解析并安装所有必要的Python库文件[^1]。 ##### 对于 DeepSeekV3,则执行以下指令完成初始化设置: ```bash python setup.py install ``` 此命令将会编译C++扩展模块并将整个包注册进当前使用的解释器环境中[^2]。 #### 基本配置说明 为了使两个应用程序正常工作,还需要做一些额外的工作来进行个性化调整。 - 在 OpenWebUI 中,主要通过修改位于根目录下的 `.env.example` 文件中的参数实现自定义化;复制该模板为`.env`,然后依据实际需求更改其中的内容即可满足大部分场景的需求[^1]。 - 而在 DeepSeekV3 方面,则是在`config.yaml`里指定运行模式和其他选项。编辑这个YAML格式文档可改变默认行为以适应特定的应用场合[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值