Deepspeed、ZeRO、FSDP、ZeRO-Offload、all reduce、reduce-scatter

Transformer为基础的大模型应该如何并行

  • 数据并行。但是如果模型太大放不到一块卡上就没用了。为了解决把参数放到一块卡上的问题,演进出了论文Zero的思想,分为Zero-DP和Zero-R两部分。Zero-DP是解决Data parallel的问题,并行过程中内容不够,解决思路也比较简单,模型参数w只存在一台机器上,剩下的部分等用的时候找某台机器通过all-reduce请求就可以了。Zero-R是在每一层输入存不下,解决思想是带宽换内存。由Zero论文演进的Deep-speed框架影响了pytorch分布式计算的接口。
  • 模型并行。典型的是按照GPipe的思路,将模型按层切开,这样会实现像CPU流水线一样并行的设计。
  • 张量并行。典型的是Megatron LM,其实就是将矩阵乘法切开,参考下图:
    在这里插入图片描述

DeepSpeed中参数量的估计

  • 基本问题:在理解ZeRO前需要先理解一个基本问题,对于一个参数量为 Φ \Phi Φ的模型,使用Adam优化器单卡进行混合精度训练过程中至少占多大显存?结果是16* Φ \Phi Φ,分为以下两个部分:

    • 模型参数、模型梯度使用半精度FP16进行保存,模型迭代前向反向过程使用的都是FP16,因此对于模型参数、模型梯度的存储需要2* Φ \Phi Φ+2* Φ \Phi Φ个字节(半精度FP16或者BF16占用两个字节所以*2),也就是下图红框中的2+2
    • 在optimizer进行模型参数更新时,由于需要大量的累加和乘运算,半精度在这时经常出现精度溢出的情况,因此这时还是换回用FP32来优化,这也是混合精度计算命名的由来。在Adam更新时,原来FP16保存的模型参数会转换成FP32,占用4个字节。Adam中存在一阶矩和二阶矩两个Optimizer state,各占4个字节,也就是8个字节。因此这部分一共需要12个字节,也就是下图蓝框中的K=12(当然使用不同优化器这部分占用的显存是不一样的,这里就不展开了)。
      在这里插入图片描述
  • 核心想法:ZeRO的贡献分为ZeRO-DP(Data Parallel)和ZeRO-R(Residual State Memory)两部分优化思路:

    • ZeRO-DP实际上是利用参数服务器all reduce的思想把数据分到Nd块卡上,减少平均到每一块卡上的显存占用。DeepSpeed在实际使用中需要预先配置使用stage1(只数据并行上述K=12优化器状态部分的显存)或者stage2(数据并行上述K=12优化器状态部分+梯度部分的显存)或者stage3(数据并行上述K=12优化器状态部分+梯度部分+模型参数部分的显存),理解上图就理解了Zero工作的核心思想
    • ZeRO-R(Residual State Memory),这里Residual State Memory主要几个trick的叠加:1. 神经网络或者多层Transformers总依赖前一层算完才能再算下一层,保存前一层的结果会也会占用显存,ZeRO-R这里采用的是时间换空间通过合理并行来减少显存的想法;2. Constant Size Buffers,多卡通信中如果数据包太大或者太小都不利于整体效率,作者这里做了合理的tradeoff
  • 实际操作:由HuggingFace出的accelerate(https://huggingface.co/docs/accelerate/usage_guides/deepspeed)本身可以简化DeepSpeed的配置。DeepSpeed的配置项非常多,手动配置较容易出错,建议使用accelerate config完成初始配置后直接用accelerate launch不带其他accelerate参数启动code

  • 视频讲解: 来自李沐老师对这篇文章的精读(https://www.bilibili.com/video/BV1tY411g7ZT?vd_source=e260233b721e72ff23328d5f4188b304)强烈推荐,文章本身写的啰里啰嗦的

  • 论文地址: https://arxiv.org/pdf/1910.02054.pdf

Fully Sharded Data Parallel (FSDP)

FSDP来自facebook,对标微软在DeepSpeed中提出的Zero。FSDP可以看成PyTorch中的DDP优化版本,本身也是数据并行,但是和DDP不同的是,FSDP采用了parameter sharding,所谓的parameter sharding就是将模型参数也切分到各个GPUs上,而DDP每个GPU都要保存一份parameter,FSDP可以实现更好的训练效率(速度和显存使用),FSDP其实是和ZeRO-3更加接近

all-reduce=reduce-scatter+all-gather

在DDP中的操作是all-reduce,但是在FSDP中换成了reduce-scatter和all-gather,如下图
在这里插入图片描述
关于为什么all-reduce=reduce-scatter+all-gather?其实下面一张图解释的很清楚,引用https://engineering.fb.com/2021/07/15/open-source/fsdp/attachment/fsdp-graph-2a/的文字来说就是“All-reduce as a combination of reduce-scatter and all-gather. The standard all-reduce operation to aggregate gradients can be decomposed into two separate phases: reduce-scatter and all-gather. During the reduce-scatter phase, the gradients are summed in equal blocks among ranks on each GPU based on their rank index. During the all-gather phase, the sharded portion of aggregated gradients available on each GPU are made available to all GPUs (see here for details on those operators).” 简单来说就是把All Reduce这一步给打碎(scatter掉),如果直接all reduce,会存在广播的问题,带来的问题是带宽是瓶颈
在这里插入图片描述
为什么带宽会成为瓶颈,可以参考一流科技的文章https://juejin.cn/post/7090798853711986695:
在这里插入图片描述
关于reduce-scatter这几个操作的定义可以参考英伟达的文档https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/usage/collectives.html:
在这里插入图片描述

Zero-Offload

Zero-offload,也有被称为Zero4的, 这个甚至是一张卡都可以,Zero-offload就是针对GPU显存不够,甚至单卡的场景设计出来的。Zero-offload,为了优化各种算子的执行,把复杂的FWD和BWD放在了GPU上执行,而相对固定可控的算子param update和float2half就放在了CPU上进行运算,而这一部分除了相对算子简单以外,最重要的是Adam优化器本身是32bit的,把它放在CPU的内存上,会极大的节省GPU的显存。

这部分转载自:

  1. https://zhuanlan.zhihu.com/p/402232568
  2. https://www.zhihu.com/question/453941150/answer/3443788295

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Plecs电力电子仿真专业教程-软件操作

Plecs仿真软件基本操作方法: 从连线中引出线:Ctrl 鼠标左键 设置元件参数:双击元件,进行设置,若要显示参数,则在参数后的方框打勾。 CTRL E ---- 仿真参数设置 Ctrl T -----开始仿真 CtrlF …

如何检查电脑的最近历史记录?这里提供详细步骤

如果你怀疑有人在使用你的计算机,并且你想查看他们在做什么,下面是如何查看是否有访问内容的痕迹。 如何检查我的计算机的最近历史记录 要检查计算机的最近历史记录,应该从web浏览器历史记录开始,然后移动到文件。但是,可以修改或删除浏览器历史记录,也可以隐藏Windows…

Redis 和 Mysql 数据库数据如何保持一致性????

1、前言 我们在实际项目中经常会使用到Redis缓存用来缓解数据库压力,但是当更新数据库时,如何保证缓存及数据库一致性,一般我们采用延时双删策略。 目前系统中常用的做法是一个查询接口,先查询Redis,如果不存在则查询…

Vue——案例01(查询用户)

一、案例实现页面 二、案例实现效果 1. 查询效果 2. 年龄升序 3. 年龄降序 4. 原顺序 三、案例实现思路 1. 定义界面所需标签样式 <div id"app"><h2>查询用户:</h2><input type"text" placeholder"请输入名字"/><b…

RabbitMQ高级笔记

视频链接&#xff1a;【黑马程序员RabbitMQ入门到实战教程】 文章目录 1.发送者的可靠性1.1.生产者重试机制1.2.生产者确认机制1.3.实现生产者确认1.3.1.开启生产者确认1.3.2.定义ReturnCallback1.3.3.定义ConfirmCallback 2.MQ的可靠性2.1.数据持久化2.1.1.交换机持久化2.1.2.…

Python基础之函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.收集函数2.收集关键字函数3.分配关键字函数4.调用自己编写的模块函数5.匿名函数lambda6.lambda函数和filter函数联用7.lambda函数和map函数联用 前言 1.收集…

SQL109 纠错4(组合查询,order by..)

SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state MI UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IL ORDER BY cust_name;order by子句&#xff0c;必须位于最后一条select语句之后

社交网络的未来:Facebook如何塑造数字社交的下一章

引言 社交网络已成为我们生活中不可或缺的一部分&#xff0c;而Facebook作为其领军者&#xff0c;一直在塑造着数字社交的未来。本文将深入探讨Facebook在未来如何塑造数字社交的下一章&#xff0c;并对社交网络的发展趋势进行展望和分析。 1. 引领虚拟社交的潮流 Facebook将…

Nuxt v4 即将到来!2024 年 Nuxt 发展方向和想法

在 2023 年里&#xff0c;Nuxt 发生了很多事情。 Sbastien 和 Daniel 分享了他们对 Nuxt 所取得的成就以及下一步的发展方向的看法。 2023 年回顾 - Sbastien 2023 年 1 月&#xff0c;Daniel 提出了 Nuxt&#xff1a;2023 年愿景。我们实现了设定的大部分目标。其中一些缺失…

怎么把学浪的课上传到网盘

如何把学浪的课程上传到百度网盘&#xff0c;这是一个老大难的问题&#xff0c;视频的m3u8的key加密&#xff0c;作为非专业人士不知道如何下载&#xff0c;这里就教大家如何将学浪的课程下载下来&#xff0c;上传到自己网盘&#xff0c;随时随地的观看&#xff0c;或者分享给自…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…

学浪的视频怎么导出到手机?

学浪视频如何下载成mp4&#xff0c;这是一个老大难的问题&#xff0c;本文就教大家如何将学浪的视频下载到本地&#xff0c;让大家随时随地观看&#xff0c;想在电脑上观看学浪视频或者想在手机上观看学浪视频都可以 工具我打包在下面的链接里面 链接&#xff1a;https://pan…

代码随想录|Day28|贪心03|1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

1005.K次取反后最大化的数组和 思路&#xff1a; 优先取反 绝对值最大的负数如果没有负数&#xff0c;不断取反 绝对值最小的数&#xff0c;直到次数 K 耗尽 取反最小数有一个优化技巧&#xff1a; 如果 K 为偶数&#xff0c;则取反 K 次后&#xff0c;正负不变。如果 K 为奇数…

iOS - Runloop的运行逻辑

文章目录 iOS - Runloop的运行逻辑1. 苹果官方的Runloop执行图2. Mode里面的东西2.1 Source02.2 Source12.3 Timers2.4 Observers 3. 执行流程3.1 注意点 4. Runloop休眠 iOS - Runloop的运行逻辑 1. 苹果官方的Runloop执行图 2. Mode里面的东西 2.1 Source0 触摸事件处理pe…

Photoshoot 2(Java)

Photoshoot 2 题目描述 在一个似曾相识的场景中&#xff0c;Farmer John 正在将他的 N 头奶牛&#xff08;1≤N≤10^5&#xff09;排成一排&#xff08;为了方便将它们按 1⋯1⋯N 编号&#xff09;&#xff0c;以便拍照。 最初&#xff0c;奶牛从左到右按照 a1,a2,⋯,aN 的顺…

使用Vite安装TailwindCSS

一、认识TailwindCSS Tailwind CSS 是一个基于原子类的 CSS 框架&#xff0c;它提供了一种不同于传统 CSS 框架的方式来构建用户界面。下面是关于 Tailwind CSS 的优缺点以及它适合应用的情况&#xff1a; 优点&#xff1a; 灵活性&#xff1a; Tailwind CSS 提供了大量的原…

67、yolov8目标检测和旋转目标检测算法部署Atlas 200I DK A2开发板上

基本思想&#xff1a;需求部署yolov8目标检测和旋转目标检测算法部署atlas 200dk 开发板上 一、转换模型 链接: https://pan.baidu.com/s/1hJPX2QvybI4AGgeJKO6QgQ?pwdq2s5 提取码: q2s5 from ultralytics import YOLO# Load a model model YOLO("yolov8s.yaml")…

关系数据库理论

函数依赖: 关系数据库的规范化理论是数据库逻辑设计的工具。 关系模式由五部分组成&#xff0c;是一个五元组&#xff1a; R(U, D, DOM, F)  关系名 R 是符号化的元组语义  U 为一组属性  D 为属性组 U 中的属性所来自的域  DOM 为属性到域的映射  F 为属…

零基础入门转录组数据分析——DESeq2差异分析

零基础入门转录组数据分析——DESeq2差异分析 目录 零基础入门转录组数据分析——DESeq2差异分析1. 转录组分析基础知识2. DESeq2差异分析&#xff08;Rstudio&#xff09;3. 结语 1. 转录组分析基础知识 1.1 什么是转录组&#xff1f; 转录组&#xff08;transcriptome&#…

政安晨:【Keras机器学习实践要点】(八)—— 在 TensorFlow 中从头开始编写训练循环

目录 介绍 导入 第一个端对端示例 指标的低级处理 低层次处理模型跟踪的损失 总结 端到端示例&#xff1a;从零开始的 GAN 训练循环 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客…