-
Notifications
You must be signed in to change notification settings - Fork 73
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[WeeklyReport] kevincheng2 2023.10.10~2023.10.24
- Loading branch information
chengyanfu
committed
Oct 25, 2023
1 parent
9c46daf
commit d5ae497
Showing
6 changed files
with
173 additions
and
0 deletions.
There are no files selected for viewing
78 changes: 78 additions & 0 deletions
78
WeeklyReports/03_zhangyuqin1998/[WeeklyReport]2023.10.1~2023.10.20.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
### 姓名 | ||
张钰钦 | ||
|
||
### 实习项目 | ||
新IR Pass建设 | ||
|
||
### 本周工作 | ||
|
||
详见 https://github.com/yuanlehome/Hackathon/wiki/%E6%96%B0IR%E5%B8%B8%E9%87%8F%E6%8A%98%E5%8F%A0#%E6%8E%A8%E7%90%86%E6%B5%81%E7%A8%8B%E6%A2%B3%E7%90%86 | ||
|
||
1. **梳理飞桨目前执行器的流程** | ||
|
||
#### 0. 训练阶段参数初始化与 scope 构建 | ||
1. paddle.nn 中的函数会将参数初始化的 op 追加到 start program 中 | ||
2. 执行器执行 start program | ||
3. 在 NewIRInterpreter 阶段 build scope,把 op 用到的输入输出 var 都构造出来并放到 global scope 里 | ||
4. NewIRInterpreter 按序执行 op kernel。之后,初始化后的参数就在 global scope 里了 | ||
5. 执行器执行 main program,可以从 global scope 里拿到参数 | ||
6. ... | ||
|
||
#### 1. 执行器python前端 | ||
网络和参数都就绪之后,调用 Executor 的 run() 方法执行,这里以新执行器为例。新执行器会: | ||
1. 创建 StandaloneExecutor实例 | ||
2. feed data | ||
3. 调用 StandaloneExecutor::run | ||
#### 2. 执行器c++后端 | ||
StandaloneExecutor 的构造函数依次做了几件重要的事情: | ||
1. TranslateLegacyProgramToProgram,旧 IR 被翻译成新 IR | ||
2. 常规 pass,如常量折叠、算子融合、死代码消除等 | ||
3. PdOpLowerToKernelPass,新 IR 绑定到 kernel | ||
4. inplace pass | ||
5. 创建 InterpreterCore,将 impl 构造为 NewIRInterpreter **(直到这一步才用到 scope_,之前都没用到)** | ||
|
||
其中真正负责执行的是 NewIRInterpreter。 | ||
|
||
2. **新IR常量折叠问题分析** | ||
#### 1. 新 IR 常量折叠的主要改写逻辑 | ||
1. 根据 op 创建 temp_program | ||
2. PdOpLowerToKernelPass,根据 temp_program 构造 kernel_program | ||
3. 创建 InterpreterCore 并执行 | ||
4. 根据 fetch_list 取出 out_tensor | ||
5. 根据 out_tensor 构造 pir::Parameter | ||
6. 在 scope_ 中创建新 param_var,并把 out_tensor 赋值给 param_var | ||
7. 在原 program 中 SetParameter | ||
8. 插入 get_parameter_op 并替换子图 | ||
|
||
#### 2. 问题分析 | ||
可以看到,新IR常量折叠里主要存在两个问题: | ||
|
||
问题一:需要从原 program 中获取 Parameter,但我们在 TranslateLegacyProgramToProgram 时,只记录了 param_name,并没有创建 Parameter 对象(见上面流程梳理3.1)。目前我们仍然是把 param 以 var 的形式存储在 scope 里了。而在 pass 阶段,并没有传入 scope,也就没法获得原 program 的参数。 | ||
|
||
问题二:需要单独构造出 temp program,并构造 InterpreterCore。其实可以直接调用 op 的 kernel。 | ||
|
||
3. **梳理 codegen 流程** | ||
|
||
一个很自然的想法是,能不能通过 codegen 的方式为每个 op 生成 fold 方法?为此,我们梳理一下 op codegen 的大概流程 | ||
在 gen.py 的 OpGenerator 里: | ||
|
||
1. 根据 op_yaml_files 和 op_compat_yaml_file 解析生成 op_compat_item | ||
2. 构造 OpInfoParser(op, op_compat_item) | ||
3. 根据上面解析出的结果,格式化 OP_INFO_TEMPLATE,用于生成算子的 GetOpInfo() 方法。这东西很重要。**OpInfoTuple 把所有元信息和 op 打包在一起** | ||
4. 根据模板生成头文件 | ||
5. 根据模板 CC_FILE_TEMPLATE 生成源文件 | ||
|
||
理论上拿到 OpInfoTuple 就可以找到 kernel 并构建 InferMetaContext 和 KernelContext 了。只要把 KernelContext 传给 kernel 就能执行了。(需要先 BuildScope,为 kernel 的 output 在 scope 里申请出空间) | ||
所以我们可以看出,并不需要额外的 codegen 了。想运行指定的 op,只要拿到它的 OpInfoTuple,然后传入 scope 就可以。 | ||
|
||
4. **调研** | ||
调研 tvm、mlir、oneflow 中常量折叠的实现方案 | ||
|
||
|
||
|
||
### 下周工作 | ||
|
||
1. 搭建 新 ir 常量折叠的 demo 并跑动 | ||
|
||
### 导师点评 | ||
对飞桨框架新IR的执行流程学习比较细致,本周工作按照预期推进,继续保持! |
51 changes: 51 additions & 0 deletions
51
WeeklyReports/04_kevincheng2/[WeeklyReport]2023.10.10~2023.10.24.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
### 姓名 | ||
程延福 - [kevincheng2](https://github.com/kevincheng2) | ||
|
||
### 实习项目 | ||
[项目四:组合机制前反向架构统一](https://github.com/PaddlePaddle/community/blob/master/hackathon/hackathon_5th/【PaddlePaddle Hackathon 5th】飞桨护航计划集训营项目合集.md#项目四组合机制前反向架构统一) | ||
|
||
### 本周工作 | ||
|
||
1. **熟悉静态图场景组合机制case** | ||
* 理解了静态图下算子的组合机制代码调用方法 | ||
* 熟悉 paddle 单元测试规则 | ||
|
||
|
||
2. **完成新IR下Relu的反向迁移 [[Prim][PIR] Support for rule operator backward under new ir](https://github.com/PaddlePaddle/Paddle/pull/58210)** | ||
|
||
* 学习PR [[Prim][PIR] Support composite rules of Llama ops](https://github.com/PaddlePaddle/Paddle/pull/58018) 中的算子迁移方法 | ||
|
||
* 根据 [PR](https://github.com/PaddlePaddle/Paddle/pull/58018) 和 mentor 的指导,完成新IR下Relu的反向迁移,并提交 [Relu 反向迁移 PR](https://github.com/PaddlePaddle/Paddle/pull/58210) | ||
|
||
* 理解 call_vjp 调用规则 -- todo | ||
|
||
![48afe88f743f4ddfa095019702db95ba](C:\Users\dell\Documents\vsCode\Camp\WeeklyReports\04_kevincheng2\assets\48afe88f743f4ddfa095019702db95ba-1698204944186-2.png) | ||
|
||
3. **熟悉新IR下的前向拆解规则** | ||
|
||
* 学习PR [[Prim][PIR] Sink Forward Prim](https://github.com/PaddlePaddle/Paddle/pull/58130) 中算子拆解下沉实现,理解 call_decomp 调用规则 -- todo | ||
|
||
![image](https://user-images.githubusercontent.com/116002591/275771637-1c70c9ba-3fdf-4d41-9e63-ff6559cf9a21.png) | ||
|
||
* 参考PR中的mean算子,实现relu的前向拆解下沉 -- todo | ||
|
||
3. **问题疑惑与解答** | ||
|
||
|
||
* 基础算子和组合算子怎么界定?有什么区别? | ||
|
||
答:区分基础算子和组合算子需要考虑这么几个规则,原子性、可组合性、可优化性、高频率、算子库支持度。但是在实际应用实现的过程中,基础算子和组合算子的界定没有特别严格,设计时需要考虑算子实现的颗粒、算子的性能和算子功能性等具体的方面,针对不同的算子的不同特点去考虑。 | ||
|
||
* decomp_interface_gen_op_list.py 生成代码时,配置relu会同时生成 relu 和 relu_ 对应代码? | ||
|
||
答:一个小bug,relu 和 relu_ 特性有区别,需要分开考虑,relu_ 不需要拆分,已提交pr [[Prim]fix interface decomp](https://github.com/PaddlePaddle/Paddle/pull/58322) | ||
|
||
|
||
### 下周工作 | ||
|
||
1. 实现relu的前向拆解下沉 | ||
2. 结合源码,理解 call_decomp 、call_vjp 的调用规则 | ||
3. 其他算子的迁移和拆解工作 | ||
|
||
### 导师点评 | ||
请联系导师填写 |
Binary file added
BIN
+200 KB
...orts/04_kevincheng2/assets/48afe88f743f4ddfa095019702db95ba-1698204944186-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+200 KB
WeeklyReports/04_kevincheng2/assets/48afe88f743f4ddfa095019702db95ba.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
## 🚀 本目录用于 ranchongzhi 参与集训营项目时的周报记录 | ||
|
||
- 👨💻 学员: [ranchongzhi](https://github.com/ranchongzhi) | ||
- 👩🏻 导师: [shiyutang](https://github.com/shiyutang) |
40 changes: 40 additions & 0 deletions
40
WeeklyReports/18_ranchongzhi/[WeeklyReport]2023.10.10~2023.10.24.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
### 姓名 | ||
|
||
冉崇治 | ||
|
||
Github ID:[ranchongzhi](https://github.com/ranchongzhi) | ||
|
||
### 实习项目 | ||
|
||
[套件压缩能力建设](https://github.com/PaddlePaddle/community/blob/master/hackathon/hackathon_5th/%E3%80%90PaddlePaddle%20Hackathon%205th%E3%80%91%E9%A3%9E%E6%A1%A8%E6%8A%A4%E8%88%AA%E8%AE%A1%E5%88%92%E9%9B%86%E8%AE%AD%E8%90%A5%E9%A1%B9%E7%9B%AE%E5%90%88%E9%9B%86.md#%E9%A1%B9%E7%9B%AE%E5%8D%81%E5%85%AB%E5%A5%97%E4%BB%B6%E5%8E%8B%E7%BC%A9%E8%83%BD%E5%8A%9B%E5%BB%BA%E8%AE%BE) | ||
|
||
### 本周工作 | ||
|
||
1. **熟悉Paddle Inference以及PaddleSlim中的自动压缩功能** | ||
- 跑通了Paddle Inference的官方的Demo,日志记录在[如下链接](https://www.wolai.com/ranchongzhi/mmsbzC9VsQsHDwasNTNQz7) | ||
- 跑通了PaddleSeg中自动压缩的示例项目,日志记录在[如下链接](https://www.wolai.com/ranchongzhi/wyMm2rZbjXK79cokPNE4XF) | ||
2. **修复PaddleSeg中模型自动压缩推理遇到的问题** | ||
- ppliteseg-tiny模型自动压缩之后,CPU端int8推理精度下降,经过排查是在推理过程中量化了多余的`pool2d`算子,导致精度下降。问题已解决,PR地址:[[Fix]modify quantized ops during mkldnn int8 inference](https://github.com/PaddlePaddle/PaddleSeg/pull/3514) | ||
- 修复其他模型在量化推理过程中的bug,PR地址:[[Bug fixes]: Modify code and setting to run ACT correctly](https://github.com/PaddlePaddle/PaddleSeg/pull/3539/commits/1def3cad964c5605f7af36dbded5bf281e586a34): | ||
1. ADE20K类似数据集图片大小不一致导致dynamic shape info收集不准确,导致在IR优化过程中TensorRT一直重建子图,最终导致报错,最终通过寻找极端尺寸图像去收集dynamic shape info来解决该问题。 | ||
2. 调整ppmobileseg推理时的验证配置,和训练过程保持一致,利用ACT训练出精度指标更高的量化模型。 | ||
3. 基于aistudio的环境,将全部模型的指标重新测试并更新,并同时更新文档。 | ||
3. **问题疑惑与解答** | ||
- 问题a:[PaddleSlim文档](https://paddleslim.readthedocs.io/zh_CN/latest/deploy/deploy_cls_model_on_x86_cpu.html#id4)里边说,pool2d这种算子不会显著地改变scale,所以不需要在训练过程中进行量化,可以直接从相邻节点获取量化信息,所以在推理的时候可以直接量化它? | ||
|
||
答: | ||
1. pool2d在压缩时是不支持量化的,在CPU上支持量化是指推理支持量化。 | ||
2. 在压缩时不量化pool2d,推理时量化,那么pool的scale用的是其他已量化op的scale,比如 conv + pool,conv已经通过qat或ptq有scale了,那只需要将反量化过程挪到pool之后,那pool就是int8计算。但是conv之后往往接relu等激活,导致拿到的scale不准确,因此大多数情况下对pool2d的量化都是无效的~ | ||
3. 因此最佳实践是推理和量化训练保持量化op的一致,从而推理精度才会和训练精度对齐。 | ||
|
||
### 下周工作 | ||
|
||
1. 复现并尝试修复PaddleDetection中ACT相关模型的bug并尝试修复。 | ||
2. 整理Paddle Inference的笔记,用于后续的分享。 | ||
|
||
### 导师点评 | ||
|
||
1. 从分割套件入手,明确了对于模型套件中加入ACT压缩工具的流程,并且通过积累PaddleSlim和Paddle Inference相关的文档解除多个压缩推理中性能和精度相关的bug。 | ||
2. 期待后续积累的Paddle Inference 套件,并加入串讲和大家分享。 | ||
3. 在对Paddle Inference熟悉后,可以更好地打通压缩模型到推理模型报错的问题,实现现有套件重点模型的量化蒸馏压缩能力的全覆盖。 | ||
期待你的后续表现,加油~ |