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
摘 要 过去使用手工的管理方式对乡镇小区进行管理,造成了管理繁琐、难以维护等问题,如今使用计算机对停车场停车的各项基本信息进行管理,比起手工管理来说既方便又简单,而且具有易于管理、搜索速度快、存储量大等多个优点。将其使…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
