-
Notifications
You must be signed in to change notification settings - Fork 5.7k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
【开源任务】CINN编译器后端Pass注释添加 #70113
Labels
status/close
已关闭
Comments
Closed
【报名】:11 |
【报名】:6 |
【报名】:3 |
【报名】:5、9 |
【报名】:8 |
【报名】:1 |
【报名】:7 |
【报名】:9 |
【报名】:10 |
【报名】:12 |
【报名】:13 |
【报名】:2、4、11、12 |
【报名】:6 |
【报名】:5 |
【报名】:6、8 |
【报名】:4 |
【报名】:1 |
【开源任务】CINN编译器后端Pass注释添加 已基本完成,感谢参与的小伙伴们!
|
# for free
to join this conversation on GitHub.
Already have an account?
# to comment
一、任务背景与列表
此任务为【开源任务】CINN编译器后端Pass改造 的前置任务
深度学习编译器是一种专门为深度学习模型优化和部署而设计的工具,其功能是将高层次的深度学习模型转换为低层次的、高效的、底层硬件可执行的代码。飞桨3.0推出了与框架一体化的CINN编译器,能同时支持训练和推理过程,并且具备处理动态可变形状输入的能力。目前,CINN的编译器主要被分为两个阶段:前端与后端。前端主要在PIR层面做一些图层的优化,经过lowering之后上层表示会转化为更贴近硬件实现的后端AST IR表示,后端会在AST IR的基础上进行一系列的分析与变换,最终产生更高效的硬件实现。对IR的分析与变换在编译器中被抽象为了Pass。CINN的后端Pass之前缺乏注释,近期,为了升级Pass以及更多地和开源社区交互,后端的已有的Pass需要添加注释并进行升级,本任务为升级改造的前置任务,即理解Pass所做的变换并添加注释。
⭐️ 提交PR 模版 ⭐️:
本期需要添加注释的pass如下,整体进展:
@LittleHeroZZZX
optim/trans_buffer_with_dynamic_shape.cc@jiachengdai
@Albresky
@LittleHeroZZZX
@fxy1699
optim/rearrange_load_instruction.cc@fxy1699
@LittleHeroZZZX
@fxy1699
@fxy1699
看板信息
统计信息
二、任务详情
2.1 CINN编译器介绍
CINN的架构如下图所示,分为前端后端和执行器,其中前端的主要功能是基于 PIR 进行图层级别的优化,并对子图进行划分为后端高性能 Kernel 代码生成提供支持;后端主要负责将前端处理后的 IR 转换为目标硬件可执行的代码或硬件描述,主要功能包括基于硬件特性的 IR 优化、高效内存管理和代码生成等;最后再由执行器的运行调度接口对编译器生成的 Kernel 进行封装。

这里出现了两类IR,PIR和后端的AST IR,它们都起到了计算和数据进行表示表达的作用,上述的编译期的整个工作过程其实也可以说是对IR的分析变换,我们抽象为前后端Pass以及后端特有的编排调优Schedule
比如很简单的一个子图:
转换成PIR就变成了如下Tensor级别的高层次表示,不体现底层的计算逻辑:
经过CINN的前端变换会得到一组组的可以融合起来的FusionOp,这里例子里只有一组subtract+multiply的FusionOp:
后端会对这个FusionOp进行代码生成,然后编译成Jit Kernel以供执行器调用,这里的第一步就是需要将前端IR lowering转换成后端AST IR。AST IR更直观地表达出一个子图到底是怎么算的:
可以看出,两个shape为[64, 128]的tensor的相减后乘是通过两层串行的for循环实现的,循环体进行tensor特定元素的减法和乘法。除了for和加减乘除这样的常见语法,这里还出现了ScheduleBlock这个概念。这其实是为了后续的Schedule编排优化而对语句做的封装,经过Schedule之后这段代码能更贴近硬件实现比如使用32个block,每个block256个线程来完成上述的计算:
2.2 Pass注释规范
2.2.1 注释包含内容
2.2.2 注释格式
三、可参考PR
#69611 paddle/cinn/optim/if_fusion_pass.h
#70092 paddle/cinn/ir/group_schedule/tactic/tile_broadcast_tactic.cc
#70258 paddle/cinn/optim/rearrange_load_instruction.h
The text was updated successfully, but these errors were encountered: