TP DP PP 并行训练方法介绍

news2024/11/18 9:39:33

这里写目录标题

  • 张量并行TP
  • 流水线并行 PP
      • naive模型并行
      • GPipe
      • PipeDream
  • 数据并行DP
    • FSDP

张量并行TP

挖坑

流水线并行 PP

经典的流水线并行范式有Google推出的Gpipe,和微软推出的PipeDream。两者的推出时间都在2019年左右,大体设计框架一致。主要差别为:在梯度更新上,Gpipe是同步的,PipeDream是异步的。异步方法更进一步降低了GPU的空转时间比。虽然PipeDream设计更精妙些,但是Gpipe因为其“够用”和浅显易懂,更受大众欢迎(torch的pp接口就基于Gpipe)。因此本文以Gpipe作为流水线并行的范例进行介绍。https://zhuanlan.zhihu.com/p/613196255

gpipe论文 https://arxiv.org/pdf/1811.06965.pdf

naive模型并行

在这里插入图片描述
图片来自https://arxiv.org/pdf/1806.03377.pdf

如果一个模型一个gpu放不下,就某些层放在一个卡,上图表示一共四个卡,F0表示第0个batch,灰色的第一个卡计算完第0个batch交给黄色的卡。黄卡上放的模型的层的输入是灰色的卡上放的模型的输出。一次只有一个gpu工作。

GPipe

把mini batch分成micro batch,这样多个gpu可以同时计算。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vWgbtoCx-1691048478616)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8aa74ef6-308b-48d9-b961-ac72a6031873/Untitled.png)]

具体的算法:

用户定义好L层的网络、前向、损失函数等以后,GPipe 就会将网络划分为 K 个单元,并将第 k 个单元放置在第 k 个加速器上。通信原语自动插入到分区边界,以允许相邻分区之间的数据传输。分区算法最小化所有单元估计成本的方差,以便通过同步所有分区的计算时间来最大化管道的效率。

前向过程:GPipe先把大小为N的minibatch分成M个相等的micro batch,通过 K 个加速器进行流水线处理。在向后传递过程中,每个micro batch通过 K 个加速器进行流水线处理。在向后传递过程中,通过 K 个加速器进行流水线处理。在向后传递过程中,每个micro batch计算梯度都是基于跟前向同一个模型,没有误差哦。每个mini batch的最后,M个micro的梯度都计算完了

在前向计算期间,每个加速器仅存储分区边界处的输出激活。在向后传递期间,第 k 个加速器重新计算复合前向函数 Fk。

在micro-batch的划分下,我们在计算Batch Normalization时会有影响。Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。Layer Normalization则不受影响。

总结:
如果模型太大一张卡放不下,按照层来切开,第一层放在第一张卡,第二层放在第二张卡,这样第二层要等第一层的计算结果作为输入,等待的时候卡就空闲了很浪费。

gpipe的做法是batch再切开切成micro batch,这样虽然第一个microbatch的时候要等待,但是多张卡可以同时工作了。

GPipe 还用recomputation这个简单有效的技巧来降低内存,进一步允许训练更大的模型

如何按照层自动划分:根据计算量分配到每张卡

gpipe的micro batch上是需要累计梯度的

重计算,多计算一次前向换空间,但是不是梯度来了从头前向一次,中间有几个激活其实存下来了,叫做checkpoint,然后从checkpoing的激活值的位置前向就行。(因为每张卡上不止一个micro batch,所以激活的数量也是好几份,这个量就比较大)

Gpipe流水线其存在两个问题:硬件利用率低,内存占用大。于是在另一篇流水并行的论文里,微软 PipeDream 针对这些问题提出了改进方法,就是1F1B (One Forward pass followed by One Backward pass)策略。

PipeDream

微软在论文 PipeDream: Fast and Efficient Pipeline Parallel DNN Training

PipeDream 模型的基本单位是层,PipeDream将DNN的这些层划分为多个阶段。每个阶段(stage)由模型中的一组连续层组成

在这里插入图片描述

1F1B

由于前向计算的 activation 需要等到对应的后向计算完成后才能释放(无论有没有使用 Checkpointing 技术),因此在流水并行下,如果想尽可能节省缓存 activation 的份数,就要尽量缩短每份 activation 保存的时间,也就是让每份 activation 都尽可能早的释放,所以要让每个 micro-batch 的数据尽可能早的完成后向计算,因此需要把后向计算的优先级提高

在这里插入图片描述

参考:
[源码解析] 深度学习流水线并行Gpipe https://www.cnblogs.com/rossiXYZ/

数据并行DP

FSDP

fair scale的fsdp

https://engineering.fb.com/2021/07/15/open-source/fsdp/

Fully Sharded Data Parallel (FSDP) 是一种DP算法,offload一部分计算到cpu。但是模型的参数在多个gpu之间是share的?每个microbatch的计算还是local to每个gpu的

在标准 DDP 训练中,每个工作人员处理一个单独的批次,并使用allreduce对各gpu的梯度进行求和。虽然 DDP 已经变得非常流行,但它占用的 GPU 内存超出了其需要,因为模型权重和优化器状态会在所有 DDP 工作线程之间复制。

FSDP是pytorch1.11的新特性。其新特性目的主要是训练大模型。我们都知道pytorch DDP用起来简单方便,但是要求整个模型能加载一个GPU上,这使得大模型的训练需要使用额外复杂的设置进行模型拆分。pytorch的FSDP从DeepSpeed ZeRO以及FairScale的FSDP中获取灵感,打破模型分片的障碍(包括模型参数,梯度,优化器状态),同时仍然保持了数据并行的简单性。

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

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

相关文章

Java阶段五Day19

Java阶段五Day19 问题解析 需求单查询列表功能的bug 业务逻辑: 需要用户登录,师傅入驻,审核入驻通过 查询师傅详情(areaIds,categoryIds) demand-server-dao-impl 包含持久层实现 requestOrderMappe…

JavaScript数据结构与算法——栈

文章目录 一、初始栈结构1.1 特性1.2 注意事项 二、栈结构的封装2.1 封装简单栈结构2.2 利用栈将十进制转二进制 一、初始栈结构 1.1 特性 类似于汉诺塔,后进先出,每次只能操作栈顶的元素。关键词:压栈、退栈 简单示意图: 1.…

java编码规范 和 数据库规范

总体规约以《阿里巴巴Java开发手册》为主,请开发人员至少阅读一遍该手册。 一、java编码规范 1.1 java基础规范 多使用 jdk自带库和被验证的第三方库的类和函数,不要用野路子来的jar包 无论是包、类、方法、变量,见名知意 1.2 在线文档规…

AlmediaDev Style Controls Crack

AlmediaDev Style Controls Crack StyleControls是一个稳定、强大的包(超过100个组件),它使用经典绘图、系统主题、GDI和VCL样式。该软件包包含扩展标准VCL控件的独特解决方案,还包含许多独特的高级控件,用于创建具有Fluent UI模糊背景的现代…

AI的蓬勃发展,程序员的末日?

一、AI是什么?AI有哪些类型?生成式AI是什么?未来AI有哪些发展方向? ● AI是人工智能(Artificial Intelligence)的缩写,是比人类更强大的算法与软硬件系统,能模拟出人类智力相关的某些行为与功能。 ● AI主要分为三大类型: 机器学…

Docker Compose 使用方法

目录 前言 安装 Docker Compose Ubuntu 安装与更新 Red Hat 安装与更新 验证是否安装 Docker Compose 创建 docker-compose.yml 文件 创建一个MySQL 与 tomcat 示例 使用Docker Compose启动服务 前言 Docker Compose 是一个工具,旨在帮助定义和 共享多容器…

Scikit Learn识别手写数字 -- 机器学习项目基础篇(6)

Scikit learn是机器学习社区中使用最广泛的机器学习库之一,其背后的原因是代码的易用性和机器学习开发人员构建机器学习模型所需的几乎所有功能的可用性。在本文中,我们将学习如何使用sklearn在手写数字数据集上训练MLP模型。 其优势是: 它提…

React 在 html 中 CDN 引入(包含 antd、axios ....)

一、简介 cdn 获取推荐 https://unpkg.com&#xff0c;unpkg 是一个快速的全球内容交付网络&#xff0c;适用于 npm 上所有内容。 【必备】react 相关 cdn。附&#xff1a;github 官方文档获取、现阶段官方文档 CDN 网址。 <script crossorigin src"https://unpkg.com…

matlab使用教程(8)—绘制三维曲面图

1网格图和曲面图 MATLAB 在 x-y 平面中的网格上方使用点的 z 坐标来定义曲面图&#xff0c;并使用直线连接相邻的点。mesh 和surf 函数以三维形式显示曲面图。 • mesh 生成仅使用颜色来标记连接定义点的线条的线框曲面图。 • surf 使用颜色显示曲面图的连接线和面。 MATL…

Android沉浸式状态栏主题跟随状态栏背景颜色自动变化主题,状态栏主题跟随状态栏背景色自适应

1.状态栏显示模式介绍 Android系统提供了两种显示模式&#xff1a;明亮模式与暗黑模式 明亮模式&#xff08;Light Model&#xff09;&#xff1a;整体偏亮&#xff0c;即背景亮色&#xff0c;文字等内容暗色。 暗黑模式&#xff08;Dark Model&#xff09;&#xff1a;整体偏…

flutter开发实战-实现首页分类目录入口切换功能

。 在开发中经常遇到首页的分类入口&#xff0c;如美团的美食团购、打车等入口&#xff0c;左右切换还可以分页更多展示。 一、使用flutter_swiper_null_safety 在pubspec.yaml引入 # 轮播图flutter_swiper_null_safety: ^1.0.2二、实现swiper分页代码 由于我这里按照一页8…

C高级--day3(shell中的输入、命令置换符、数组、算数运算、分支结构)

#!/bin/bash pls ~/ -l | grep "^-" | wc -l qls ~/ -l | grep "^d" | wc -l echo "普通文件个数&#xff1a;$p" echo "目录文件个数&#xff1a;$q"#!/bin/bash read file posexpr index $file \. strexpr substr $file $((pos1)) 2…

Xposed回发android.os.NetworkOnMainThreadException修复

最近用xposed进行hook回发的时候&#xff0c;又出现了新的问题&#xff1b; android.os.NetworkOnMainThreadException&#xff1b; 在Android4.0以后&#xff0c;写在主线程&#xff08;就是Activity&#xff09;中的HTTP请求&#xff0c;运行时都会报错&#xff0c;这是因为…

解决K8S集群设置污点后,污点不生效,下发应用的问题

问题&#xff1a;在集群中部署了三个daemonset&#xff0c;一开始加了容忍Toleration&#xff0c;后边去掉Toleration后&#xff0c;还是一直往边缘节点上部署应用&#xff0c;非常离谱 解决&#xff1a;删掉Toleration后&#xff0c;需要把annotations一起删掉&#xff0c;因为…

Rust中的高吞吐量流处理

本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库&#xff0c;还使用这些库实现了一个流处理程序。 最后&#xff0c;作者介绍了如何通过测量空闲和阻塞时间来优化流处理程序的性能&#xff0c;并将这些内容同步至…

AcWing257. 关押罪犯(二分图+染色法)

输入样例&#xff1a; 4 6 1 4 2534 2 3 3512 1 2 28351 1 3 6618 2 4 1805 3 4 12884输出样例&#xff1a; 3512 解析&#xff1a; 二分&#xff0c;每次查看是否是二分图 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N2e45,M2e55…

【基础类】—DOM事件系统性学习

一、基本概念&#xff1a;DOM事件的级别 // DOM0 element.onclickfunction(){} // DOM2, 新增了冒泡和捕获 element.addEventListener(click,function(){}, false) // DOM3, 新增更多事件类型 鼠标、键盘等 element.addEventListener(keyup,function(){}, false)二、DOM事件模…

如何使用ONLYOFFICE+ffmpeg来给视频文件打马赛克

如何使用ONLYOFFICEffmpeg来给视频文件打马赛克 我这里之前写过很多关于ONLYOFFICE使用、安装的系列图文&#xff0c;也写过很多关于ffmpeg使用的图文&#xff0c;那么这次继续&#xff0c;把这两个开源软件放在一起&#xff0c;能碰撞出什么火花般的功能来。 这就是给视频文…

【Linux后端服务器开发】poll/epoll多路转接IO服务器

目录 一、poll原理 二、poll实现多路转接IO服务器 三、epoll函数接口 四、epoll的工作原理 五、epoll实现多路转接IO服务器 一、poll原理 poll函数接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);// pollfd结构 struct pollfd …

c高级:day3

作业: 1. 整理思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 #!/bin/bash ######################################################################## # File Name: zy1.sh # Created Time: 2023年08月04日 星期五 19时13分08秒 ##############################…