一般情况下,深度神经网络的计算本质上是一对tensor的计算,例如常见的conv2d的计算本质上是一个7层的for循环,那么底层的硬件,例如内存大小,SM的数量,threads和blocks等都会对最终的for循环造成影响。
现存的深度学习框架(例如Tensorflow,PyTorch ,MXNet)会将DNN中的计算映射到其底层提供的向量计算内核库(例如cuDNN,MKL-DNN)来实现高性能。 但是,这些内核库存在以下几个问题:
因此,目前大家希望设计一套自动搜索的过程。
Ansor: Generating High-Performance Tensor Programs for Deep Learning by Lianmin Zheng et al., OSDI 2020
解决问题:现存的加速库cuDnn,MKL-DNN针对Tensor的优化是需要耗费大量的人力。
search-based compilation(例如TVM和FlexTensor的手写模板;Halide的auto-scheduler) ,共同的问题是搜索空空间小且受限。
解决方法:1.切割子图,针对每个子图生成搜索空间。提供各种优化策略(tile size,parallel等),然后进行枚举。
2.减小搜索空间:每次随机选一个集合,在一次使用cost model的fine tune过程中去除表现不好的集合同时加入新的集合。
3.将搜索的子图接起来。
Schedule Synthesis for Halide Pipelines on GPUs by Sioutas Savvas et al., TACO 2020
解决问题:目前写schedule的是两个:设计cost model和autotune framework.大多数的schedule是针对CPU,GPU优化的方式不多。
解决方法:加入了一些自己设计的原语:
active_SMs, active_threads,warp_size等
(拓展了模板,搜参数)
FlexTensor: An Automatic Schedule Exploration and Optimization Framework for Tensor Computation on Heterogeneous System by Size Zheng et al., ASPLOS 2020
解决问题:现存的加速库cuDnn,MKL-DNN针对Tensor的优化是需要耗费大量的人力。
解决方法:首先定了一个搜索策略(例如unroll-split),每一个状态是有一个状态函数,通过强化学习的方式,然后搜出最优的情况。
(搜模板和搜参数)
ProTuner: Tuning Programs with Monte Carlo Tree Search by Ameer Haj-Ali et al., arXiv 2020
解决问题:基于贪心算法的搜索算法beam-search algorithm(集束搜索),不一定搜出最优解,因为局部最优解不是全局最优解。这种搜索算法是在cost model找出的节点里面找局部最优的那个,然后往下一层走。。
解决方法:将所有的搜索可能性整理成Markov decision process (MDP),然后使用Monte Carlo Tree Search (蒙特卡罗树搜索)的四步。
1.选择(Selection):选择当前节点。
2.拓展(Expansion):找下一个拓展的节点
3.模拟(Simulation):计算cost model的结果
4.反向传播(Backpropagation):到达叶子节点之后,反向传播
Optimizing the Memory Hierarchy by Compositing Automatic Transformations on Computations and Data by Jie Zhao et al., MICRO 2020
解决问题:在循环优化时,fusion和tile之间相互交互,同时可能会产生多个kernel,最优解应该是尽可能融合kernel.因为launch kernel需要额外的代价。
解决方法:通过分析计算的数据依赖关系,利用多面体模型进行schedule的划分,将kernel(量化input,weight和进行卷积)尽可能的进行融合。同时针对融合后的kernel进行AST的分析,进行schedule的优化。
Chameleon: Adaptive Code Optimization for Expedited Deep Neural Network Compilation by Byung Hoon Ahn et al., ICLR 2020
解决问题:搜索schedule的空间有限并且搜索策略中的cost model非常耗时。
解决方法:提前定好了每层的模板,搜参数。根据预设的cost model先提前选出一些candidate,然后采样出候选集合放在实际的硬件上跑,得到实际的时间。整个过程是迭代的。Adaptive Exploration by leveraging Reinforcement Learning (RL)。
Learning to Optimize Halide with Tree Search and Random Programs by Andrew Adams et al., SIGGRAPH 2019
解决问题:当前的schedule的空间时有限的。
解决方法:首先使用tree来描述搜索空间,然后使用beam search减小无限的搜索空间。