MOE论文详解(3)-Switch Transformers

Switch Transformers也是google在2022年发表的一篇论文, 该论文简化了MoE的路由算法, 减少了计算量和通信量; 第一次支持bfloat16精度进行训练. 基于T5-Base和T5-Large设计的模型在相同的算力下训练速度提升了7x倍; 同时发布了1.6万亿(1.6 trillion)参数的MoE模型,相比T5-XXL模型训练速度提长了4x倍.

在这里插入图片描述

左边图中表示不同专家个数对应的参数量与loss这间的关系, 专家数越多对应的参数量越大, loss越低; 右边图中在相同训练step下比较不同模型的负对数困惑度(Negative Log Perplexity)

1. 模型介绍

在这里插入图片描述

Switch Transformers中使用稀疏FFN层(图中蓝色框部分)替换原有transformer中的稠密FFN层. 稀疏FFN层对于输入token的处理是相互独立的, 上图中输入有两个token分别是MoreParameters, 每个token都会被随机路由到4个expert中的1个(实线), 输出会把选择上FFN层的输出乘上门控权重(虚线).

1.1 简化稀疏路由

回顾下之前的MoE层的门控方法, 网络接收一个输入token(x), 输出会路由到top-K个专家进行计算. 选择专家的过程如下, W r W_r Wr 是门控的权重, p i ( x ) p_i(x) pi(x) 是专家i对输入x门控输出值, T \mathcal{T} T 是top-K个专家的下标集合.

h ( x ) = W r ⋅ x p i ( x ) = S o f t M a x ( h ( x i ) ) = e h ( x ) i ∑ j N e h ( x ) j y = ∑ i ∈ T p i ( x ) E i ( x ) \begin{gather} h(x)=W_r \cdot x \\ p_i(x) = SoftMax(h(x_i)) = \frac{e^{h(x)_i}}{\sum_j^N e^{h(x)_j}} \\ y = \sum_{i \in \mathcal{T}} p_i(x)E_i(x) \end{gather} h(x)=Wrxpi(x)=SoftMax(h(xi))=jNeh(x)jeh(x)iy=iTpi(x)Ei(x)

Switch Transformers中的Switch Layer对于这里的门控选择进行了优化, 从top-K个专家改为1个专家, 好处有三点:(1)由于只有一个专家, 对应的门控计算量节省 (2)专家对应的容量减半, 每个token只会路由到一个专家 (3)路由简化后对应的通信代价也下降了.

下面解释下专家使用不同的专家容量系数的情况, 名词解释如下:

  • 专家: 分布在不同的device上, 每个专家是一个FFN网络, 有独立的权重
  • 专家容量: 每个专家处理的batch大小, 公式为(tokens_per_batch/num_experts)*capacity_factor
  • 容量系数: 计算专家容量时乘上系数, 可以为专家多分配一些buffer来改善token溢出的情况

在这里插入图片描述

每个专家有固定的专家容量((total_tokens/num_experts) x capacity_factor), 上图capacity_factor为1的时候, 每个device能处理的token个数为2, device0处理的token已经满了, 这时有新的token来的话就会溢出; 当capacity_factor为1.5的时候, 每个device可以处理3个token, 这时就没有token溢出了.

1.2 高效稀疏路由

1.2.1 分布式路由实现(Distributed Switch Implementation)

一个重要的点在于专家容量系数的设置, 如果专家容量系数设置过小, 太多的token被路由到一个专家上, 会造成溢出的token走了残差分支直接传给下一层; 如果专家容量系数设置过大, 会造成memory和计算的浪费. 专家容量定义如下:

e x p e r t c a p a c i t y = ( t o k e n p e r b a t c h n u m b e r o f e x p e r t s ) × c a p a c i t y f a c t o r \begin{gather} expert\ capacity=(\frac{token\ per\ batch}{number\ of\ experts}) \times capacity\ factor \end{gather} expert capacity=(number of expertstoken per batch)×capacity factor

这里比较了不同容量系数对效果的影响, 效果质量采用了negative log perplexity进行衡量, 所有MoE采用了相同的128个专家.

在这里插入图片描述

1.2.2 可微分的负载均衡的损失函数 (A Differentiable Load Balancing Loss.)

对于Switch Layer来说, 辅助损失会被加到总的损失上. 给定 i i i 从1到N的 N N N 个专家, 一个batch B \mathcal{B} B 中有 T T T 个token, 损失计算公式如下:

l o s s = α ⋅ N ⋅ ∑ i = 1 N f i ⋅ P i f i = 1 T ∑ x ∈ B 1 { a r g m a x p ( x ) = i } P i = 1 T ∑ x ∈ B p i ( x ) \begin{gather} loss = \alpha \cdot N \cdot \sum^N_{i=1} f_i \cdot P_i \\ f_i = \frac{1}{T} \sum_{x \in \mathcal{B}} \mathbb{1}\{\mathnormal{argmax}\ p(x) = i\} \\ P_i = \frac{1}{T} \sum_{x \in \mathcal{B}} p_i(x) \end{gather} loss=αNi=1NfiPifi=T1xB1{argmax p(x)=i}Pi=T1xBpi(x)

f i f_i fi 分配给专家 i i i 的token数的比例, P i P_i Pi 是分配给专家 i i i 的门控比例; P P P是可微的, 但 f f f 是不可微的; 在均匀路由的情况下,每个专家模型被选择的概率是 ( 1 N \frac{1}{N} N1), 为了保持损失函数在不同数量的专家模型下的一致性,最终的损失会乘以专家模型的数量 ( N N N), 对于公式表示为 ∑ i = 1 N ( f i ⋅ P i ) = ∑ i = 1 N ( 1 N ⋅ 1 N ) = 1 N \sum^N_{i=1}(f_i \cdot P_i) = \sum^N_{i=1} (\frac{1}{N} \cdot \frac{1}{N}) = \frac{1}{N} i=1N(fiPi)=i=1N(N1N1)=N1.

最终超参数 α \alpha α 这里设置为 α = 1 0 − 2 \alpha = 10^{-2} α=102, 是因为这个值足够大,可以有效地确保负载均衡; 同时,这个 ( \alpha ) 值又足够小,不会对主要的交叉熵损失函数(primary cross-entropy objective)产生过大的干扰。交叉熵损失函数通常是分类问题中的主要目标函数,用于衡量模型预测的准确性。 α \alpha α 范围为 1 0 − 1 ∼ 1 0 − 5 10^{-1} \sim 10^{-5} 101105.

1.3 预训练与微调训练优化

  • 大稀疏模型训练应用选择性精度: 选择性精度(Selective Precision)是一种技术,用于在计算资源和性能之间找到最佳平衡, 是指在计算过程中根据需要对不同部分的数据或计算使用不同的数值精度, 这里对应指的bfloat16. 在Switch Transformers训练过程中使用bfloat16训练, 把路由输入类型转为float32类型, float32只用在路由函数计算内部, 对于路由的输出又被转为bfloat16, 最终收益如下, 效果与效率达到了最好的情况.

在这里插入图片描述

  • 选择较小的参数初始化: 这里通过截断正态分布(truncated normal distribution)来进行权重初始化, 对应均值 μ = 0 \mu=0 μ=0, 标准差 σ = s / n \sigma=\sqrt{s/n} σ=s/n , s是缩放超参数(当前为0.1), n是权重矩阵的输入单元的个数(例如fan-in连接到该神经元的前一层神经元的数量). 截断正态分布生成的值会在 ( [ μ − 2 σ , μ + 2 σ ] ) ([ \mu - 2\sigma, \mu + 2\sigma ]) ([μ2σ,μ+2σ])之外被截断,即任何超出这个范围的值会被重新抽取,直到它们落在这个范围内。如下图中小一点的缩放系数s=0.1效果比s=1更好.

在这里插入图片描述

  • 模型正则化: 这里在expert中加入dropout, 被称为 e x p e r t d r o p o u t expert\ dropout expert dropout, 只在前向计算中加入dropout, 从下图中可以看出来对训练效果的影响. 对于非moe层设0.1的dropout, 对于expert设0.4的dropout, 提升了4个下游任务的指标.

在这里插入图片描述

2. DP/MP/EP并行设计(Designing Models with Data, Model, and Expert-Parallelism)

随意增加专家数量会面对收益递减的现象是一个实际问题。为了解决这一问题,可以采用一些互补的扩展策略. 常见的策略是同步增大transformer中的参数, 像 d m o d e l d_{model} dmodel d f f d_{ff} dff, d m o d e l d_model dmodel 是输入和输出的词嵌入向量维度, d f f d_ff dff 是前馈神经网络FFN中的隐藏层维度. 增大后显存超过单机情况后, 就要考虑使用 S P M D SPMD SPMD 多机并行了, 这节讨论了数据并行/模型并行/专家并行的使用.

2.1 回顾前馈神经网络FFN层

假设batch中有 B \mathcal{B} B 个token, 每个token的embedding维度是 d m o d e l d_{model} dmodel. FFN层输入输出的shape都是 [ B , d m o d e l ] [B, d_{model}] [B,dmodel], 中间产出 h h h 的shape是 [ B , d f f ] [B, d_{ff}] [B,dff], d f f d_{ff} dff d m o d e l d_{model} dmodel 要大, 比如4倍关系. 中间产出 h = x W i n h=xW_{in} h=xWin, 以及对应输出 y = R e L U ( h ) W o u t y=ReLU(h)W_{out} y=ReLU(h)Wout, W i n W_{in} Win W o u t W_{out} Wout 的shape大小分别是 [ d m o d e l , d f f ] [d_{model}, d_{ff}] [dmodel,dff] [ d f f , d m o d e l ] [d_{ff}, d_{model}] [dff,dmodel].

2.2 数据并行/模型并行/专家并行说明

接下来准备展示了如何对weight和batch data进行不同设备上的切分, 总的core个数为 N N N, 数据并行的切片个数为 n n n, 模型并行的切片个数为 m m m, 总的切片个数等于总的core的个数, 即 N = n × m N=n \times m N=n×m. 输入包含有 B B B 个Token的batch data 被n个数据并行core切分, 每个core上有 B / n B/n B/n 个token. 参数权重 d f f d_{ff} dff 被m个模型并行core切分. 对于专家并行有 E E E 个专家, 每个专家的容量为 C C C 个token. 相关描述如下:
在这里插入图片描述

以下数据与权重并行的切分策略图, 4x4的虚线切分了16个块对应16个core的device. 第一行是模型权重的切分图, 不同颜色表示独立的参数权重, 相同颜色表示相同的权重. 第二行表示数据切分图, 不同颜色表示使用的token数据不同, 相同颜色表示相同的token数据.

在这里插入图片描述

  • 数据并行: 在上图中第一列, 只有数据并行时 n = N , m = 1 n=N, m=1 n=N,m=1, 在前反向计算过程中没有通信, 只在优化器阶段进行所有core的同步, weight权重在所有core上进行复制一份, 数据是所有core计算时分别处理一部分.
  • 模型并行: 在上图中第二列, 只有模型并行时 n = 1 , m = N n = 1, m = N n=1,m=N, weight权重被16个core切分为16块, 每个core上保留一部分; 在数据处理上, 每个core都会处理全量的 B B B 个token数据, 由于在 d f f d_{ff} dff 维度上进行了模型切分, 计算FFN第二个矩阵乘法的结果时( R e L U ( h ) W o u t ReLU(h)W_{out} ReLU(h)Wout ), 每个core都会去发送一个大小为 [ B , d m o d e l ] [B, d_{model}] [B,dmodel] 的数据, 在每一个前向和反向过程中会调用的allreduce操作.
  • 数据并行/模型并行混合: 在上图中第三列, 每个core会分到 B / n B/n B/n 个token处理, 以及会分到 d f f / m d_{ff}/m dff/m 的权重的大小与中间activation产出. 在前向和反向通信时的tensor大小 [ B / n , d m o d e l ] [B/n, d_{model}] [B/n,dmodel]. 这时cores会被划分为4组, 每一组core上有一份全量的模型权重, 4组模型权重做数据并行, 4组模型组内模型切分做模型并行; 数据切分在不同组模型处理数据不一样(用4种颜色区分), 在一个组内的4个core做模型并行, 数据会复制多份处理(例如一份蓝色数据复制成了多个小块)
  • 专家并行/数据并行混合: 专家并行时每个专家的权重都不一样, 互相独立, 所以模型权重颜色都不一样; 下方数据并行, 共同处理同一份数据, 也就是一个大的蓝色块, 跟第一列一样. 这里data切分的是按数据并行度 n n n 来进行的, 每个专家的输出shape大小是 [ n , B / n , E , C ] [n, B/n, E, C] [n,B/n,E,C], 然后输出会跟输入tensor进行相乘 e i n s u m ( [ n , B / n , d m o d e l ] , [ n , B / n , E , C ] , d i m e n s i o n = [ B / n ] ) einsum([n, B/n, d_{model}], [n, B/n, E, C], dimension=[B/n]) einsum([n,B/n,dmodel],[n,B/n,E,C],dimension=[B/n]), 得到结果大小为 [ n , E , C , d m o d e l ] [n, E, C, d_{model}] [n,E,C,dmodel]. 每个core都有各自的expert, 对结果( [ E , C , d m o d e l ] [E, C, d_{model}] [E,C,dmodel] )进行alltoall操作, 从 n n n 维度切分变为 E E E 维度切分.
  • 专家并行/数据并行/模型并行: 从模型权重切分上, 与数据并行/模型并行混合一样, 区别在于expert专家权重各不相同, 所以有4个不同色块, 每个色块中4个core来进行模型切分; 下面数据切分上, 与数据并行/模型并行混合一样, 每组处理不同的数据. 为了最优的模型设计, 寻求FLOPS与模型参数的平衡, 增大专家数能增大参数量, 但FLOPS没有增长. 为了增加FLOPS, 我们增大了 d f f d_{ff} dff 的大小, 对应模型并行度 m m m 也会增大, 由于 N = n × m N=n \times m N=n×m 是个定值, 所以 n n n 会对应减少.

2.3 万亿模型设计(Towards Trillion Parameter Models)

设计了两个Switch Transformer模型, 分别是395 billion(3950亿)和1.6 trillion(1.6万亿)参数量, 其中 Switch-C 只用了专家并行, 没有用模型并行.

在这里插入图片描述

3. 参考

  • Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity
  • MOE论文详解(3)-Switch Transformers

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

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

相关文章

【Next.js 项目实战系列】03-查看 Issue

原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js 项目实战系列】02-创建 Issue 查看 Issue 展示 Issue​ 本节代码链接 首先使用 prisma 获取所有…

【QT】常用控件(二)

个人主页~ 常用控件(一)~ 常用控件 三、按钮类控件1、Push Buttonwidget.hwidget.cpp 2、Radio Button3、Check Box 四、显示类控件1、label 三、按钮类控件 1、Push Button QPushButton继承自QAbstractButton,它是所有按钮的父类 我们从…

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP+MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密,其他开源可二开 演示源码下载 开…

Zookeeper快速入门:部署服务、基本概念与操作

文章目录 一、部署服务1.下载与安装2.查看并修改配置文件3.启动 二、基本概念与操作1.节点类型特性总结使用场景示例查看节点查看节点数据 2.文件系统层次结构3.watcher 一、部署服务 1.下载与安装 下载: 一定要下载编译后的文件,后缀为bin.tar.gz w…

如何匿名浏览网站,保护在线隐私?

在现如今的网络世界,在线隐私已不复存在。你总是被跟踪,即使你使用隐身模式也无济于事。隐身模式会阻止浏览器保存你的浏览历史记录。但它并不能阻止你的互联网服务提供商 (ISP)、雇主、学校、图书馆或你访问的网站看到你在网上做什么。 更有不法分子在未…

CVE-2015-4852 Weblogic T3 反序列化分析

0x01 前言 看到很多师傅的面经里面都有提到 Weblogic 这一个漏洞,最近正好有一些闲暇时间,可以看一看。 因为环境上总是有一些小问题,所以会在本地和云服务器切换着调试0x02 环境搭建 • 太坑了,我的建议是用本地搭建的方法&…

【C语言】一维数组应用Fibonacci数列

Fibonacci数&#xff08;斐波那契数列&#xff09; 前两项为1&#xff0c;从第三项开始&#xff0c;每一项为前两项的和。可以知道连续三项的关系&#xff1a;f[i]f[i-1]f[i-2] 使用数组进行存储&#xff0c;十分方便。可以知道前n项的fibonacci数。 #include <stdio.h>…

ios局域网访问主机Xcode配置

前景&#xff1a; 公司业务是做智能家居&#xff0c;所有设备通过主机控制&#xff0c;目前有个产品需求是&#xff0c;在没有外网的情况下依然能够通过局域网控制主机的设备。 IOS开发需要做的&#xff1a; 除了业务代码之外&#xff0c;前提还要配置访问局域网功能。有以下…

诺贝尔经济学奖历史名单数据集(1969-2024年)

2024年诺贝尔经济学奖授予了达龙阿西莫格鲁&#xff08;Daron Acemoglu&#xff09;、西蒙约翰逊&#xff08;Simon Johnson&#xff09;和詹姆斯A罗宾逊&#xff08;James A. Robinson&#xff09;&#xff0c;以表彰他们在理解制度如何影响经济发展方面的贡献。&#xff08;“…

Linux 外设驱动 应用 3 串口

3 串口 3.1 串口原理 串行口是计算机一种常用的接口&#xff0c;具有连接线少&#xff0c;通讯简单&#xff0c;得到广泛的使用。常用的串口是 RS- 232-C接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同…

Input-Source-Pro:自动切换输入法并提示状态

Input Source Pro 是一款 macOS 上的输入法辅助工具&#xff0c;它可以根据不同应用、不同网站来自动切换输入法&#xff0c;并可以在鼠标周围显示当前输入法状态。 macOS 不像 Windows 那样能保存输入法状态&#xff0c;因此这样的软件还是挺有用的。 ‍ 介绍 官网&#x…

OceanBase中扩容OCP节点step by step

许多用户在开始使用OceanBase时部署OCP&#xff0c;通常选择单节点部署。但随着后续业务规模的不断扩大&#xff0c;会开始担忧单节点OCP在面对故障时可能丧失对集群运维管控的连续性。鉴于此&#xff0c;会将现有的单节点OCP扩展至多节点部署&#xff0c;以此来确保OCP服务的高…

『Mysql集群』Mysql高可用集群之读写分离(二)

前言 主从复制: 解决了Mysql的单点故障问题以及提高MySQL的整体服务性能. 读写分离: 解决的是数据库的读性能问题,分担主库的压力&#xff0c;提高系统的可用性和稳定性。 分库分表: 数据库分表可以解决单表海量数据的查询性能问题&#xff0c;分库可以解决单台数据库的并发…

计算机网络——应用层(DNS域名系统、文件传输协议FTP、远程终端协议TELNET、万维网)

应用层概述 不同网络应用的应用进程之间&#xff0c;还需要用不同的通信规则。因此在运输层协议之上&#xff0c;还需要有应用层协议。 每个应用层协议都是为了解决某一类应用问题&#xff0c;而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成。…

网络七层架构

目录标题 网络七层架构从正确认识网络七层架构开始 网络七层架构 简介&#xff1a; 网络七层架构是指ISO/OSI模型&#xff0c;它是国际标准化组织&#xff08;ISO&#xff09;制定的一种用于计算机网络体系结构的参考模型。该模型将计算机网络的功能划分为七个层次&#xff0c…

Spring Boot知识管理:跨平台集成方案

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【UML】一个UML学习的还不错的几个帖子

https://segmentfault.com/a/1190000042775634 寂然解读设计模式 - UML类图&类的六大关系-阿里云开发者社区

信息抽取数据集处理——RAMS

引言 RAMS数据集&#xff08;RAMS&#xff1a;Richly Annotated Multilingual Schema-guided Event Structure&#xff09;由约翰斯霍普金斯大学于2020年发布&#xff0c;是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件&#xff0c;涵盖了139种不同的事件类型和65种…

客户案例 | Ansys与台积电和微软合作加速光子仿真

Ansys与台积电和微软展开合作&#xff0c;将硅光子器件的仿真和分析速度提高10倍以上 主要亮点 借助使用NVIDIA图形处理单元&#xff08;GPU&#xff09;的Microsoft Azure虚拟机&#xff0c;Ansys Lumerical™ FDTD 3D电磁仿真的光子器件仿真速度实现了10倍提升 凭借Azure云…

k8s系列-Rancher 上操作的k8s容器网络配置总结

Rancher 上操作的k8s容器网络配置总结 要在 Rancher 中配置Spring Boot 应用 ykhd-zhjgyw-xpwfxfjfl 服务&#xff0c;正确的配置方式如下&#xff1a; 1. 应用程序监听端口 在 application.yaml 文件中&#xff0c;配置的应用监听端口是 10001&#xff0c;并且应用的上下文…