DBRX: A New State-of-the-Art Open LLM——基于专家LLM

刷知乎的时候,发现最近开源了一个新的大模型DBRX,同样是基于专家的大模型。之前找MOE的源码没找到,仅仅找到了一些博主写的博客内容,简单了解了一下内容。之前写的模型:Mixtral MOE代码理解添加链接描述。简单看了一下,对于代码实现和之前的原理基本一致。
技术博客:
Introducing DBRX: A New State-of-the-Art Open LLM
模型代码:点击这里

介绍(博客原文摘取):

一个由Databricks创建的开放的通用LLM。在一系列标准基准测试中,DBRX为已建立的开放LLM设定了新的最先进水平。此外,它为开放社区和企业构建自己的LLM提供了以前仅限于封闭模型API的功能;根据我们的测量,它超过了GPT-3.5,并与Gemini 1.0 Pro具有竞争力。它是一个特别有能力的代码模型,在编程方面超过了CodeLLaMA-70B等专门模型,此外它作为通用LLM的实力。 这种最先进的质量在训练和推理性能方面有显著的改进。由于其细粒度的专家混合(MoE)架构,DBRX在开放模型中提高了效率的最先进水平。推理速度比LLaMA2-70B快2倍,DBRX在总参数和活动参数计数方面约为Grok-1的40%。当托管在Mosaic AI模型服务上时,DBRX可以以高达150 tok/s/user的速度生成文本。我们的客户将发现,对于相同的最终模型质量,训练MoEs的FLOP效率也比训练密集模型高出约2倍。端到端,我们为DBRX提供的整体配方(包括预训练数据、模型架构和优化策略)可以与我们上一代MPT模型的质量相媲美,而计算量却减少了近4倍。
在这里插入图片描述

技术实现:

  • 模型结构:DBRX是一个基于Transformer的仅解码器的大型语言模型(LLM),使用一个细粒度的专家混合(MoE)架构
  • 专家数量:16
  • 参数量:132B
  • 起作用专家数量:4
  • 推理时激活参数:36B(由于专家形式,推理时仅仅激活4个专家)
  • 位置编码:RoPE
  • 前馈神经网络:GLU(门控线性单元)
  • 注意力机制:分组查询注意力(GQA)
  • 分词方式:tiktoken
  • 最大上下文长度:32k Token
  • layers: 40
  • head数量:48
  • rope_theta: 500000(LLama设置10000,扩大了50倍,应为是为了能够支持更长的文本长度,这里我了解不太多)
  • 维度:6144
  • vocab_size: 100352
  • ffn_hidden_size: 10752
  • Norm的位置:pre norm
  • Norm方式:LayerNorm
    相比于与Mixtral和Grok-1等其他开放MoE模型相比采用8个专家,选择两个专家,DBRX提供更多的专家组合。
    结构上类似于Mixtral的MoE,对前馈神经网络,进行MoE。

编程和数学能力

在这里插入图片描述
以上就是我比较关注的点,看一下专家是怎么实现的。

代码分析:

专家的选择和我之前理解MoE代码基本一致,仅仅简单,叙述一下:
Mixtral MOE代码理解
因为DBRX在专家实现方面和Mixtral MOE,在代码上是一致的,仅仅是专家的数量和,激活专家的数量不一致,其它我理解应该是一致的。

Router

这个功能主要用于选择从16个专家中选个哪4个专家

class DbrxRouter(nn.Module):def __init__(self, hidden_size: int, moe_num_experts: int, moe_top_k: int,moe_jitter_eps: Optional[float],moe_normalize_expert_weights: Optional[float],uniform_expert_assignment: bool):super().__init__()self.hidden_size = hidden_sizeself.moe_num_experts = moe_num_expertsself.moe_top_k = moe_top_kself.moe_jitter_eps = moe_jitter_epsself.moe_normalize_expert_weights = moe_normalize_expert_weightsself.uniform_expert_assignment = uniform_expert_assignmentself.layer = nn.Linear(self.hidden_size,self.moe_num_experts,bias=False)def jitter(self, x: torch.Tensor) -> torch.Tensor:#增加抖动,如何仅仅理解原理这个可以忽略if self.moe_jitter_eps is None:raise RuntimeError('The router does not have moe_jitter_eps set.')low = 1.0 - self.moe_jitter_epshigh = 1.0 + self.moe_jitter_epsnoise = torch.rand(x.size(), dtype=x.dtype, device=x.device)return low + noise * (high - low)def forward(self, x: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.LongTensor]:if self.training and self.moe_jitter_eps is not None:x = x * self.jitter(x)weights = self.layer(x.view(-1,x.shape[-1])).softmax(dim=-1,dtype=torch.float32)top_weights, top_experts = torch.topk(weights, self.moe_top_k, dim=-1)if self.moe_normalize_expert_weights:top_weights = top_weights / torch.norm(#主要对专家的结果进行归一化top_weights,p=self.moe_normalize_expert_weights,dim=-1,keepdim=True)if self.uniform_expert_assignment:with torch.no_grad():uniform_tensor = torch.arange(0,top_experts.numel(),device=top_experts.device,dtype=top_experts.dtype) % self.moe_num_expertstop_experts = uniform_tensor.reshape(top_experts.shape)# Note, weights and top_weights are not changedweights = weights.to(x.dtype)top_weights = top_weights.to(x.dtype)return weights, top_weights, top_experts  # type: ignore

ExpertGLU

对token选择某个专家进行GLU即前馈神经网络

class DbrxExpertGLU(nn.Module):#这个就是常规的GLU结果,只不多是多个专家的GLUdef __init__(self, hidden_size: int, ffn_hidden_size: int,moe_num_experts: int, ffn_act_fn: dict):super().__init__()self.hidden_size = hidden_sizeself.ffn_hidden_size = ffn_hidden_sizeself.moe_num_experts = moe_num_expertsself.w1 = nn.Parameter(torch.empty(moe_num_experts * ffn_hidden_size, hidden_size))#因为是多个16个专家,所以是专家的总数量,乘以总的ffn_hidden_sizeself.v1 = nn.Parameter(torch.empty(moe_num_experts * ffn_hidden_size, hidden_size))self.w2 = nn.Parameter(torch.empty(moe_num_experts * ffn_hidden_size, hidden_size))self.activation_fn = resolve_ffn_act_fn(ffn_act_fn)def forward(self, x: torch.Tensor, expert_idx: int) -> torch.Tensor:expert_w1 = self.w1.view(self.moe_num_experts, self.ffn_hidden_size,self.hidden_size)[expert_idx]expert_v1 = self.v1.view(self.moe_num_experts, self.ffn_hidden_size,self.hidden_size)[expert_idx]expert_w2 = self.w2.view(self.moe_num_experts, self.ffn_hidden_size,self.hidden_size)[expert_idx]x1 = x.matmul(expert_w1.t())x2 = x.matmul(expert_v1.t())x1 = self.activation_fn(x1)x1 = x1 * x2x1 = x1.matmul(expert_w2)return x1

Experts

这个主要就是,专家的核心,算是专家的控制代码,控制token进行专家的选择,选择相应的GLU结构。

class DbrxExperts(nn.Module):def __init__(self, hidden_size: int, ffn_hidden_size: int,moe_num_experts: int, ffn_act_fn: dict):super().__init__()self.moe_num_experts = moe_num_expertsself.mlp = DbrxExpertGLU(hidden_size=hidden_size,ffn_hidden_size=ffn_hidden_size,moe_num_experts=moe_num_experts,ffn_act_fn=ffn_act_fn)def forward(self, x: torch.Tensor, weights: torch.Tensor,top_weights: torch.Tensor,top_experts: torch.LongTensor) -> torch.Tensor:bsz, q_len, hidden_size = x.shapex = x.view(-1, hidden_size)out = torch.zeros_like(x)expert_mask = nn.functional.one_hot(top_experts, num_classes=self.moe_num_experts).permute(2, 1, 0)for expert_idx in range(0, self.moe_num_experts):topk_idx, token_idx = torch.where(expert_mask[expert_idx])if token_idx.shape[0] == 0:continuetoken_list = token_idx.tolist()topk_list = topk_idx.tolist()expert_tokens = x[None, token_list].reshape(-1, hidden_size)expert_out = self.mlp(expert_tokens, expert_idx) * top_weights[token_list, topk_list,None]out.index_add_(0, token_idx, expert_out)out = out.reshape(bsz, q_len, hidden_size)return out

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes 知识体系 系列一

多年前,大多数软件应用程序都是大型的单体,要么作为单个进程运行,要么作为少数服务器上的少量进程运行。这种过时的系统一直延续很久。 它们的发布周期较慢,更新相对较少。 在每个发布周期结束时,开发人员将整个系统…

第三十二天-PythonWeb主流框架-Django框架

目录 1.介绍 发展历史 介绍 2.使用 1.安装 2.创建项目 3.项目结构 4.启动 3.开发流程 1.设置ip可访问 2.创建模块 3.第一个页面 4.视图 5.include()参数 6.url与视图的关系 7.响应内容 4.视图处理业务逻辑 1.响应html 2.获取url参数 3.从文件响应html内容 …

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 1,最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

Portainer的替代Dockge?又一个Docker Compose管理器?

Dockge:让Docker Compose管理触手可及,一图胜千言,轻松构建与管控您的容器服务栈!- 精选真开源,释放新价值。 概览 Docker,这一开放源代码的创新平台,旨在实现应用程序部署、扩展与运维的自动化…

分享两种电流检测电路设计方案

大家好我是砖一。 在研发设计电路项目时,依据需要实现的功能指标,进行详细的电路方案开发与验证;面对项目的功能电路研发,工程师一般采用的做法是化整为零,化繁为简,也就是将项目的需要实现的整体功能逐一…

幻兽帕鲁Palworld游戏服务器多少钱?价格表来了,建议收藏

2024年全网最全的幻兽帕鲁服务器租用价格表,阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月,阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全: 阿里云幻…

如何把PNG图片转换成CAD图纸DWG格式

环境: CAD2021 PNG图片 问题描述: 如何把PNG图片转换成CAD图纸DWG格式 解决方案: 将PNG图像转换为CAD文件(如DXF或DWG格式)是设计和工程领域中常见的需求之一。幸运的是,有几种工具和软件可以帮助完成…

【考研数学】跟张宇,一看就会,一做就废,换老师有用吗?

宇哥的1000题其实很多同学在刷的时候都会觉得有点吃力,特别是基础不是很牢固一类的 我的感觉是如果基础很差的按照宇哥的做法可能会没有什么思路,基础题可能有的都分析不出来 张宇的30讲还是不太适合零基础的考研党去听...因为宇哥整体节奏较快&#x…

阿里云CentOS7安装ZooKeeper单机模式

前提条件 阿里云CentOS7安装好jdk,可参 hadoop安装 的jdk安装部分 下载 [hadoopnode1 ~]$ cd softinstall [hadoopnode1 softinstall]$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz 解压 [hadoopnode1 …

全网最全的幻兽帕鲁服务器价格表查询系统,一键报价

2024年全网最全的幻兽帕鲁服务器租用价格表,阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月,阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全: 阿里云幻…

智驾芯片“独角兽”地平线流血冲刺上市,三年累计亏损47亿元

3月26日,Horizon Robotics(下称“地平线”)向港交所递交招股书,高盛、摩根士丹利、中信建投国际为其联席保荐人。 据介绍,成立于2015年的地平线是一家人工智能计算平台公司,专注于为智能汽车提供高级辅助驾…

算法---动态规划练习-8(打家劫舍2)

打家劫舍2 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址:点这里 2. 讲解算法原理 首先,给定一个非负整数数组 nums,其中 nums[i] 表示第 i 家的财物价值。 定义两个辅助数组 f 和 g,长度都为 n(n 是…

【FedCoin: A Peer-to-Peer Payment System for Federated Learning】

在这篇论文中,我们提出了FedCoin,一个基于区块链的点对点支付系统,专为联邦学习设计,以实现基于Shapley值的实际利润分配。在FedCoin系统中,区块链共识实体负责计算SV,并且新的区块是基于“Shapley证明”&a…

自定义类型:【结构体】

我们知道C语言中有许多的类型,比如char,short,int等等类型。像是这些C语言本身就支持的类型叫做内置类型,但是有一些复杂对象,只有这些类型是完全不够的。比如人,或者一本书。那么我们就可以自己定义一些类…

mysql--事务四大特性与隔离级别

事务四大特性与隔离级别 mysql事务的概念事务的属性事务控制语句转账示例 并发事务引发的问题脏读脏读场景 不可重复读幻读幻读场景 事务的隔离级别读未提交读已提交可重复读(MySQL默认) 总结 mysql事务的概念 事务就是一组操作的集合,他是一…

鸿蒙OS开发实例:【手撸服务卡片】

介绍 服务卡片指导文档位于“开发/应用模型/Stage模型开发指导/Stage模型应用组件”路径下,说明其极其重要。 本篇文章将分享实现服务卡片的过程和代码 准备 请参照[官方指导],创建一个Demo工程,选择Stage模型 鸿蒙OS开发更多内容↓点击…

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算,四道二维dp 67.二进制…

PCB损耗来源

信号经过PCB板会产生损耗,主要包括导体损耗,介电损耗和辐射损耗 导体损耗:导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗:介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗:辐…

YOLOv9 实战指南:打造个性化视觉识别利器,从零开始训练你的专属测试集

论文地址:YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information GitHub:WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information (github.com)…

Linux---多线程(下)

前情提要:Linux---多线程(上) 七、互斥 临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临…