Rammer: Enabling Holistic Deep Learning Compiler Optimizations with rTasks
传统深度学习框架在实现全面神经网络优化上的核心障碍在于:首先,现有的基于数据流图的抽象无法表示算子内部的并行性,对于由深度学习框架控制的图调度器完全是黑盒;其次,硬件厂商往往将细粒度的任务调度隐藏在硬件中,对上层框架调度也是黑盒。
针对现有深度学习框架的局限,微软亚洲研究院和北京大学、上海科技大学合作提出了一种可以成倍甚至几十倍地提升深度学习计算速度的编译框架RAMMER。这篇文章发表于OSDI 2020。
动机与挑战
然而,通常情况下,GPU设备的利用率会很低,调度op的开销也会很大。另外,这种两层的架构忽视了inter和intra op并行之间微妙的相互作用。比如两个可以同时计算的op可能尽可能地占用更多的EU资源,但是每个EU的利用率并不高。这会导致其中一个op等待另一个op执行完,才能获得足够的资源。
因此,Rammer把inter-op和intra-op共同进行调度。有几点挑战:
挑战1:op的intra-op并行是由硬件进行调度的,并没有给软件暴露出细粒度的intra-op并行计算方式
解决方法:定义了rTask作为在EU上计算的最小单元,并把细粒度的intra-op parallelism暴露出来
挑战2:GPU等加速器没有暴露intra-op调度的接口
解决方法:Rammer把硬件加速器抽象成虚拟的并行设备,把rTask调度到vEU上,每一个vEU再对应一个真实的加速器上的EU。
挑战3:细粒度的调度引入跟多的调度overhead
解决方法:多数DNN的计算图是“可预测的”,且op的performance是deterministic的。因此可以在编译阶段就生成执行方案
Wavefront scheduling policy
实验评估
Rammer可以提高GPU的利用率,但是在某些情况下,讲两层的op并行调度架构改为1层的效果并不明显。