【ASPLOS 2022】机器学习访存密集计算编译优化框架AStitch,大幅提升任务执行效率

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 近日,关于机器学习访存密集计算编译优化框架的论文《AStitch: Enabling A New Multi-Dimensional Optimization Space for Memory-Intensive ML Training and Inference on Modern SIMT Architectures》被系统领域顶会ASPLOS 2022接收。

作者:郑祯  


近日,关于机器学习访存密集计算编译优化框架的论文《AStitch: Enabling A New Multi-Dimensional Optimization Space for Memory-Intensive ML Training and Inference on Modern SIMT Architectures》被系统领域顶会ASPLOS 2022接收。


AStitch通过编译优化的手段来自动化地提高机器学习任务的执行效率, 提出了一种大粒度计算融合的编译优化手段,通过计算图的依赖关系特性、GPU多层次存储架构上的数据局部性、以及不同数据尺寸之下的线程并发性等三个方面的联合考虑,自动化地为大粒度的复杂访存密集算子子图生成高效的GPU代码,从而大幅减少GPU kernel调用及框架层算子调度的额外开销,避免了不必要的重复计算。大幅减少片外访存的同时,可适配各种数据尺寸以得到最佳并行效率。对比XLA[1],AStitch最高可以取得2.73倍的性能加速。


背景

近年来,深度学习编译优化已经成为深度学习系统领域最活跃的方向之一。“编译“方法将机器学习DSL(TensorFlow、PyTorch等)自动化地翻译为底层硬件支持的程序,“优化”方法则在翻译(编译)过程中执行一系列的性能优化方案,使得最终生成的程序能够跑得更快更好。


深度学习编译器在生成最终可执行程序之前,往往需要将上层的DSL先翻译为中间层的IR,以方便编译器进行处理。比如,上层的一个LayerNorm算子,会被翻译为中间层的一个子图,该子图包含十多个算子,包括Add、Sub、Mul、Div、Reduce、Broadcast等类型。在一个好的IR定义中,这些“原子”性质的算子可以组合表达任意用户定义的上层计算。


随着算法、硬件以及深度学习系统生态的发展,深度学习系统的瓶颈在不断变化。我们发现新出现的模型的性能瓶颈更多地表现在访存密集型算子上(Element-wise、Reduce等计算)。


一方面,新模型中访存密集型算子的比重越来越多。较早的MLP和CNN以计算密集型算子为主(卷积和矩阵乘),而随着模型结构的发展(比如Transformer开始进入各个领域),LayerNorm、Softmax、GELU以及各种算法工程师自定义的部件使得访存密集型算子在算子数量和执行时间上都开始超过计算密集型算子。另一方面,新硬件的算力提升速度高于访存带宽提升速度,尤其是TensorCore这种“加速器上的加速器”的出现,让算力有了急剧的提升。算力的提升让计算密集型算子的计算时间进一步缩短,使得访存密集型计算的性能问题更加突出。


XLA是最早对访存密集型计算有所关注的SOTA之一(TVM[2]对访存密集型计算的优化方法与其类似),也是工业上最成熟的机器学习编译器之一。在GPU上对XLA进行性能评测时,我们发现其优化后的很多模型(Transformer、ASR等)仍然卡在访存密集型计算的性能上。一方面,访存密集型计算的总耗时与计算密集型算子相当;另一方面,也是更为重要的,巨大量的访存密集型算子带来了非常严重的算子调度和GPU kernel调用开销,这些开销在很多模型上已经超过了计算耗时本身。


XLA所使用的优化方法是kernel fusion,进一步分析XLA的fusion优化方法,我们惊讶地发现,XLA竟然没有利用shared memory来支持算子之间的数据传输,这使得可支持的fusion粒度大大降低。比如对于reduce和它的消费者算子,一个HPC工作者会自然地将reduce的结果放在shared memory上,然后消费者算子从shared memory中读数据并做后续计算;XLA却选择不将reduce和它的消费者fuse在一起,而是分成两个kernel。对于常见的LayerNorm算子,XLA会用3个kernel来实现,而高效的手写算子则只需要一个kernel。


基于上述发现,如果我们将shared memory引入机器学习编译优化的fusion中,增大fusion粒度,可以减少框架调度和kernel调用开销,并减少片外存储的访问,进一步优化访存密集型计算的性能。但是,XLA(包括TVM)为什么没这么做呢?进一步分析后,我们发现最大的挑战在于,编译器需要自动化地执行优化,手工优化的想法,到了编译器这里,难度往往会被放大。


挑战

到了编译器IR层面,机器学习模型的计算图会变得非常复杂,涉及两层的数据依赖关系:Element层面和Operator层面。


Element层面是指消费者处理的每个element和生产者生产的每个element之间的依赖关系,比如Broadcast算子会生成一对多的数据依赖关系。

1.png

Operator层面是指图层面的算子依赖关系,下图展示了一个访存密集型计算子图的拓扑关系(来自一个Transformer模型),可以看到复杂的多对一、一对多依赖关系。

2.png

如今的模型类型极为丰富,变种繁多,计算拓扑图无法枚举,不同于HPC领域的手工kernel fusion,让编译器自动化地对任意可能的计算子图做fusion优化是非常具有挑战性。这也是XLA和TVM目前只做保守fusion优化的一个重要原因。


除了复杂的计算图之外,输入数据形状的多样性和未知性,也给自动代码生成带来了很大的挑战。不同的tensor形状需要不同的代码生成schedule,以得到较好的并行性。XLA针对常规的tensor形状提供了代码生成的schedule,但tensor形状的可能性是无穷无尽的,我们在真实生产中发现,一些特殊的形状会导致XLA产生极大的性能问题。(注:这里讨论的是静态shape的多样性,而非动态shape问题。)


破局

困难和挑战总是让对技术有极致追求的人兴奋。


Fusion问题,核心是代码生成能力问题,能力越大,fusion越好。从两个层面的依赖关系出发,代码生成需要同时考虑硬件存储层次和并行度:算子之间传递数据需要选择合适的存储媒介,每个算子需要选择合适的并行策略,这两者是相互交杂的,需要协同考虑。我们将我们提出的Fusion技术称为stitch,这样可以更直观地表达算子通过层次化的存储媒介“缝合”在一起这一动作。


从存储媒介出发,结合并行度的考虑,我们将stitch策略抽象为四种:无依赖(Independent)、本地的(Local)、区域的(Regional)和全局的(Global)。


XLA所支持的是Local的策略,只支持通过寄存器传递数据,算子的并行策略被分开来考虑。一些Fusion工作可以支持Independent依赖,主要包括Kernel Packing等。AStitch拓展了fusion的优化空间,Regional策略将数据存储在shared memory中,支持GPU thread block locality,Global策略将数据存储在global memory中,支持全局的locality。其中,并行度的考虑在于,上述每种stitch策略都需要特定locality的支持,locality越是局部,对并行策略的可能限制越大。从Local,到Regional,再到Global,locality的限制逐渐降低,对并行策略的限制也随之逐渐取消。需要说明的是,Global的策略需要GPU kernel所有线程的全局同步,其相当于将kernel之间的隐式的同步inline到kernel内部来进行,减少一次CPU(包括框架和驱动)和GPU之间的切换。

3.png

对于并行度,为访存密集型计算做shape-aware的并行代码生成(Adaptive Thread Mapping)是AStitch的一个重要贡献。其基本思想是,基于SIMT的架构,合并小的(Task Packing),拆分大的(Task Splitting),以得到合适的CUDA thread block大小和数量。


值得说明的是,对于Global的策略,为了实现全局同步,需要保证总的CUDA thread block数量不大于一个wave可以调度的最大数量,AStitch通过做纵向的Task Packing来达到这一要求,这相当于将原本由硬件调度器调度的任务转变为软件上预先调度好的任务,实际上还有机会节省调度开销。

4.png

对于自动代码生成,穷举每个算子的stitching策略和并行策略是不现实的,我们提出了一种先分组解决局部代码生成,再聚合生成全局代码的方法。一个重要的insight是,轻量级的element-wise的计算只需要跟随其consumer的代码生成schedule即可,最终通过Local策略进行数据传输;而reduce等复杂计算则需要优先考虑并行度的优化,再去考虑与其consumer的stitch策略。


基于此,我们依据算子类型进行分组,reduce及跟有broadcast的expensive element-wise(Power, Sqrt等)作为每一个组的dominant,每个dominant的直接的或间接的producer被分到其对应的组中。组内的数据传播都是通过Local策略进行,dominant生成自己的并行策略schedule后,传播给组内的其他算子;最后检查组间的数据局部性,为两个组边缘的算子选择可达到的locality最优的stitch策略。这种方法简洁有效地解决了搜索空间爆炸的问题,在此过程中,我们还有一些locality和parallelism之间的权衡,其中更多的细节请阅读我们ASPLOS 2022的论文。

5.png

结语

AStitch的雏形是我们早期的工作FusionStitching[4],FusionStitching最早将shared memory引入了访存密集算子的编译优化自动fusion,并采用cost model来做fusion和代码生成的一系列决策。随着深入优化,我们发现可以将kernel之间的隐式同步给inline到kernel内部,并通过global memory做stitch,避免CPU和GPU之间的无谓的切换,进一步的,结合Adaptive Thread Mapping方法解决并行策略问题,可以形成强大的代码生成能力。至此,我们已经不需要cost model来指导fusion决策和代码生成,我们可以stitch一切,我们的代码生成也具有自适应能力。


最近,我们惊喜地发现新版本的TensorRT[3]开始支持使用shared memory做数据媒介来生成fusion了。我们期待越来越多的工作开始在访存密集型计算的性能优化方面发力,我们也希望AStitch以及早期的FusionStitching的工作可以影响到广泛的深度学习系统和编译优化参与者!


论文地址:https://dl.acm.org/doi/10.1145/3503222.3507723


参考文献:

[1] TensorFlow XLA. https://www.tensorflow.org/xla

[2] Tianqi Chen, Thierry Moreau, Ziheng Jiang, Lianmin Zheng, Eddie Yan, Haichen Shen, Meghan Cowan, Leyuan Wang, Yuwei Hu, Luis Ceze, et al. TVM: An automated end-to-end optimizing compiler for deep learning. OSDI'18.

[3] TensorRT. https://developer.nvidia.com/tensorrt

[4] Zhen Zheng, Pengzhan Zhao, Guoping Long, Feiwen Zhu, Kai Zhu, Wenyi Zhao, Lansong Diao, Jun Yang, and Wei Lin. FusionStitching: boosting memory intensive computations for deep learning workloads. arXiv preprint.

相关实践学习
使用PAI+LLaMA Factory微调Qwen2-VL模型,搭建文旅领域知识问答机器人
使用PAI和LLaMA Factory框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
5月前
|
数据采集 自动驾驶 Java
PAI-TurboX:面向自动驾驶的训练推理加速框架
PAI-TurboX 为自动驾驶场景中的复杂数据预处理、离线大规模模型训练和实时智能驾驶推理,提供了全方位的加速解决方案。PAI-Notebook Gallery 提供PAI-TurboX 一键启动的 Notebook 最佳实践
|
机器学习/深度学习 人工智能 算法
Post-Training on PAI (3):PAI-ChatLearn,PAI 自研高性能强化学习框架
人工智能平台 PAI 推出了高性能一体化强化学习框架 PAI-Chatlearn,从框架层面解决强化学习在计算性能和易用性方面的挑战。
|
5月前
|
机器学习/深度学习 人工智能 分布式计算
Post-Training on PAI (1):一文览尽开源强化学习框架在PAI平台的应用
Post-Training(即模型后训练)作为大模型落地的重要一环,能显著优化模型性能,适配特定领域需求。相比于 Pre-Training(即模型预训练),Post-Training 阶段对计算资源和数据资源需求更小,更易迭代,因此备受推崇。近期,我们将体系化地分享基于阿里云人工智能平台 PAI 在强化学习、模型蒸馏、数据预处理、SFT等方向的技术实践,旨在清晰地展现 PAI 在 Post-Training 各个环节的产品能力和使用方法,欢迎大家随时交流探讨。
|
6月前
|
机器学习/深度学习 人工智能 算法
PaperCoder:一种利用大型语言模型自动生成机器学习论文代码的框架
PaperCoder是一种基于多智能体LLM框架的工具,可自动将机器学习研究论文转化为代码库。它通过规划、分析和生成三个阶段,系统性地实现从论文到代码的转化,解决当前研究中代码缺失导致的可复现性问题。实验表明,PaperCoder在自动生成高质量代码方面显著优于基线方法,并获得专家高度认可。这一工具降低了验证研究成果的门槛,推动科研透明与高效。
529 19
PaperCoder:一种利用大型语言模型自动生成机器学习论文代码的框架
|
6月前
|
PyTorch 调度 算法框架/工具
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
DLC任务Pytorch launch_agent Socket Timeout问题源码分析与解决方案
348 18
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
|
7月前
|
机器学习/深度学习 算法 数据挖掘
PyTabKit:比sklearn更强大的表格数据机器学习框架
PyTabKit是一个专为表格数据设计的新兴机器学习框架,集成了RealMLP等先进深度学习技术与优化的GBDT超参数配置。相比传统Scikit-Learn,PyTabKit通过元级调优的默认参数设置,在无需复杂超参调整的情况下,显著提升中大型数据集的性能表现。其简化API设计、高效训练速度和多模型集成能力,使其成为企业决策与竞赛建模的理想工具。
254 12
PyTabKit:比sklearn更强大的表格数据机器学习框架
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
阿里云人工智能平台 PAI 开源 EasyDistill 框架助力大语言模型轻松瘦身
本文介绍了阿里云人工智能平台 PAI 推出的开源工具包 EasyDistill。随着大语言模型的复杂性和规模增长,它们面临计算需求和训练成本的障碍。知识蒸馏旨在不显著降低性能的前提下,将大模型转化为更小、更高效的版本以降低训练和推理成本。EasyDistill 框架简化了知识蒸馏过程,其具备多种功能模块,包括数据合成、基础和进阶蒸馏训练。通过数据合成,丰富训练集的多样性;基础和进阶蒸馏训练则涵盖黑盒和白盒知识转移策略、强化学习及偏好优化,从而提升小模型的性能。
|
8月前
|
人工智能 自然语言处理 算法
MT-MegatronLM:国产训练框架逆袭!三合一并行+FP8黑科技,大模型训练效率暴涨200%
MT-MegatronLM 是摩尔线程推出的面向全功能 GPU 的开源混合并行训练框架,支持多种模型架构和高效混合并行训练,显著提升 GPU 集群的算力利用率。
625 18
|
8月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
513 3
|
10月前
|
机器学习/深度学习 人工智能
Diff-Instruct:指导任意生成模型训练的通用框架,无需额外训练数据即可提升生成质量
Diff-Instruct 是一种从预训练扩散模型中迁移知识的通用框架,通过最小化积分Kullback-Leibler散度,指导其他生成模型的训练,提升生成性能。
289 11
Diff-Instruct:指导任意生成模型训练的通用框架,无需额外训练数据即可提升生成质量

热门文章

最新文章

相关产品

  • 人工智能平台 PAI