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.mzph.cn/pingmian/56378.shtml

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

相关文章

Linux系统:Ubuntu上安装Chrome浏览器

Ubuntu系统版本:23.04 在Ubuntu系统上安装Google Chrome浏览器,可以通过以下步骤进行: 终端输入以下命令,先更新软件源: sudo apt update 或 sudo apt upgrade终端输入以下命令,下载最新的Google Chrome .…

多机编队—(3)Fast_planner无人机模型替换为Turtlebot3模型实现无地图的轨迹规划

文章目录 前言一、模型替换二、Riz可视化三、坐标变换四、轨迹规划最后 前言 前段时间已经成功将Fast_planner配置到ubuntu机器人中,这段时间将Fast_planner中的无人机模型替换为了Turtlebot3_waffle模型,机器人识别到环境中的三维障碍物信息&#xff0…

5 首页框架及路由配置

1 添加首页LayoutVue.vue组件&#xff0c;登录成功之后跳转到该组件 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchButton,CaretBottom } from element-plus/icons-vue import avatar from /assets/default.png// 导入ref import {…

GitLab 老旧版本如何升级?

极狐GitLab 正式对外推出 GitLab 专业升级服务 https://dl.gitlab.cn/cm33bsfv&#xff01; 专业的技术人员为您的 GitLab 老旧版本实例进行专业升级&#xff01;服务详情可以在官网查看详细解读&#xff01; 那些因为老旧版本而被攻击的例子 话不多说&#xff0c;直接上图&a…

RTMP、FFmpeg安装测试

RTMP、FFmpeg安装测试 1.使用 Docker 部署 RTMP 服务1.拉取带有 RTMP 模块的 NGINX 镜像&#xff1a;2.运行容器 2. 防火墙放行3.windows安装ffmpeg1. [下载链接](https://ffmpeg.org//download.html)2.解压3.环境变量配置 4.常用的 FFmpeg 推流和拉流命令1.推流命令1. 推流到 …

SQL实现给表添加数据及其触发器操作

新建一个表实现添加数据&#xff0c;数据不重复&#xff0c;。判断两个字段是否存在&#xff0c;如果存在&#xff0c;就修改对应字段&#xff0c;如果不存在就新增数据。 测试表格Test如下&#xff1a; 新建触发器如图&#xff1a; 触发程式如下&#xff1a; USE [Test] GO/*…

C语言_字符串+内存函数的介绍

字符函数和字符串函数 本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 字符串查找 strstr strtok 错误信息报告 strerror 字符操作内存操作函数 memcpy memmove memset memcmp 1. 字…

【含文档】基于Springboot+Vue的白云山景点门票销售管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

Mysql(七) --- 索引

文章目录 前言1.简介1.1.索引是什么&#xff1f;1.2.为什么使用索引? 2.索引应该使用什么数据结构&#xff1f;2.1.Hash2.2.二叉搜索树2.3.N叉树2.4.B树2.4.1. 简介2.4.2. B树的特点2.4.3. B树和B树的对比 3.Mysql中的页3.1.为什么要使用页3.2.页文件头和页文件尾3.3.页主体3.…

小新学习Docker之Docker--harbor私有仓库部署与管理

目录 一、Harbor简介 1.1、Harbor概述 1.2、Harbor的特性 1.3、Harbor的构成 二、Harbor构建Docker私有仓库 2.1、部署Harbor服务 2.2、启动 Harbor 2.3、查看 Harbor 启动镜像&#xff0c;检查harbor是否安装成功 2.4、创建一个新项目 2.5、非本地主机进行下载镜像 …

STM32学习--4-1 OLED显示屏

接线图 OLED.c #include "stm32f10x.h" #include "OLED_Font.h"/*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))/*引脚初始化*/ void …

软件安全漏洞挖掘: 基础知识和概念

1. 软件漏洞原理和漏洞检测方法 文章目录 1. 软件漏洞原理和漏洞检测方法1. 漏洞披露2. 漏洞定义和分类1. 漏洞的定义2. 漏洞的分类3. 漏洞检测方法常见方法1. 程序切片2. 形式化方法1. 符号执行3. 污点分析污点分析步骤/流程*污点分析流程的详细介绍1. 识别source和sink点2. 污…

Pycharm通过ssh远程docker容器搭建开发环境

本地pycharm通过ssh方式远程连接服务器&#xff08;Ubuntu&#xff09;上的docker容器&#xff0c;搭建开发环境。实现功能&#xff1a;将环境依赖打包成docker镜像&#xff0c;并在远程服务器中启动容器&#xff08;启动时做好端口映射和文件夹挂载&#xff09;&#xff0c;通…

使用vscode导入库失败解决方法

导入库失败原因 在使用vscode写python代码时&#xff0c;有时会遇见导入库失败的情况&#xff0c;如下图&#xff1a;无法解析导入“xxxxx” 或者 运行时报错&#xff1a;ModuleNotFoundError: No module named xxxxx。 原因可能有&#xff1a; 根本没有下载库&#xff1b…

Luminar Neo v1.21.0.13934 图像编辑软件绿色便携版

skylum Luminar Neo 是一款由未来 AI 技术驱动的创意图像编辑器。并且支持微软Windows及苹果Mac OX系统&#xff0c;它使创作者能够将他们最大胆的想法变为现实并乐在其中。借助 Luminar Neo 领先的 AI 技术和灵活的工作流程&#xff0c;完成创意任务并获得专业品质的编辑结果。…

java基础(5)继承与多态

目录 ​编辑 1.前言 2.正文 2.1继承 2.1.1继承概念 2.1.2继承语法 2.1.3子类访问父类 2.1.4super关键字 2.2多态 2.2.1多态概念 2.2.2多态条件 2.2.3重写 2.2.4向上转型与向下转型 2.2.5为什么要使用多态 3.小结 1.前言 哈喽大家好啊&#xff0c;今天继续来为大…

C++ operator new和operator delete的深入讲解

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 前言 关于operator new和operator delete我们需要明确一个概念&#xff0c;这两个都是…

15.5 JDBC数据库编程5——DAO

目录 15.1.1 引言 实体类Product.java 异常类DaoException.java Dao.java ProductDao.java ProductDaoImpl.java ProductDaoTest.java 15.1.1 引言 Java是面向对象编程语言&#xff0c;主要操作对象&#xff0c;而关系数据库的数据并不是对象&#xff0c;Java程序插入…

linux线程 | 线程的控制(下)

前言&#xff1a; 本节内容是线程的控制部分的第二个小节。 主要是列出我们的线程控制部分的几个细节性问题以及我们的线程分离。这些都是需要大量的代码去进行实验的。所以&#xff0c; 准备好接受新知识的友友们请耐心观看。 现在开始我们的学习吧。 ps:本节内容适合了解线程…

动态内存管理(C语言 VS C++)

目录 一.动态内存管理的前置知识 1.栈区 a.栈区的特点 b.注意事项 2.堆区 a.堆区的特点 b.注意事项 3.全局/静态区 a.作用域和生命周期 b.注意事项 4.常量区 二.C语言动态内存管理 1.malloc 函数 a.接口简介与使用实例 b.注意要点 2.calloc 函数&#xff1a; 3.…