机器学习编译
目的:
总的来说,MLC的目的是实现日渐丰富的前端特性(pytorch/tensorflow)和丰富的后端(GPU/NPU/TPU等硬件设备)之间的自动转换,减少人工适配工作,将整个过程尽可能交给系统完成,这也和传统编译器有相似的作用。
核心:
在MLC中贯穿始终的两个概念是:
- 抽象表现形式:将前端表示转为中间表示形式(如计算图、IR),便于进行分析和优化;
- 转换:各种表现形式之间的转换,能够有机涵盖各种可能的情况,同时尽可能模块化,解耦各模块,转换是为了进一步优化或映射到底层硬件实现;
整个MLC的过程其实就是构造抽象表现形式,然后在不同层级的表现形式上进行优化,转换到下一层级表现形式进行进一步的优化,直到最终映射到底层硬件提供的API。
MLC的基本流程:
前端代码—》计算图—》计算图优化(例如融合、调度等)—》IR优化—》映射到库函数调用或代码生成
在底层IR到实际可执行文件之间有两种情况:一种是直接将某个IR映射到对应的实现,另一种是自动代码生成,即自动生成对应的实现。
未来可能的研究方向:
- 跨层级优化:如上层能够和底层硬件优化联动,统一调度优化
- 不同加速器的自动化解决方案:实现一种自动变换以用上各种硬件的特有加速属性(如tensor core等)
MLC的相关概念:
1. Pure function(纯函数)和side effect:
Pure function:指对输入只读而不写的函数实现,这种函数可以进行水平合并,因为彼此没有依赖关系。
Side effect:指函数会对输入进行修改,不仅读还会写,这样会导致水平节点之间不一