从图论到图优化
清晨,伴随着第一缕阳光一起来临的,是智能音箱叫醒沉睡的你、替你打开窗帘、播报天气、放你最爱的音乐;上班路上,智能驾驶系统为你规划去公司最快的路线,实时检测路况信息护你一路周全;到了公司,人脸识别、指纹识别实现智慧打卡,方便快捷地同时也让工作环境更加安全;休闲时刻,随手拍下的街景通过AI修图,秒变时尚大片;叫不出名字的美食用手机一扫,瞬间替你打开记忆…人工智能应用无处不在。
要实现人工智能应用,比如要想让机器能智能识别物体,就需要搭建一个像人类大脑一样的"神经网络"。人脑是一个复杂系统,其复杂性不仅表现在它是由上百亿神经元组成,更重要的是神经元间存在着异常复杂的联系,这些联系在方向上以多重前馈和反馈,在分布上以会聚和发散等多种形式,形成一个极其复杂的网络结构。
而图计算则是人工智能的一个使能技术。我们可以大致将人工智能的基本能力分成三个部分,第一部分是理解的能力,第二部分是推理的能力,第三部分就是学习的能力,简称URL(Understanding,Reasoning,Learning)。
要对整个现实世界有一个客观、完整、全面的认识,那就需要一个理解的能力。而图计算技术能够把任何事物之间的所有关系全部刻画出来,完整地描述出来。
同时,在一些事物和事物之间,其关系并不是那么显性,需要通过一些推理才能够推导出来,图计算就能够通过推理的方式在事物中找到隐藏的一些关系。
图计算能够对事物进行抽象,这个抽象的过程就是人脑综合能力的一个重要体现。图计算为人工智能提供的学习的能力,它能够将理解刻画能力和推理能力相结合,实现对任何一个事物的一个模式上的总结、演绎和描述。
那么这个能够抽象人脑综合能力的图到底是什么样子的呢?
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V, E)。其中G表示一个图,V是图G中顶点的集合Vertices,E是图G中边的集合Edges。根据E是否有方向,图可以分为有向图和无向图。
Computational Graph实际上是一种描述计算过程的“语言”,把复合函数表达成节点互相连接的网络,其中每个节点代表一个操作或者函数。这种语言中用node表示variable,用edge表示operation,用来描述运算的有向无环图。计算图有两个主要元素:结点(Node)和边(Edge),结点表示数据,如向量,矩阵,张量。边表示运算,如加、减、乘、除、卷积等。
我们把x+w求和的过程用节点a表示,w+1求和的过程用节点b表示,a*b求积的过程用节点y表示,那么整个计算过程就能用一个计算图表达出来:
计算图有正向建立的过程,同样也需要经过不断的调整让整个计算图更加准确,就像人类神经系统的完善必然要通过试错不断变的健壮一样。在计算图中,这个不断调整的过程就是梯度求导的过程:
一个神经网络就可以看做一个巨多层嵌套的复合函数。比如,前向神经网络的每一层可以看做一个简单函数,其输入为权重 W 和上一层的输出。这就意味着我们可以为每一个神经网络建立一个计算图并通过 BP 算法计算梯度;
绝大多数神经网络计算平台实现了计算图,其中节点代表各种函数,比如linear、relu、cost 等等,有向边代表数据的流向。在这些计算平台上,我们可以构建计算图实现任何的神经网络结构;
在Mindspore/Tensorflow/Pytorch等机器学习框架下,都采用图计算技术来完成复杂的神经网络计算,当然也只有图计算技术才能匹配数据量呈现指数级爆发式增长的网络模型。
丰富多变的计算场景背后是日渐复杂的计算图。为解决这些复杂计算图在实际应用中的性能问题,往往在深度学习框架/编译器中,通过各种优化手段,将数据流图从一种形式“等价”转换为另一种行式, 提高该数据流图在硬件上的运行性能,我们将其称为图优化。
目前主流的框架Tensorflow、Pytorch、TVM等都是同时采用多种计算图优化手段进行加速计算,常见的包括:常量折叠、公共子表达式消除、计算图替代等。
作为华为专门面向AI场景的异构计算架构,CANN(Compute Architecture for Neural Networks)作为连接上层深度学习框架和底层AI处理器的桥梁,从编译器层面,通过图融合和Unified Buffer融合技术,深度编排计算图,从而达到图计算效率的进一步提升。
一、图融合:
图融合是把多个独立的算子融合成一个,简单来说,就是“把原本n个函数调用合并到一个函数里面”,省掉了中间数据的store过程;可有效减少计算节点,大幅减少计算时间。
二、Unified Buffer融合:
深度学习算法中参与计算的数据和模型参数很多,数据量庞大,导致内存带宽成为了整个系统的一个瓶颈,针对神经网络计算大数据吞吐,memory bound问题,通过减少数据搬运次数、提升昇腾AI处理器内缓存利用率,提升计算效率。
Unified Buffer是昇腾AI处理器上的统一缓冲区,UB融合是对图上算子进行硬件UB相关的融合。
UB融合在提升缓存利用率方面是这么做的:(做动画解释融合效果):
我们对Buffer融合前后做一比对:
融合前,算子1在昇腾AI处理器上计算完后,将数据从昇腾AI处理器内的缓存buffer搬运到外部存储,算子2从外部存储获取数据作为输入,搬入缓存buffer进行计算。
融合后,算子1计算完成后,数据保留在缓存buffer,算子2从缓存buffer直接获取数据进行算子2的计算,有效减少数据搬运次数,提升了计算性能。
在这个基础上,能不能通过异构计算架构CANN进一步提高图计算效率呢?答案是当前可以!(做动图解释在数据并行过程)
Unified Buffer融合,如果将数据分为多份,计算单元1计算完一份数据存到缓存Buffer后,计算单元2即可获取数据进行这一步的计算,同时呢,计算单元1可立即进行下一份数据的计算,使得计算单元1和计算单元2达成一定程度的并行计算,从而达到进一步的效率提升。
经过几个版本的快速演进,异构计算架构CANN识别了越来越多的融合场景,通过多算子自动融合减少计算节点数,有效减少内存拷贝;并且通过灵活可定制的融合规则让计算图中的算子得以最大程度融合,为开发者赢得了更多计算性能收益。
了解更多信息,欢迎大家登陆昇腾社区、关注昇腾CANN微信公众号,了解异构计算架构CANN的更多信息。
- 点赞
- 收藏
- 关注作者
评论(0)