Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WeeklyReport] zty-king 2024.09.09~2024.09.23 #390

Merged
merged 14 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
### 姓名
郑天宇

### 实习项目
自动并行在复杂模型结构下的能力摸底和技术储备

### 本周工作

1. **对自动并行及工作相关信息进行学习**

* 学习了动态图,静态图组网,数据并行,张量并行,流水并行
* 学习了如何使用docker部署paddle,编译,提交rfc、pr等流程


2. **开发了load_state_dict_from_url API,并写了多个单测**

* 为paddle.hub开发了新的加载 Paddle 序列化对象的API
* 可以通过URL下载并加载 Paddle 序列化对象
* 可以通过URL下载并解压ZIP格式的模型权重文件,再加载 Paddle 序列化对象
* 当权重文件存在时,可以直接加载 Paddle 序列化对象


### 下周工作

1. 实现在组网时打印每路dp的loss
2. 离线aadiff检查
3. 在线aadiff检查
4. zero padding check

### 导师点评
郑天宇同学本周在实习项目中展现了良好的学习能力和开发能力。
学习能力强:郑天宇同学在短时间内迅速学习了自动并行相关的知识,包括动态图、静态图组网、数据并行、张量并行和流水并行,这些内容是并行计算中的核心知识点,对学习自动并行打下了坚实的基础。
技术掌握迅速:通过学习,郑天宇同学掌握了如何在docker中部署paddle,熟悉了编译、提交RFC和PR等流程,这些都是实际开发中非常重要的技能。
开发效率高:本周内,郑天宇同学不仅学习了大量新知识,还开发了load_state_dict_from_url API,并编写了多个单元测试。这个功能对PaddleHub的易用性是一个很好的补充,能够提高用户从URL加载模型的便利性。
计划明确:对于下周的工作,郑天宇同学已经有了清晰明确的计划,包括在组网时打印每路dp的loss、离线aadiff检查、在线aadiff检查和zero padding check,这些都是针对自动并行技术的重要调试和验证步骤。

后续建议:
深入理解原理:虽然郑天宇同学已经掌握了基本的概念和操作流程,但建议进一步深入理解自动并行的底层原理,这将有助于在实际项目中更好地解决可能遇到的问题。
注重测试覆盖:在开发新功能时,确保单元测试能够覆盖尽可能多的场景,特别是边界条件和异常情况,以提高代码的健壮性。
加强沟通:在实习过程中,遇到任何问题或不确定的地方,建议及时与导师或团队成员沟通,这不仅能更快地解决问题,还能促进知识的共享和团队的协作。
文档撰写:对于开发的功能和遇到的问题,建议撰写详细的文档,这既能帮助自己回顾和总结,也能为后来的开发者提供有价值的参考。
总体而言,郑天宇同学本周的表现非常出色,希望继续保持这种学习和工作的热情,相信在接下来的实习中会有更大的收获。
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
### 姓名
郑天宇

### 实习项目
自动并行在复杂模型结构下的能力摸底和技术储备

### 本周工作

1. **在线aadiff检查**

* 学习流水并行,其中主要了解1F1B,ZERO_BUBBLE,VPP的编排方式
* 制定了1F1B编排方式下的aadiff_check方法


### 下周工作

1. 研究如何在ZERO_BUBBLE,VPP编排方式下做aadiff_check
2. 研究他们的共同点,查看是否能采用抽象的方法,统一构建aadiff_check

### 导师点评
郑天宇同学本周在实习项目中继续展现了专业的学习能力和问题解决能力。
深入学习流水并行:郑天宇同学本周专注于流水并行的学习,特别是1F1B、ZERO_BUBBLE、VPP等编排方式,这些都是流水并行中的关键技术。通过学习,郑天宇同学对流水并行的原理和应用有了更深入的理解。
制定aadiff_check方法:基于学习的流水并行知识,郑天宇同学制定了1F1B编排方式下的aadiff_check方法。这是一个重要的技术贡献,因为aadiff_check是验证自动并行正确性的关键步骤。
计划明确且有针对性:对于下周的工作,郑天宇同学已经制定了明确且有针对性的计划,包括研究ZERO_BUBBLE和VPP编排方式下的aadiff_check,以及探索这些编排方式的共同点,以尝试采用抽象方法统一构建aadiff_check。这些计划都紧密围绕实习项目的核心目标展开。

建议:
加强实践验证:在制定aadiff_check方法后,建议通过实际案例进行验证,确保方法的正确性和有效性。这有助于提升郑天宇同学对自动并行技术的理解和掌握程度。
注重总结归纳:在学习和研究过程中,建议郑天宇同学注重总结归纳,将学到的知识和经验形成文档或笔记。这不仅有助于自己回顾和复习,也能为后来的学习者提供有价值的参考。
探索创新点:在研究ZERO_BUBBLE和VPP编排方式下的aadiff_check时,建议郑天宇同学积极探索创新点,尝试提出新的思路和方法,以提升自动并行技术的效率和准确性。
保持与导师的沟通:在研究过程中,如果遇到任何问题或不确定的地方,建议郑天宇同学及时与导师沟通,寻求帮助和建议。这有助于更快地解决问题,确保研究工作的顺利进行。
总体而言,郑天宇同学本周的表现非常出色,展现出了扎实的专业知识和良好的学习能力。相信在接下来的实习中,郑天宇同学将继续保持这种积极的学习态度和工作精神,取得更大的进步和成果。
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
### 姓名
郑天宇

### 实习项目
自动并行在复杂模型结构下的能力摸底和技术储备

### 本周工作

1. **在线aadiff检查**

* 了解pir_pass.py、distributed>auto_parallel>static>utils.py、distributed>parallel.py等代码,思考aadiff_check的开发位置
* 继续了解VPP的编排方式


### 下周工作

1. 开始开发aadiff_check的代码
2. 测试开发的aadiff_check的基础部分代码

### 导师点评
95 changes: 95 additions & 0 deletions WeeklyReports/Hackathon_7th/08_zty-king/aadiff检查_2021.10.25.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Pipelin Parallel学习记载

## 1.流水线并行PP评价指标

流水并行(Pipeline Parallelism,PP)中,针对流水并行(PP)假设并行的stage 切分为p 份,micro-batches 为m,每个micro-batches 的前向和后向执行时间为tf 和tb。在理想的环境下,前向和后向的合起来理想的执行时间应该是(图1解释下列公式原因,):
$$
t_{ideal}=m(tf+tb)
$$
不过在实际 Pipeline 把网络模型切分成不同 stage(**stage指的是模型的不同阶段**) 放在不同的机器,会导致在正向的 p - 1 和反向的 p – 1 时间内会出现计算等待时间。那这个中间空白的地方,我们叫做 Bubble 空泡。

而空泡 Bubble 的产生,是因为算子内并行和算子间并行解决单设备内存不足的问题,模型经过拆分后的上一个 rank 的 stage 需要长期持续处于空闲状态,等待 其他 rank 的 stage 计算完成,才可以开始计算,这极大降低了设备的平均使用率。这种现象被称为**并行空泡(Parallelism Bubble**)。

![image-20241025002541833](images/图1.png)

<div style="text-align: center;">图1</div>

总的 bubble 占用的时间跟流水并行 PP 切分策略相关(看图2,这里的p-1与bubble产生的原因有关,可以看到,在前向传播的时候,最开始时,每个stage的计算要等待前一个计算的结果,因此,从时间线上看(横轴),最终会多出p-1个前向时钟周期,即每多一个stage,就多一个前向时钟周期,因此,当stage为p时,就多出p-1个前向时钟周期):
$$
t_{bubble}=(p-1)(tf+tb)
$$
![image-20241025002636784](images/图2.png)

<div style="text-align: center;">图2</div>

## 2.流水并行1F1B编排模式

### 2.1 1F1B编排模式解读

![image-20241024155644457](images/图3.png)

<div style="text-align: center;">图3</div>

1F1B 示例如图所示,以 GPU3 的 F1(GPU3 的第 2 个 micro-batch 的前向计算)为例,F1 在计算前,F1 的反向 B1(GPU3 的第 1 个 micro-batch 的反向计算)已经计算结束,即可释放 F1 的中间变量,从而 F2 可以复用 F1 中间变量的显存。**释放不必要的中间变量,峰值显存下降,设备资源利用率显著提升,但bubble数没变**



### 2.2 分析1F1B中bubble来源

为了在bubble中添加check操作,来检查forward是否正常进行,首先需要分析bubble是如何产生的,才能知道在哪里会产生bubble,以及什么会影响到bubble的个数

​ **1.设备数与num_micro_batches数确定时,分析时序图是否唯一**

​ 当设备数为4个,num_micro_batches为4时分析理想1f1b和非理想1f1b两种情况的时序图:

![image-20241024224556795](images/非理想1f1b时序图.png)

<div style="text-align: center;">非理想1f1b时序图</div>

![image-20241024223821441](images/理想1f1b时序图.png)

<div style="text-align: center;">理想1f1b时序图</div>

​ **分析结果:**

​ 从上面两个图可以看到,同样采用1f1b的思想,即当一个micro_batche的forward部分做完就立刻做其backward,并且对于每一个设备来说,他们的job顺序都没有改变——举个例子,1F1B在编排时,会产生对于GPU1来说,在**warmup阶段**会编排warmup_num=pp_degree(纯pp下,使用的设备数)-pp_stage(纯pp下,设备编号),对于GPU1来说,就是4-1=3,即先编排3个foward,对应图中的1,2,3;接着在**Stabilization阶段**会编排num_micro_batches-warmup_num个1F1B,对应GPU1来说就是4-3=1,即编排1组连续的FB;最后**warmdown阶段**因为foward部分做完了,所以对应的,还需要编排warmup_num个backword。可以看到非理想的1f1b下,每个设备的job顺序也是按照这个来排列的,但是job发生的时间有所不同。

​ 分析可知,虽然时序图不唯一,但是我们可以发现,两种时序图对应的最终计算结果是一致的,因此我们想要在bubble时期插入操作,则强制让其按理想的1f1b时序图来执行即可,例如在GPU1的第三个forward后面插入3个周期的check操作。



​ **2.设备数与num_micro_batches数确定时,forward和backward时钟周期不一致,分析1F1B时序图变化**

![image-20241024231404936](images/backward为2个时钟周期时序图.png)

<div style="text-align: center;">backward为2个时钟周期时序图</div>

​ **分析结果:**

​ 分析可知,此时bubble的个数变多了,每个设备上的bubble数,从原来的6个变成了9个,从bubble产生的原因可知,是因为前向产生了3个forward的等待,后向产生了3个backward的等待,因此产生的bubble数为`3*t_f+3*t_b`,该公式对于任意的forward和backward的时钟周期都成立,因此也可以将其用数学公式规律化。



### 2.3 分析1F1B中bubble_check插入位置

![image-20241024233326719](images/bubble_check插入位置分段分析图.png)

<div style="text-align: center;">bubble_check插入位置分段分析</div>

​ 观察上图,与理想1f1b时序图有些差别,但是对比两图可以发现,同样满足1F1B的编排方式,因为1F1B的编排可分为3个阶段,**warmup阶段**、**Stabilization阶段**、**warmdown阶段(自己编的名字)**而此时bubble_check的插入位置即可表示如下:

1. 在**warmup阶段**,在原来排列好的job前,插入`pp_stage-1`个bubble_check

2. 在**Stabilization阶段**,在原来排列好的job前和后,分别插入`pp_degree-pp_stage`个bubble_check

3. 在最后的**warmdown阶段**,在原来排列好的job后面,插入`pp_stage-1`个bubble_check



**再考虑一种num_micro_batches>pp_degree**

![image-20241025000830757](images/num_micro_batches>pp_degree时bubble_check插入位置分析图.png)

<div style="text-align: center;">num_micro_batches>pp_degree时bubble_check插入位置分析</div>

可以看到,规律还是如上公式所示。
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading