ppcg 学习
学习一个ppcg的整体流程与细节.
之前写过一篇带宽受限下的DSA后端优化, 不过主要是针对已经构建好Compute Schedule之后的优化, 今天准备展开讲讲. 从单层卷积到优化计算,再到Layer Fusion,以及后续各种优化,下面将通过一系列的例子来介绍:
Egg是一个基于EGraph
的程序优化框架,
作者在其中实现基于Equality
Saturation概念的优化方法,
简单来说就是通过将所有的表达式保存在EGraph
这个数据结构中,可以按任意顺序实施RBO
(基于规则的优化),
因为其中同时存储了所有可能的表达式,
所以没有传统优化中phase ordering
的问题,
最终可通过CostModel
提取出最优的图结构.
Egg
在编译优化方面已经有许多应用了, 比如王润基大佬写的SQL 优化器,
其中也详细解释了Egg
的使用, 不了解的朋友可以参考一下.
在端侧AI编译中,每个阶段都需要大量的优化与trade-off
,
比如中端的计算图优化与后端的算子Fusion
以及后端算子的量化类型(平衡精度/速度),
如果基于传统优化方式,
可能许多模型最优的Pass
顺序,算子Fusion
方案都需要编译器工程师手动调试与指定.
这主要就是因为传统优化方式一旦lower
之后就丢失了之前的信息,
失去了最优的可能性,
因此考虑采用Equality Saturation
技术来将中端优化/后端Fusion/Tiling
/算子精度选择都放入其中进行整体性优化,希望可以得到尽量优化的编译结果.
目前对于许多端侧NPU
来说,是由一个可编程操作但容量较小的SRAM
进行数据调度,需要尽可能的减少数据搬运,
从而避免DSA
中的计算单元处于空闲状态[^1]。
因此我们要解决的问题是: 1.
如何充分利用Local Memory
并在其中计算尽可能多的kernel
?
2.
如何调度Local Memory
中的内存/指令从而充分利用计算单元?
本文主要分享关于Fused Layer
内部的Buffer Schedule
与Instruction Schedule
的一些经验体会.
这篇文章是赵捷老师在mircro 2020上发表的论文,我觉得这篇文章对理解akg系列的工作比较重要,所以仔细阅读了一遍.