当前位置: 首页 > news >正文

【AI论文】魔鬼在细节:关于在训练专用混合专家模型时实现负载均衡损失

摘要:本文重新审视了在训练混合专家(Mixture-of-Experts, MoEs)模型时负载均衡损失(Load-Balancing Loss, LBL)的实现。具体来说,MoEs的LBL定义为N_E乘以从1到N_E的所有专家i的频率f_i与门控得分平均值p_i的乘积之和,其中N_E是专家的总数,f_i表示专家i被选择的频率,p_i表示专家i的平均门控得分。现有的MoE训练框架通常采用并行训练策略,以便在微批次(micro-batch)内计算f_i和LBL,然后在并行组之间进行平均。本质上,用于训练百亿级大规模语言模型(LLMs)的微批次通常只包含非常少的序列。因此,微批次的LBL几乎是在序列级别上进行的,这促使路由器在每个序列内均匀分配token。在这种严格约束下,即使是来自特定领域序列(例如代码)的token也会被均匀路由到所有专家,从而抑制了专家的专业化。在本文中,我们提出使用全局批次(global-batch)来计算LBL,以放宽这一约束。因为全局批次包含的序列比微批次更加多样,这将鼓励在语料库级别上进行负载均衡。具体来说,我们引入了一个额外的通信步骤来跨微批次同步f_i,然后使用它来计算LBL。通过在基于MoEs的大规模语言模型(总参数高达428亿,训练token数达4000亿)上的实验,我们惊讶地发现,全局批次LBL策略在预训练困惑度和下游任务方面都带来了显著的性能提升。我们的分析还表明,全局批次LBL也极大地提高了MoE专家的领域专业化能力。Huggingface链接:Paper page,论文链接:2501.11873

1. 引言

背景与动机

  • 混合专家(Mixture-of-Experts, MoEs)框架已成为扩展模型参数规模的一种流行技术。它通过路由器网络将输入分配给一组并行专家模块,实现了条件稀疏激活,从而提高了训练和推理效率。
  • 训练MoE模型的一个关键因素是鼓励路由器以均衡的方式分配输入到专家,这既是为了保证训练的有效性(避免参数冗余),也是为了提高推理的效率(避免专家利用不均衡导致的推理速度减慢)。
  • 负载均衡损失(Load-Balancing Loss, LBL)作为一种辅助损失函数,被广泛应用于MoE训练中以鼓励均衡的路由决策。然而,现有MoE训练框架在计算LBL时多采用微批次级别,这在训练大规模语言模型(LLMs)时存在局限性。

研究问题

  • 现有微批次级别的LBL计算方法在训练大规模MoE模型时,由于每个微批次包含的序列数量有限,导致路由器被推向在每个序列内均匀分配token,这抑制了专家的专业化,并可能损害模型性能。

研究目标

  • 本文旨在提出一种基于全局批次计算LBL的方法,以放宽微批次级别的严格约束,鼓励在语料库级别上进行负载均衡,从而提高模型性能和专家专业化能力。
2. 预备知识

混合专家(MoEs)

  • MoEs由一组并行专家模块和一个路由器组成。路由器根据输入为每个专家分配权重,通常只激活得分最高的前K个专家。
  • 输出是所有激活专家的加权和,权重由路由器根据输入为每个专家分配的得分决定。

负载均衡损失(LBL)

  • LBL是一种正则化技术,用于鼓励专家利用的均衡性,防止专家崩溃。它通过对路由器过度将token路由到少数特定专家进行惩罚来实现。
  • LBL的计算公式为N_E乘以所有专家i的频率f_i与门控得分平均值p_i的乘积之和,然后除以专家总数N_E。
3. 方法

全局批次LBL计算方法

  • 现有MoE训练框架在计算LBL时,通常在每个微批次内计算f_i和LBL,然后在并行组之间进行平均。这种方法在训练大规模LLMs时存在局限性,因为每个微批次包含的序列数量有限。
  • 本文提出使用全局批次来计算LBL,以放宽微批次级别的严格约束。具体做法是引入一个额外的通信步骤来跨微批次同步f_i,然后使用同步后的f_i来计算LBL。
  • 由于全局批次包含的序列比微批次更加多样,这将鼓励在语料库级别上进行负载均衡,从而促进专家的专业化。

针对计算节点数量有限的情况

  • 当训练LLMs时,全局批次大小可能非常大,而每个微批次大小可能相对较小。由于计算节点数量有限,所有微批次的总和可能小于全局批次大小。
  • 在这种情况下,本文提出使用一个缓冲区来存储每个梯度累积(GA)步骤中同步的专家选择计数c_i。然后,在GA步骤中使用缓冲区中的信息来计算当前的f_i。完成GA后,重置缓冲区。
4. 实验

实验设置

  • 本文在三种不同大小的MoE模型上进行了实验,包括3.4B总参数(0.6B激活)、15B总参数(2.54B激活)和43B总参数(6.6B激活)的模型。
  • 所有模型均采用细粒度专家和共享专家方法,并使用softmax门控、微批次LBL和z-loss。
  • 训练数据包含1200亿和4000亿高质量token,涵盖多语言、数学和一般知识内容。

实验结果

  • 全局负载均衡提升模型性能:实验结果显示,随着计算LBL时考虑的token数量(Balance BSZ)的增加,所有指标均得到一致提升。特别是在4000亿token训练设置下,使用全局批次LBL的模型性能显著优于使用微批次LBL的模型。
  • 全局负载均衡鼓励专家专业化:通过分析不同领域下每层专家的选择频率,发现使用全局批次LBL的模型在特定领域(如数学和代码)下出现了更多高频专家,表明全局批次LBL更有利于专家的专业化。
  • 缓冲区机制的有效性:在计算节点数量有限的情况下,使用缓冲区机制可以近似全局批次LBL,从而在性能上接近使用全局批次LBL的模型,并显著优于使用微批次LBL的模型。
5. 分析

消融研究

  • 本文进行了消融研究以验证全局批次LBL相对于微批次LBL的优势。结果显示,即使在微批次内随机选择一批与全局批次具有相同token分布和数量的token来计算LBL(Shuffle LBL micro),其性能仍然接近全局批次LBL,并显著优于微批次LBL。这表明全局批次LBL的优势主要在于其更宽松的约束条件,而不是因为考虑了更多的token。

负载均衡损失和语言建模损失的变化

  • 通过分析训练过程中负载均衡损失和语言建模损失的变化,发现从微批次平衡切换到全局批次平衡后,负载均衡损失迅速下降并接近从头开始使用全局批次平衡的情况,而语言建模损失也保持较低水平。这表明全局批次平衡是一个更宽松的约束条件。

训练过程中改变Balance BSZ的影响

  • 实验结果显示,在训练过程中改变Balance BSZ会对最终结果产生影响。较早地切换到全局批次平衡可以获得更好的性能提升,而较晚地切换则提升有限。此外,从全局批次平衡切换到微批次平衡会导致性能下降,表明训练过程中专家选择的变化会显著影响模型性能。

全局批次平衡的计算成本和效率

  • 由于采用了无丢失策略,不同方法在计算浮点运算数(FLOPs)时是相同的。然而,由于局部平衡条件的不同,使用全局批次平衡的方法可能会经历局部计算不平衡。实验结果显示,使用全局批次平衡的方法在计算速度上比使用微批次平衡的方法慢约5.8%,但通过引入少量微批次平衡损失可以将其提高到接近使用微批次平衡的速度,同时仅对性能产生微小影响。

全局批次平衡带来的可解释性专业化

  • 通过分析使用全局批次平衡的模型在不同领域下的专家选择频率和路由得分,发现全局批次平衡促进了专家在不同领域下的专业化,并且路由得分与语言建模任务更加一致。
6. 相关工作

负载均衡

  • 现有的工作主要关注如何通过不同的方法来实现负载均衡,包括引入辅助损失函数、允许专家根据负载能力选择token等。然而,这些方法在计算专家选择频率时多采用微批次级别,存在局限性。

专家专业化

  • 初始的MoE设计旨在通过允许不同专家专注于特定任务来实现高效的参数利用。然而,由于微批次级别的负载均衡约束,大多数MoE模型并未展现出领域级别的专业化。本文提出的全局批次LBL方法有助于促进专家的专业化。
7. 结论

主要贡献

  • 本文提出了使用全局批次来计算LBL的方法,以放宽微批次级别的严格约束,从而促进专家的专业化和提高模型性能。
  • 通过在多种规模的MoE模型上的实验,验证了全局批次LBL方法的有效性。
  • 提供了对全局批次LBL方法如何影响模型性能和专家专业化的详细分析。

局限性

  • 本文主要关注分析预训练阶段微批次LBL对LLMs的影响,未进一步探讨其在微调阶段或在视觉和多模态领域的影响。
  • 对专业化的分析主要集中在不同领域下的专家选择频率,未进行更严格的验证。
  • 放宽微批次LBL可能引入一些延迟,未来工作可以考虑在每个微批次内包含更多样化的序列以减轻局部不平衡问题。
8. 未来工作
  • 进一步研究全局批次LBL在微调阶段和在不同领域(如视觉和多模态)中的应用。
  • 对专家专业化进行更严格的验证,例如通过人工评估专家在不同任务上的表现。
  • 探索其他方法来减轻全局批次LBL可能引入的延迟问题。

相关文章:

【AI论文】魔鬼在细节:关于在训练专用混合专家模型时实现负载均衡损失

摘要:本文重新审视了在训练混合专家(Mixture-of-Experts, MoEs)模型时负载均衡损失(Load-Balancing Loss, LBL)的实现。具体来说,MoEs的LBL定义为N_E乘以从1到N_E的所有专家i的频率f_i与门控得分平均值p_i的…...

Gurobi基础语法之addVar 和 addVars

addVar 和 addVars作为 Gurobi模型对象中的方法,常常用来生成变量,本文介绍了Python中的这两个接口的使用 addVar addVar(lb0.0, ubfloat(inf), obj0.0, vtypeGRB.CONTINUOUS, name, columnNone) lb 和 ub让变量在生成的时候就有下界和上届&#xff0c…...

C语言学习阶段性总结(五)---函数

函数构成五要素: 1、返回值类型 2、函数名 3、参数列表(输入) 4、函数体 (算法) 5、返回值 (输出) 返回值类型 函数名 (参数列表) { 函数体; return 返回值; } void 类型…...

K8S 快速实战

K8S 核心架构原理: 我们已经知道了 K8S 的核心功能:自动化运维管理多个容器化程序。那么 K8S 怎么做到的呢?这里,我们从宏观架构上来学习 K8S 的设计思想。首先看下图: K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责核心的调度、管理和运维,Slave…...

java后端之事务管理

Transactional注解:作用于业务层的方法、类、接口上,将当前方法交给spring进行事务管理,执行前开启事务,成功执行则提交事务,执行异常回滚事务 spring事务管理日志: 默认情况下,只有出现Runti…...

【Redis】缓存+分布式锁

目录 缓存 Redis最主要的使用场景就是作为缓存 缓存的更新策略: 1.定期生成 2.实时生成 面试重点: 缓存预热(Cache preheating): 缓存穿透(Cache penetration) 缓存雪崩 (Cache avalan…...

二分查找题目:寻找两个正序数组的中位数

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:寻找两个正序数组的中位数 出处:4. 寻找两个正序数组的中位数 难度 8 级 题目描述 要求 给定两个大…...

网络安全 | F5-Attack Signatures详解

关注:CodingTechWork 关于攻击签名 攻击签名是用于识别 Web 应用程序及其组件上攻击或攻击类型的规则或模式。安全策略将攻击签名中的模式与请求和响应的内容进行比较,以查找潜在的攻击。有些签名旨在保护特定的操作系统、Web 服务器、数据库、框架或应…...

Redis --- 分布式锁的使用

我们在上篇博客高并发处理 --- 超卖问题一人一单解决方案讲述了两种锁解决业务的使用方法,但是这样不能让锁跨JVM也就是跨进程去使用,只能适用在单体项目中如下图: 为了解决这种场景,我们就需要用一个锁监视器对全部集群进行监视…...

LeetCode100之全排列(46)--Java

1.问题描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案 示例1 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例2 输入:nums [0,1] 输出&#xf…...

goframe 博客分类文章模型文档 主要解决关联

goframe 博客文章模型文档 模型结构 (BlogArticleInfoRes) BlogArticleInfoRes 结构体代表系统中的一篇博客文章,包含完整的元数据和内容管理功能。 type BlogArticleInfoRes struct {Id uint orm:"id,primary" json:"id" …...

【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南

文章目录 🌍一. WEB 开发❄️1. 介绍 ❄️2. BS 与 CS 开发介绍 ❄️3. JavaWeb 服务软件 🌍二. Tomcat❄️1. Tomcat 下载和安装 ❄️2. Tomcat 启动 ❄️3. Tomcat 启动故障排除 ❄️4. Tomcat 服务中部署 WEB 应用 ❄️5. 浏览器访问 Web 服务过程详…...

安卓日常问题杂谈(一)

背景 关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓…...

Kitchen Racks 2

Kitchen Racks 2 吸盘置物架 Kitchen Racks-CSDN博客...

嵌入式学习笔记-杂七杂八

文章目录 连续波光纤耦合激光器工作原理主要特点应用领域设计考虑因素 数值孔径(Numerical Aperture,简称NA)数值孔径的定义数值孔径的意义数值孔径的计算示例数值孔径与光纤 四象限探测器检测目标方法四象限划分检测目标的步骤1. 数据采集2.…...

14-7C++STL的stack容器

(一)stack容器的入栈与出栈 (1)stack容器的简介 stack堆栈容器,“先进后出”的容器,且stack没有迭代器 (2)stack对象的默认构造 stack采用模板类实现,stack对象的默认…...

Vue 3 中的响应式系统:ref 与 reactive 的对比与应用

Vue 3 的响应式系统是其核心特性之一,它允许开发者以声明式的方式构建用户界面。Vue 3 引入了两种主要的响应式 API:ref 和 reactive。本文将详细介绍这两种 API 的用法、区别以及在修改对象属性和修改整个对象时的不同表现,并提供完整的代码…...

物业巡更系统助推社区管理智能化与服务模式创新的研究与应用

内容概要 在现代社区管理中,物业巡更系统扮演着至关重要的角色。首先,我们先来了解一下这个系统的概念与发展背景。物业巡更系统,顾名思义,是一个用来提升物业管理效率与服务质量的智能化工具。随着科技的发展,传统的…...

windows蓝牙驱动开发-生成和发送蓝牙请求块 (BRB)

以下过程概述了配置文件驱动程序生成和发送蓝牙请求块 (BRB) 应遵循的一般流程。 BRB 是描述要执行的蓝牙操作的数据块。 生成和发送 BRB 分配 IRP。 分配BRB,请调用蓝牙驱动程序堆栈导出以供配置文件驱动程序使用的 BthAllocateBrb 函数。;初始化 BRB…...

Linux网络之序列化和反序列化

目录 序列化和反序列化 上期我们学习了基于TCP的socket套接字编程接口,并实现了一个TCP网络小程序,本期我们将在此基础上进一步延伸学习,实现一个网络版简单计算器。 序列化和反序列化 在生活中肯定有这样一个情景。 上图大家肯定不陌生&a…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...