LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析
LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析
导读:该文章阐述了FSDP和DeepSpeed在实现上的差异,Accelerate如何统一它们的行为,并提供指导帮助用户在两种后端之间切换。同时也讨论了低精度优化的内存与收敛权衡。
背景痛点:DeepSpeed和PyTorch FSDP是两种流行的ZeRO Redundancy Optimizer(Zero)算法实现,在模型训练过程中可能会产生不同的结果。DeepSpeed和FSDP处理混合精度的方式不同,导致在相同的学习率下收敛表现有差异。
解决方案:
>> 在Hugging Face Accelerate中同时支持DeepSpeed和FSDP后端。
>> 针对FSDP新增了"mixed-precision"模式,以与DeepSpeed保持一致,同时也保留了原有的低精度模式。
>> 新增概念指南,帮助用户在DeepSpeed和FSDP之间无缝切换。
核心思路步骤:
>> 发现问题根源在于DeepSpeed总是在内部将权重参数升级为FP32精度,而FSDP遵循PyTorch默认行为。
>> DeepSpeed由于内部升精度,会在低精度下出现不收敛的情况。
>> 新增FSDP的mixed-precision模式,在优化器步骤前也将参数升级为FP32。
>> 提供指南,介绍如何在DeepSpeed和FSDP间切换,配置分片策略、权重预取等。
优势:
>> 统一了DeepSpeed和FSDP在Accelerate中的表现,提供了可选的高低精度模式。
>> 指南让用户可以顺畅切换不同后端,充分利用两种方案的优势。
>> 为大规模对齐任务等提供了更好的性能和灵活性选择。
目录
Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析
相关论文
《A Hugging Face Accelerate Story of Multiple Backends: FSDP and DeepSpeed》的翻译与解读
核心要点梳理:DeepSpeed对比FSDP
Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析
相关论文
《A Hugging Face Accelerate Story of Multiple Backends: FSDP and DeepSpeed》的翻译与解读
地址 | 论文地址:https://huggingface.co/blog/deepspeed-to-fsdp-and-back |
时间 | 2024年6月13日 |
作者 | Yu Chin Fabian、aldo pareja、Zachary Mueller、Stas Bekman |
总结 | 总的来说,该文章阐述了FSDP和DeepSpeed在实现上的差异,Accelerate如何统一它们的行为,并提供指导帮助用户在两种后端之间切换。同时也讨论了低精度优化的内存与收敛权衡。 |
核心要点梳理:DeepSpeed对比FSDP
框架差异 | DeepSpeed 和 FSDP 是两种流行的优化器分片(ZeRO算法)实现,各自有不同的精度处理方式。DeepSpeed 默认在 fp32 精度下操作,FSDP 更灵活,可以选择更低的精度。 DeepSpeed 和 PyTorch 中的 FSDP 是社区中两种流行的 ZeRO Redundancy Optimizer (Zero) 算法实现,用于分布式训练大型模型。Hugging Face Accelerate 允同时支持这两个框架之间无缝切换。 |
是否可互换 | DeepSpeed 和 FSDP 在损失收敛上有明显差异,造成差异的原因在于精度处理不同。可以通过调整学习率可改善 FSDP 表现。 在实验中,使用 Mistral-7B 模型进行训练时,DeepSpeed 的损失收敛良好,而 FSDP 的损失没有减少,收敛效果较差。通过将学习率根据 GPU 数量进行调整,FSDP 的表现有所改善。 |
精度问题 | DeepSpeed 使用 fp32,FSDP 允许低精度操作。 DeepSpeed 内部使用全精度(fp32)进行优化,这可能导致在低精度下不收敛的问题。FSDP 不强制使用全精度,允许在低精度(如BF16)下操作,从而提供了更大的灵活性。 DeepSpeed 内部总是将参数提升到 fp32 进行计算,这在小规模 GPU 环境中可能增加内存消耗。FSDP 则允许使用低精度操作,更适合内存受限的场景,但收敛可能较慢。DeepSpeed 的upcasting方式则收敛更快,但内存开销较大。 |
协调改进 | FSDP 在 Accelerate 中增加了自动提升精度功能,支持混合精度和低精度模式。 为了更好协调 DeepSpeed 和 FSDP ,Hugging Face Accelerate 为 FSDP 增加了自动提升精度的功能。FSDP 现在可以在“混合精度”和“低精度”两种模式下操作。 为统一两种后端,Hugging Face Accelerate为FSDP 引入了"混合精度"模式,与DeepSpeed 行为一致,在FP32上进行优化。 因此Accelerate下FSDP 有两种模式: >> 默认低精度模式,参数保持载入精度(如BF16),内存占用少; >> 混合精度模式,参数在FP32上优化,行为与DeepSpeed 一致; |
性能对比 | FSDP 和 DeepSpeed 在 IBM Granite 7B 上表现相似,处理速度和效率接近。 使用 IBM Granite 7B 模型进行吞吐量比较,FSDP 和 DeepSpeed 的表现相似。 在四个 A100 GPU 上进行测试,FSDP 和 DeepSpeed 的每秒处理的 token 数量和模型 FLOP 利用率相近。 |
结论与思考 | 提供迁移指南,通过配置文件可在两个框架间切换。 Hugging Face Accelerate提供了帮助用户在两个框架之间迁移的概念指南。通过修改 Accelerate 配置文件,可以轻松在 FSDP 和 DeepSpeed 之间切换。 Accelerate提供了新的概念指南,帮助用户在两种后端之间迁移,包括分片策略、模型加载、权重预取等。通过Accelerate的命令行和插件类,可以轻松切换FSDP 和DeepSpeed 后端。 |
相关文章:
LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析
LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析 导读:该文章阐述了FSDP和DeepSpeed在实现上的差异,Accelerate如何统一它们的行为,并提供指导帮助用户在两种后端之间切换。同时也讨论了低精度优化…...
HarmonyOS应用开发学习-ArkTs声明式UI描述
ArkTs声明式UI描述 1 创建组件 声明式UI描述 ArKTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑 创建组件 根据组件构造方法的不同,创建组件包含有参数和无参…...
Redis20-通信协议
目录 RESP协议 概述 数据类型 模拟Redis客户端 RESP协议 概述 Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub): 客户端(client)向服务端(server)发送一条命…...
Unity Shader变体优化与故障排除技巧
在 Unity 中编写着色器时,我们可以方便地在一个源文件中包含多个特性、通道和分支逻辑。在构建时,着色器源文件会被编译成着色器程序,这些程序包含一个或多个变体。变体是该着色器在满足一组条件后生成的版本,这通常会导致线性执行…...
数据结构——时间复杂度和空间复杂度
目录 时间复杂度 什么是时间复杂度 常见时间复杂度类型 如何计算时间复杂度 空间复杂度 什么是空间复杂度 常见的空间复杂度类型 如何计算空间复杂度 时间复杂度和空间复杂度是评估算法性能的两个重要指标。 时间复杂度 什么是时间复杂度 时间复杂度描述了算法执行所需…...
(echarts) 饼图设置滚动图例
(echarts) 饼图设置滚动图例 效果: 代码: // 图例 legend: {type: scroll,orient: vertical,right: 10,top: 20,bottom: 20,data: data.legendData},参考:官网-可滚动的图例 https://echarts.apache.org/examples/zh/editor.html?cpie-leg…...
Java spring SSM框架--mybatis
一、介绍 Spring 框架是一个资源整合的框架,可以整合一切可以整合的资源(Spring 自身和第三方),是一个庞大的生态,包含很多子框架:Spring Framework、Spring Boot、Spring Data、Spring Cloud…… 其中Spr…...
Python知识点:如何使用Arduino与Python进行物联网项目
Arduino和Python是物联网(IoT)项目中常用的两种技术。Arduino是一个开源的硬件平台,而Python是一种高级编程语言,它们可以结合使用来创建各种智能设备和系统。以下是使用Arduino和Python进行物联网项目的一般步骤: 确定项目需求: …...
论文复现_从 CONAN 中收集 TPL 数据集
1. 概述 CONAN:Conan是一个用于C项目的开源包管理工具。 它的主要目标是简化C项目的依赖关系管理过程,使开发人员能够更轻松地集成、构建和分享C库。 其中有一些比较独特的功能,例如:版本管理、第三方库管理等。 TPL 数据集&…...
使用Docker将Java项目打包并部署到CentOS服务器的详细教程。
当然,让我们将上述步骤进一步细化,以便更好地理解整个过程。 前提条件 一个Java项目CentOS服务器,并且已安装DockerJava项目可以正常在本地运行具有服务器访问权限 ———————————————————————————————————…...
嘉立创eda布线宽度
https://prodocs.lceda.cn/cn/pcb/route-routing-width/#%E5%B8%83%E7%BA%BF%E5%AE%BD%E5%BA%A6...
硬件面试经典 100 题(31~50 题)
31、多级放大电路的级间耦合方式有哪几种?哪种耦合方式的电路零点偏移最严重?哪种耦合方式可以实现阻抗变换? 有三种耦合方式:直接耦合、阻容耦合、变压器耦合。直接耦合的电路零点漂移最严重,变压器耦合的电路可以实现…...
5G:下一代无线通信技术的全面解析
随着科技的不断进步,移动通信技术也在飞速发展。从2G到4G,我们见证了无线网络的巨大变革,而现在,5G已经悄然来临。作为下一代无线通信技术,5G不仅将带来更快的速度和更低的延迟,还将开启全新的应用场景和商…...
关于refresh_token
前文介绍过jwt的一般使用场景,用户登录成功后获得jwt,其中包含用户相关信息,主要是在前端要用到的属性(比如姓名、应用角色[这个前端后都用得着]等)、在后端要用到的属性(比如登录IP、终端唯一标识…...
Linux网络:基于OS的网络架构
Linux网络:OS视角下的网络架构 网络分层模型OSI 七层模型TCP/IP 五层模型 协议操作系统与网络网络相关命令ifconfigpingnetstat 本博客将基于操作系统,讲解计算机网络的设计理念,帮助大家理解操作系统与网络之间的关系。 网络分层模型 网络…...
UEC++学习(十六)变量添加中文注释、ui设置中文文本
(一)变量添加中文注释 在C 项目中创建变量,并在蓝图中显示变量的英文名同时附带中文注释,可以使用UPROPERTY 的 ToolTip 元数据属性来实现 UPROPERTY(EditAnywhere, meta (ToolTip "弹夹最大容量"))int32 MagCapacit…...
Redis延迟双删
1、何为延时双删 Redis延迟双删是一种在数据更新操作中确保缓存与数据库数据一致性的策略,通过两次缓存删除操作间隔一段延时来减少数据不一致的问题。 在并发环境下,多个请求同时对同一数据进行读写时,如果没有妥善处理,很容易…...
WO Mic 手机变身免费麦克风
目录 一、主要特点 1.支持多种连接方式 2.应用广泛 3.低延迟 4.简易配置 5.自动连接 6.音频格式 二、软件下载 三、软件安装 四、系统连接 五、测试 直播的时候,上课的时候,会议的时候……突然发现没有麦克风或者电脑麦克风有故障,这可怎么办呢?今天给大家介绍一…...
MQ死信对列
面试题:你们是如何保证消息不丢失的? 1、什么是死信 死信就是消息在特定场景下的一种表现形式,这些场景包括: 1. 消息被拒绝访问,即消费者返回 basicNack 的信号时 或者拒绝basicReject 2. 消费者发生异常࿰…...
springboot乡镇小区管理系统-计算机毕业设计源码73685
摘 要 过去使用手工的管理方式对乡镇小区进行管理,造成了管理繁琐、难以维护等问题,如今使用计算机对停车场停车的各项基本信息进行管理,比起手工管理来说既方便又简单,而且具有易于管理、搜索速度快、存储量大等多个优点。将其使…...
基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
系统程序文件列表 项目功能:客户,技师,车辆信息,财务,客户维修,维修分配,维修订单,保养预约,保养分配,保养订单,维修费用,保养费用 开题报告内容 基于Vue框架的4S店汽车维修保养管理系统 开题报告 一、项目背景与意义 随着汽车产业的迅猛发展,4S店作…...
小米开放式耳机值得买吗?南卡、小米、漫步者一周横评
大家好,最近对开放式耳机比较感兴趣,作为一名数码博主以及多年的耳机发烧友,今天想给大家测评一下开放式耳机,这类耳机目前在数码圈非常火热!很多喜欢运动的小伙伴都选择了这款耳机,搭配运动场景听歌&…...
解决oracel锁表问题;SQL 错误 [54] [61000]: ORA-00054: 资源正忙
问题描述; SQL 错误 [54] [61000]: ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 select session_id from v$locked_object;查看这些 session_id 对应的会话的详细信息,包括用户名、机器名、程序等,9596等是select se…...
Jfinal与hibernate-validator实现后台表单
一. pom.xml配置 jfianl maven项目基础上增加 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-validator.version}</version></dependency><dependency…...
ansible playbook使用jinja2语法渲染inventory下的主机名和IP到/etc/hosts
1. ansible inventory 下面的 hosts内容如下: [all_host] app1 ansible_host10.2.162.147 app2 ansible_host10.2.162.148 app3 ansible_host10.2.162.149 app4 ansible_host10.2.162.150 app5 ansible_host10.2.162.151[nginx] app12. hosts.j2内容如下 127.0.0…...
张飞硬件1~9电阻篇笔记
电阻有标定值和实际值,关于误差的问题: 精密的电流、电压采样可能会用到1%的精度。如果只是做限流用途的话,用5%就足够。 电阻功率:标定值、额定值、瞬态值: 标定值由封装所决定,例如5W额定值由电路中平…...
探索Golang的微观世界:用net/trace包追踪网络操作
标题:探索Golang的微观世界:用net/trace包追踪网络操作 在Go语言的丰富生态系统中,net/trace包是一个强大的工具,它允许开发者深入网络请求的微观世界,洞察每一次数据的流动和操作的执行。本文将详细探讨如何使用net/…...
Unity开发抖音小游戏广告部分接入
Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容,因为要接入广告,所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…...
World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG
World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版,80级,5人副本古达克,科技队伍(BUG队伍) 副本有两个门口 这样看,是不是觉得很怪。是的,和图1刚好相反的。 因此应该翻转180…...
极狐GitLab 密钥推送保护如何保护密钥信息被泄露?
极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...
漳州 网站建设公司/google排名
1.HDFS的设计 HDFS设计的适合对象:超大文件(TB级别的文件)、流式数据访问(一次写入,多次读取)、商用硬件(廉价硬件) HDFS设计不适合的对象:低时间延迟的数据访问、大量的小文件、多用户写入,任意修改文件 2.HDFS的概念 1).数据块(…...
外贸建站cms/seo推广优化工具
SELECT * FROM 表名 limit m,n;SELECT*FROMtableLIMIT[offset,]rows;1.m代表从m1条记录行开始检索,n代表取出n条数据。(m可设为0)如:SELECT * FROM 表名 limit 6,5;表示:从第7条记录行开始算,取出5条数据2.值得注意的是࿰…...
怎样自己做网站推广/seo技术分享
教育 -金融工程学-新-章节资料考试资料-宁波财经学院【】 1.1 随堂测试 1、【多选题】从交易层面来看,属于零和游戏的有: A、股票 B、期货 C、期权 D、互换 参考资料【 】 2、【判断题】远期合约出现的比期货合约早。 A、正确 B、错误 参考资料【 】 3、…...
微商的自己做网站叫什么名字/网站要怎么创建
如果要获取行,则需要从每个数组中获取值,然后根据值创建新数组。您可以手动分配值,也可以使用for循环,例如...int[][] MyMat {{0,1,2,3,4}, {9,8,7,6,5}};// get your columns... (easy)int[] My0 MyMat[0]; //My0 {0,1,2,3,4}i…...
长沙网站建设哪家靠谱/郑州见效果付费优化公司
String.prototype.charAt()str.charAt(index)返回字符串中指定位置的字符。字符串中的字符从左向右索引,第一个字符的索引值为 0,最后一个字符(假设该字符位于字符串 stringName 中)的索引值为 stringName.length - 1。如果指定的 index 值超出了该范围&…...
昌乐哪里有做网站的/互联网营销师考试
其它信息 下载: http://cdn.cocos2d-x.org/cocos2d-x-3.0alpha1.zip 完整的更新日志: https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.0alph1/CHANGELOG API 参考:http://www.cocos2d-x.org/reference/native-cpp/V3.0alpha1/index.html 要求 运行环境…...