第三张 most bowl 特性与应用的实验中,分为三个实验,第一个是动态图实验,第二个是匀测推理推理部署实验。第三个是 jimen small live 的猫狗分类实验。首先我们来看第一个实验,动态图实验。 在本实验中,我们主要有三个任务,第一个任务是在动态图模式下执行单算子,第二个任务是在动态图模式下执行普通函数。第三个任务是在动态图模式下调试网络训练模型。 其中本实验的目的与我们刚才的三个任务也是相对应的,在这里我们就不再坠述了。在整个实验之前,我们来对静态图以及动态图模式来做一个简单的回顾。 monspo 同时支持两种运算模式, 分别是拍 native 模式以及 gruff 模式。拍 native 模式呢,也称为动态图模式,他将申请网络中的各个算子逐一下发执行,方便用户编写和调试申请网络模型。 而图模式,他是将神经网络模型先编译成一整张图,然后下发执行。该模式呢,是利用了一些图优化等技术来提高运行的性能, 同时有助于模型部署以及跨平台运行。在默认的情况下,我们的马思波一般是处于动态图的模式。 当然,我们也可以通过这样的一条语句来切换动态图以及静态图的模式。在动态图模式下,支持知行、单顺子、普通函数以及网络以及单独求梯度的操作。 同时我们需要注意的是,在 pinatural 模式下,为了提升性能,算子在 device 上使用了一步执行方式。因此在算子执行错误的时候,错误信息可能会在程序执行到最后才可以显示,需要注意的第二点是在 pinatural 模式下不支持 summary 功能, 图模式下萨摩瑞相关算子是不能使用的。接下来我们来看执行单算子的实验任务。首先我们来看相关的代码, 在我们相关代码做了一些解析以后,在最后我们会在云端的实验环境上来给大家直观的看一下实验的结果。首先我们来看代码,这里首先是导入相关的一些包, 然后紧接着是切换为拍 native 的模式。首先在这里实力画一个二位卷机的算子,并 他的参数分别是三四三以及偏置初始花为零。其中三四三的意义代表的是输入通道数,输出通道数以及卷机盒的大小。 接下来是定义输入数据,输入数据是以张量的形式,并且输入数据的值为一,全部为一,然后他的 ship 的大小是一三五五,其中一三五五的意义代表的是一张图三,通道大小是五乘以五, 然后这里的数据类型是 flot 三十二,将二维卷机算子应用到输入数据上,就得到了输出数据,最后将输出数据打印出来,那么这里呢,就是我们最后打印出来的数据的结果。下面我们来看第二个实验执行普通函数, 将若干个算子组合成一个函数,然后直接通过函数调用的方式来执行这些算子,并且可以打印相关的结果。 比如在我们所看到的这段代码当中,定义了 and 函数,其中它的参数分别为 x 与 y, 里边使用了 and 算子, and 算子分别是让 x 与 y 性相加得到了 z, 然后使用 z 与 x 进行相加,得到了一个新的 z, 最后把我们的这个 z 的值去返回。在定义好爱的方式函数以后,我们定义了张亮, x 与 y, x 与 y, 张亮都是三乘以三的值为一的张亮, 并且数据类型是 flot 三十二。然后我们的输出就是调用我们前边的 and function 函数,让 x 与外进行相加,最后得到了 shape 等于三乘以三的数据,并且每一个数据的值都是三。我们知道在动态图模式下深度学习框架,它的调试非常灵活,但是它的性能其实欠佳。 为了提高 pie native 模式下的向前计算任务执行速度, months ball 提供了 staging 功能,这个功能可以在 pie native 模式下将 pass 函数或者是 pass 类的方法变异成一个计算图,通过图优化等技术来提高运行速度。它是一种混合运行机制。 staging 功能的使用可以通过 ms gun function 这样的一个装饰器来达到这样的效果。这个装饰器他可以将模块变异成计算图,在给定输入之后 以图的形式下发执行。接下来我们来举一个例子,首先是导入 ms function, 这里仍然设定为 pennative 模式,接着实力化 and 算子, 这里调用通过 and msc function 使用装饰器来调用 seging 功能。接下来是定义了 and function 这样的一个函数, 其中参数是 x 与外,然后里边呢,实线是使用 x 与外进行相加,最后返回他们的相加的结果。 在定义好 a 的方式函数以后,我们定义了张量 x, y, 其中 x 与 y 都是四乘以四值为一的张量,他们的数据类型是 flow to 三十二。最后定义变量 z 等 与 x 与外相加,调用 a 的方式函数,并且把 z 的值去输出出来,这个时候大家可以在心里计算一下,最后我们的输出结果应该是多少呢? 其实这个结果相对来说是比较容易的,因为 x 与 y 都是四乘以四值为一的张量,他们两个相加以后, shape 仍然是四乘以四,里边的值应该是二。 我们可以看到这里的输出结果跟我们刚才解释的是保持一致的。但是我们需要注意的是, 在加了装饰器的函数当中,如果包含不需要进行参数训练的算子,比如说 pulling and 等算子,那么这些算子可以在被装饰器的函数当中直接调用。就像我们上面的例子,它里边调用的是 按的算子,是不需要进行参数训练的,所以他可以在装饰器当中进行调用,也可以在装饰器之外进行实力化。 但是如果被装饰的函数当中包含了需要进行参数训练的算子,比如说卷机算子以及 betch normalization 孙子,这些算子必须要在装饰等函数之外完成实力化操作,如果这些算子在装饰器之内完成实力化操作的话说就会爆错。 接下来我们来看下面这个例子,首先对二维卷机做了一个实力化的操作,然后加了装饰器,在装饰器之内调用我们前边所实力化的二维卷机算子,紧接着定义输入数据,然后使用我们前边所定义的卷机函数 来对我们的输入数据进行应用,得到输出 z, 然后最后把 z 去打印出来,最后得到我们的输出结果。 最后我们来介绍第三个任务,调试网络训练模型。在动态图模式下,我们还可以支持单独求梯度的操作,比如我们下面的例子, 首先定义了一个 x 与外相乘的函数,接着定义了一个主函数,主函数呢就是调用了 great operation 算子, 在 great operation sense 当中,它有一个参数是 get out 等于处,其中 get out 等于处,它的意义是获取关于输入的所有梯度。最后我们调用主函数,其中 x 与 y 的值分别是一以及二,那么一 和二相乘,然后我们求梯度的话说最后得到输出是 x 变量,他的梯度呢是二外变量,他的梯度呢是一 通常我们在进行网络训练的时候球的梯度,然后调用优化器对参数进行优化,然后再利用向前计算 louse, 从而实现在动态图模式下来进行网络训练。接下来我们来看一个例子,在拍 native 模式下进行 relax 训练。 首先第一个步骤是构建网络,在构建网络的过程当中,首先设置我们的模式为动态图的模式,接下来来构建能耐特五的网络结构。在构建能耐的网络结构过程当中,首先要做初始化,初始化的过程里边 定义了所需要的一些运算,比如说卷机,卷机全连接,全连接,全连接,其中这几个卷机以及全连接的参数都是不同的。然后定义了人路集会函数以及最大实话以及我们最后的 flat 的动作。 接下来通过 construct 函数将我们前面所定义的运算让它构建成了 night 五的网络的结构。首先是做一个卷机,然后接着是人路激活函数,再是磁化, 然后紧接着是卷机,人路还有直话 flatten, 在 flatten 之后是全连接层加人六计划函数以及第二个全连接以及人六计划函数,还有第三个全连接层,最后返回我们的 x 值,最后再将 我们的 the net 的网络进行实力化,名称是 net 接下来来看步骤二,利用 great operation 求函数的输入梯度。这里定义了类 great web, 这里边包含了两个函数,分别是初始和函数以及 construct 函数。在 in need 函数当中,我们可以取得网络结构以及网络的参数。 在 construct 函数当中调用了 great operation sense, 其中这里的参数使用的是 get by list 等于处,跟我们前边所说的 get out 等于处是不同的。 get by list 等处,它是获取与参数变量相关的所有的梯度。接下来我们来看步骤三,在动态图模式下进行网络训练。首先定义了优化器,使用的 是动量优化器,其中学习率为零点一,动量为零点九,接着定义损失函数,使用的是交叉商损失函数,然后使用 with love sell 来获取劳斯的值,然后再调用我们前边所定义的 grade web 来求取梯度。 最后定义我们本次所需要的输入数据。我们的输入数据的 shape 是三十二一,三十二,三十二,那么相对应的 label 也是一个三十二的。 然后将。 net 应用在 input data 上就得到了 outboot, 然后利用 outboot 以及 label 做损失,就得到了前项网络计算的损失。接着可以调用前边锁定的 tree network 来获取梯度,最后再通过 optimized i 者来优化参数,然后得到了我们最终的损失,将损失值输出是二点三零二五八五四。最后我们对本实验做一个总结,本实验主要使用 no 在动态图模式下进行单算的执行,普通函数的执行以及。
粉丝4.0万获赞9.4万

本视频为大家介绍一款开源的 ai 框架 mind sport, 它是由华为二零一九年八月份推出的 ai 计算框架,就是已经宣布正式开源了,你就可以在 本级部署本级部署这个框架,然后训练自己的模型,拿那个模型可以做自己想做的事情,然后他他现在有应用的话,呃,有以下几方面,一是手写字体识别,然后图像识别,图像分类,然后 这么多,就反正就是视觉方面用的多,然后他主要是视觉方面用的多 过数的话,要求的硬件环境就是六十 sewer, 六十 sewer 系统,然后这是内存,至少是在八 g 八 g 以上才可以。 然后我们到官网上面,它有安装安装教程,安装教程的话点安装这里,进到这,进到这个页面,然后最新版本就是二点二,一点一一,然后我们用的是 windows 六十四位的 win 十一系统,然后选 cpu, 它这个硬件平台就是 cpu 嘛, windows 系统,然后选 windows, 六十 sewer, 然后变成语言用的是 python, python 的话选最新版本三点九,然后安装方式的话, python 就对应这个 p i p p i p, 呃,安装安装方式, 他这个是安装命令,所以说你首先是在本机上要安装 python, python 呢?下载路径是这里,然后可以到官网上,也可以到他那个镜像镜像网站上下,镜像网站上下载比较快,然后我们就下载这个 三点九九这个版本,三点九九版本下载这个 a m d 六十四位的就对应的是 s n 六十四位版本的,这个一点 e x e 什么都不带的,这个就是三十二位版本的,就下这个 a m d 六十四下载下来之后,嗯,然后 用右键在以管理员身份运行这里选择自定义安装,然后自定义安装之前的话,先要把这个爱的 passion to pass, 然后这个就是自动的加环,加这个路径到环境变量里面,系统环境变量里面,然后选自定义,自定义的话 这都打上勾,然后选耐克斯,耐克斯这个叫林斯奥佛奥又轮,然后这个把路径改一下,然后自定义可以改路径的,然后把路径改到地盘吧,然后新建一个,呃,也不, 不用新建,就是把这个就把这个路径改一改就行了,直接在上面改,他没有新建文件夹,他会自动给创建的,然后就把这个 把这个路径弄短一点,然后最好不要带空格之类的,然后点安装,这两个不用打勾,这两个一打勾的话安装就会很慢的,然后基基本上卡在那里不动,然后就不打勾,没什么影响。 然后等待他安装完之后,然后去看一下这个环境变量,他有没有帮你自动增加到这个系统系统变量里面, 这个安装速度就是比较快的,然后等一下他就安装好了, 那出现这个阶段 cf was set accessful, 然后就证明他安装好。安装好了之后到属性里面,我的电脑属性里面,然后去看一下这个环境变亮,然后到这个 pass, 那我看到了这两个路径 pass, 你第一个是 p i p 的这个环境面料配置,第二个就是 passion 的这个不同于确的环境面料配置,因为这两个路径的话,就证明他你安装好,然后右键, 嗯,然后点搜索,最好与点搜索这个 cmd 命令,你这样的话可以管理员身份运行, 这样的话权限就比较大一点。然后首先是验证一下 python 有没有安装成功,出现这个三点九九版本说明安装成功了。安装成功之后,然后输入 exit, 然后两个括号,英文版括号,然后退出,退出的话就到官网 上面。呃,这里这里有告诉你这个 minus power 这 ai 框架的这个安装命令,然后用 p i p 方式的,然后就用 p i p, 然后粘贴这个命令,之后点回车就等待它慢慢帮你安装。 在安装过程中最好不要开启杀毒软件,开启的话他会报错的,因为他安装很多文件到本机的话,呃,杀毒软件会检测到他这个有些时候可能会误报 这个出现黄色字体的,不用管他这个没什么影响,然后看他官网上有一串命令说可以检测有没有安装这个框架成功,然后就这个好像不管作用不写作用,这个点复制的话好像复制不了,你就用这个选中之后,然后点复制, 然后再再次粘贴命令,然后回车一下出现这个版本,说这个安装版本是二点二一一,然后他官网提示跟官网上说的,说出现版本号就证明你安装成功了,然后安装成功之后, 这是第一步,这个框架安装成功了后,后期的话你可以利用这个框架去训练一些自己的模型,训练模型之后就跟就跟这个平台上面说的, 你可以用这个模型去去做一些。呃,识别,识别手势字体的,这这上面就都有这个怎么训练的教程, 然后本期视频就录制到这里,然后下期的话会更新这个怎么训练模型,然后怎么用这个训练的模型去去在安卓手机或者是电脑端去做一些事情。

第五章节的学习,这一章节我们将为大家讲解华为的 a i 开发框架,我们把它叫做 misephoe。 这个章节我们将主要为大家介绍 minesparo 的一个框架以及他的一个设计思路。然后我们会通过 a i 计算框架他的一个问题和难点来介绍针对于这些问题和难点, money boy 有哪些特性。最后一个小节,我们会基于 myx boy 的开发和应用来进一步了解 money boy 这一个框架。 学完本章节的课程之后,我们会知道 misebool 是什么,然后了解 monexport 的一个框架结构设计思路,与其他的业界 ai 框架相比,他有什么特点呢?然后我们还会了解到 moneysbool 的一个 环境搭建流程和一个开发案例。首先第一个小节我们将会为大家介绍的是 max bo 这个框架,它的一个结构, 这是 money go 的一个框架。首先我们来看这个框架当中两个绿色的重要的模块。第一个是 m 一模块, 全称是 my expression, 这个模块的功能是什么呢?这个模块的功能是将用户的原声代码转换成 minspro 当中的一个计算图的形式,然后对我们的代码进行优化,进行自动的 定型化,自动的生成算子,自动的微分,还可以进行半自动化的数据标注。这是 m 一模块的主要功能。向下 m 一 模块对接的是另外一个重要的模块,我们把它叫做基因模块 graff engine。 这个模块的主要功能是根据 m 一模块变异好的一个计算图 完成硬件的优化,比如说一些算子的融合,芯片中内存的共用和分配等问题,因为原生写的代码可能有一些不太合理或溶于的地方,可以在这两个模块对代码进行优化,实现一些病情化的工作。 基因模块不仅可以向上对接 m 一模块,还可以通过 graff ir 这个模块向上对接第三方框架,包括训练前端的对接和推理模型的对接。基因模块向下连接的是 tb 模块, tb 模块和 cc 一模块都是负责算值的开发和管理的。 cc 一模块向下对接的是华为自研的升腾芯片。 cc 一模块向上可以对接到第三方框架,比如说 thats flow 或者是卡费。 同样, money boy 上下也可以对接第三方的芯片,这是 money boy 的一个架构。 这张图为大家展示了 minesboy 的一个核心架构,也是 minesball 的三个核心设计理念,包括 开发肽、 ai 算法、记代码、高效运行肽、支持生存芯片、 gpu 和 cpu 部署灵活肽。现在让我们看一下 d 一个设计理念, ai 算法 g 代码。我们可以用 minspro 对用户的原声代码进行自动微分,自动并行、自动优化。 为了使代码能够高效的运行, nice bowl 提出了 on device 执行的概念,并行和深度图优化的概念,这是运行太高效的相关内容。最后一层是 灵活部署,迈西波是一个端边云按吸血做分布式框架的一个结构。下面让我们具体来看一下这一些特性和设计理念。 首先是自动微分,我们可以对比 mixpo 和其他两个业界的主流框架,包括 tc flow 和拍 touch, 他们在实现自动微分上有哪些不同呢? tc flow 自动微分的实现是 基于图的,他是非拍审的原声编程权重的正向传播和反向求导都是基于计算图的一个模式。他的一个缺点就是控制流和高阶求导表示是比较复杂的,特别是在 tusflow 一当中, 拍拖其实都是用的一个无图的形式,然后他需要记录正向和反向的一个过程。对于拍拖起来说,当某一个节点的参数在正向传递的时候,其实反向求导的过程就被记录下来了,这时候 拍拖局会利用独立功能模块记录正向和反向求导的一个结果。比如说这个节点表示的是 z 等于 x, y 正向传播就是如果 x 等于三, y 等于二的 化,那 v 等于六,这是正向的一个计算。在正向计算时,就会有模块记录反向球微分的一个结果,比如说 z 关于 x 球偏倒得出来的是 yz 关于 y, 球偏倒得出来的是 x。 这是开拓实现自动微分的一个技术, 这个技术需要独立功能模块的记录,需要定制开发,所以他反向的性能不容易被优化。拍拖是这种自动微分的方式,是基于拍摄代码的形式,是基于拍摄的算子和模块的一种方式。 而 minspro 所做的这个自动微分是更细腻度的自动微分,实现起来效率会更高。下面一个自动并行,自动并行是针对于一些大规模的模型特别 有效。自动并行将用户的代码转换成计算图之后,能对计算图执行高效的自动混合并行。平滑的扩展算例。在图像和 nop 领域有很多很复杂的模型, 比如说这种模型如果我们要采用手动并行的话,需要设计模型切分的模块。感知计算集群的一个拓普图,开发难度是比较高的, 这是 max bo, 可以实现对整图的自动切分,把整图自动切分成小的子图,融合数据并行和模型并行。感知模型的一个拓谱结构,自动调度子图,实现子图的并行,实现通行, 开销最小。就是自动并行的一个设计理念。下面一个设计理念是安地外直行,这个安地外直行指的是我们将整图下沉,下沉到芯片,发挥生成芯片的一个最大算例。 我们在用自己的电脑写代码的时候,部分代码是在本机的 cpu 上执行,部分代码是在 gpu 上执行的。比如说现在我们用拍摄写了一个 efl 语句 e 和 l s 判断语句一般是在本机上面执行的,条件判断之后,里面的执行语句是在 gpu 等芯片里面执行的。这就涉及到后斯特主机和芯片的一个交互的过程。如果我们没有整图下沉 的话,在执行代码的时候就会涉及到大量的主机和芯片交互,进行数据交换的一个过程。 myce bow 用安迪外斯执行,将整个计算图下沉到芯片,实现数据计算通信的最大化,并行 数据和计算整图都加载到芯片,然后同时在芯片上进行,减少本机与芯片之间的一个通信开销。这是安迪拜死执行的第一个关键点, on device 的第二个关键点是数据驱动的大规模分布式梯度聚合。下面我们以 resonate 五十来举例,我们在更新梯度的时候,第一步计算了梯度之后我们有一个收集梯度的过程, 收集了梯度之后再更新梯度,这一共分为了三个步骤,这三个步骤是串形直行的,而马斯布采用的是一种去中心化的方式, 是这种环形的方式。当一个节点计算完梯度之后,可以自主决定是否需要更新梯度,不需要再等待上一层的决策, 而可以自主的决策。这是一个环形的结构,比如说第一个节点计算完题度,第二个节点计算完题度,第三个节点计算完题度,这个时候节点计算完题度之后,不用上报题度,可以自主做决策。 不同的节点计算梯度过后,他们可以自主的决策梯度更新,而不需要统一的 broadcast, 然后再更新 剃度的这个过程,这样就可以达到计算和通信的一个充分分流。 下面一个设计里面是关于模型部署的,部署模型可能会出现因为硬件架构的多样性而导致部署的差异性和一个不确定性。 my sport 的一个关键技术就是运用 i r 计算图表达统一模型,带来一致性的部署体验。用 field room meta learning 来打破云端的一个界限,多设备协同达到模型的一个实时更新。


massport 的变形模式,其实刚才前面介绍了那么一大堆的东西,大家可以看到自己不管是对于数据变形,然后对于 模型变形,拍拍烂变形,还有去做重计算,以及我们这个优化器切分做这些工作的时候都是还要去对我们整个的模型做一个配置,做这样的一个配置之后呢,大家可以看到虽然说已经框架帮忙做了很多的大多数的工作了,比如说切分, 说通信,然后大家只需要去进行这样的一些策略的配置就可以了,但他还是需要你去在原本的自己单卡的一个代码的基础上进行不少的这样的改动。然后呢可以看到 我们的 masport 其实基于原本的比较简单的配置之上呢,我们自己去设计了叫自动并行这样的一个并行模式,那 masport 整个的并行模式分为以下的这四种,第一种纯数据并行,那大家就是最简单的每张卡上复制相同网络参数训练的时候去输入 这个训练数据,在小网络上直接这样简单使用就可以了。然后第二个叫做半自动并行,其实就是对应我们刚才的整个每一个位置上进行的这个介绍,就不同的这些并行的功能。 这个时候呢大家是需要自己去配置,像算子切分策略呀,像拍破烂,每一个神经网络层 放在哪一个拍 plus 备注上,或者说神经网络层要不要去做重计算,以及我们优化器需不需要去开启切分,然后这样是需要大家去手动配的,但是我只需要手动去配其中的一部分, 像切分,像这个通信是大家不需要手动做的,是框架帮你自动做的,所以是一个半自动的状态,你还是需要手动做一部分工作,但不是所有的工作。那这个是叫半自动变形模式,然后呢第三个叫自动变形模式, 自动并行模式啊,就是大家单卡的写法,完全不需要去变,或者说你实际上你根本就不知道应该怎么去配这个算数的并行策略,你也不知道怎么去切,但是呢你又想去在自己有多卡的情况下做这个方式并行, 然后 maskbo 呢,会自动针对每一个算子进行这个配置策略自动去搜索,我们会配置一个内部有一个这个叫 cost model, 根据你自己有多少张卡, 网络上有多少台机器,然后每张卡的显存有多大,以及你神经网络它本身有多少层,每一层要占用多大的显存,每一层做的 计算是更适合去进行模型切分呢?还是更适合去进行拍拍的切分呢?这样一系列的一些配置,然后根据你自己的本身的硬件参数以及 神经网络的参数去进行一个计算,然后计算完了之后呢,给大家算出来一个比较适合你去进行 不是切分的这样的艺术配置框架,帮你自动去配,然后配好了之后呢,就可以直接一键拉起当前。其实因为大家应该也知道,就是做全自动的这种方式啊,实际上不是特别容易做, 因为半自动或者说纯手动的这种方式,其实大家可以根据专家的经验,然后去把它优化到极致,然后呢自动变形,一般情况下我们现在不同的这个包括波尔特啊、 gpt 啊、 t 五啊这些模型, 基本上是能达到百分之九十到百分之一百一的这个性能,也就是说有的可能并不如我们有经验的用户自己手动调出来 可能就是百分之九十左右的行,而有一些呢,可能框架通过计算机自动搜索出来的这个策略配置还要比人能想到的要好一些,就会可能是一个百分之一百一的行,但总体而言就是不会有特别高的性能损耗。这样的话就全自动这种模式呢,其实也比较适合 是一些大家基础相对比较薄弱的,然后但是还是想玩这些大模型,然后进行这个风湿变形训练的。这样的一些用户,或者说大家同学呀,老师啊,或者是那个中小企业,就比较适合大家去使用这个自动变形模式。 最后一个是混合币型,这个叫混合币型,实际上其实应该叫手动币型,就是把所有的币型策略,包括切分,包括通信全部交由用户自己去做。那这个其实就比较适合想要基于框架直接去做二次开发的这些人。比如说像当前大家会有看到这个 转 tipsb 的这些框架,它会基于拍 touch, 在拍 touch 基础上,然后直接去进行自己的二次开发,这种其实就是完全大家自己手动的去设计这个并行训练的逻辑,然后不管是切分还是通行都自己做。 这里呢,半自动并行和自动并行是我们最推荐的两种方式,那半自动并行推荐比较有经验的人去使用,其实已经很大的把那些复杂的切分和通信都减少,只需要去进行相应的配置,但是你需要有分布式并行相关的一些经验,因为要知道怎么配,比如说我有四张卡, 切两份还是切四份,对吧?然后或者说我有八台机器,每一台机器上怎么切?我是切八个 paplace date 还是切十六个 paplace date, 这些东西都比较有讲究, 到时候具体去看,然后同时还是要多次拉去,然后去进行一个实验,那当然这个大模型整个实验的成本是比较高的,一般情况下会先拿类似的已已有的这种大规模的 模型的配置拿过来先试一下,然后进行一些精细化的一些调整。最后这个地方就是给大家看一下 masport 自动变形这个功能做的一个事情,我们有三种自动变形的方法,前两种呢,全部都是就是框架去 自动进行搜索,也就是根据我们本身自己的这个内存和通信开销,就现存占用和通信开销,以及你神经网络本身的这个大小,神经网络本身参数超参配置出来的几个,然后联合的一起去做这个搜索。 第一个是动态规划搜索,动态规划搜索啊,主要核心大家应该也知道走 dp 或者说走这个双地规策略搜索,这两种其实都是通过搜索的方式,因为搜索是没有办法去穷举所有的可能 性的。然后我们会进行一些裁剪,然后让整个这个搜索出来的这个数变得不是那么的大,然后呢去把一些相对来说最优的提供给大, 一般情况下都是会把那 cost model 去算一下,算完了之后,然后决定最好的之后,然后大家就可以直接拉起去跑,在这个不需要什么你自己本身的代码上的改动的直接配置完了这下面的这三行不同的配置,配置等单位 programming 或者 recursive programming, 然后打开就可以跑,然后最后一个叫沙丁, 这个呢其实是不完全意义上的全自动,但是呢就像我们一个神经网络里面就是有很多很多的运算或者说算子,那这个时候呢,像我们的半自动并行,一般情况下可能会配置整个神经网络里面每 一个算子的他的切分,但实际上我们可能只想矩阵成这种运算比较大的去进行一个简单的切分,那这个时候就可以直接就配那一个位置,然后配那一个位置呢,剩下的就把它改造成这个叫沙丁 pro 给审这样的一个自动并行的方, 他会根据你配置那个位置的一个变形策略,然后往前往后去进行你整个神经网络的完整的重拍,那就是说你只在一个位置上配置自己的一个切分策略,剩下的切分策略呢,全部由框架给你进行一个切分策略传播的一个方式,然后去全部自动的配置, 这个其实某种意义上来讲并不是完全的全自动,但是他可以让你在半自动的基础上基本上就只去切一两个位置就可以, 然后你还可以有一定的自由度,自己手动的去配置,同时又可以去做这个全自动定型,前面的这整个的所有的内容,就是我们 maskboard 叫自动定型特性。 不过前面的这些半自动变形做的这些事情呢,是自动变形的基础,把这些全部都优化了之后,就可以直接去进行一个配置策略的一个搜索,进行一个全自动,可以看到就是不管说是半自动变形还是全自动变形,其实 是我们这个框架已经尽量还是想着让大家去把大规模的模型分布式变形这样的一个复杂的事情做的尽量简化,那最后呢就直接使用框架,还是需要去学习到更多的这相关的变形的知识。然后我们大家现在都去搞大模型, 都想要去用 transformer 做大模型的训练,我们还在这个基础上利用框架的这个自动变形的能力,然后做了这一个叫 mantformer 大模型套件这样一个仓,然后做到这样一库。这个里面呢内置了像 vert、 gpt、 t 五, 包括 cv 的这些 vit, spent、 transformer 这一系列的这些基于 transformer 结构做出来的打磨型的基础结构,包括像最近比较火的 lama, bloom 这些 glm 也都全部都支持了,同时也包含了预训练到微调到压缩推理、孵化、部署全流 流程的这样整个的所有的功能。然后大家如果说不想用框架直接去做这个模型的并行的这样的一个构造,或者说用框架去写自己的这样一个模型,而是想要去把当前业界比较火的那个模型直接拿过来调用使用, 做自己的训练,那就可以用这个大模型套件,这个可以直接做到说你直接引炮这么一个模型,用内置的这个春,那然后一键拉起,拉起来之后就可以去做分布式飞行的训练配置,这些其实基本上都不需要做, 然后这样就可以让大家更容易的去玩大模型,尤其是玩大模型的运训练。因为现在当前业界去玩大模型的 基本上都是在做微调,就或者说大家自己个人能玩到都是在做微调,或者说做后面的推理,然后做一训练,这一步其实成本还是很高的,当然本身自己需要有卡,这一个是核心的硬件成,以及你要会写分布式并行的训练, 是成本也非常非常的高。然后我们框架就可以通过半自动变形以及自动变形这样的一些技术,然后让大家去更容易的上手大模型,然后更容易的去做一训练, 然后大家不管是做科研还是做自己实际的业务的落地,都可以更简单的去使用。

哈喽,大家好,我是中美酱,我们又来到了没什么观看,但是我依然在坚持的一节自动危险的 自动微分的系列的课程当中。啊啊,这一节呢,主要是讲反向操作服重彩去实现自动微分, 那这个自动微风的方式更类似于拍拖这个 a 框架呢,就是使用反向操作服重载的自动微分。那我们一起来回顾一下什么叫做操作服重载。 下面这个操作服虫仔的这句话其实是我在 vicky 或者百度上面粘过来的,具体在哪粘我已经忘了,简单的来说呢,其实他只是利用了语言的多肽性,然后进行了一个虫仔,下面这一段 呢,反倒是没什么用,但是依旧在那放着的一句话,就是讲操作服自动重踩的微风的方式的一些过去的 ai 框架,那最典型的一个代表呢,就是我们经常用到的拍拖, 其中最重要的呢,就是使用数据结构 tape 来记录整个计算流程,也就是我们理解的计算图。但是在派套群里面呢,他没有一个现实的计算图,然后再反向求解梯度的时候呢,去 we played 去重放我的操作这么一种方式。 现在我们来简单的去回顾一下操作服重载的基本流程,首先就是需要用语言的多肽性对操作服进行重载,定一个特殊的数据结构,并且对每个计算进行重载的操作。第二个呢,就是有一个 配的一个数据结构,对我们的数输出和我们的计算进行记录。接着呢,我们记录了每一次操作之后,需要对每次操作进行便利,然后计算他的微分方式。 最后就是使用练式求打法则,然后通过练试法则呢,把刚才便利得到的微分的结果进行累积,这个呢就完成了整个操作负重载的流程了。 那操作复重载呢?我们其实已经多次讲到了,它的优点就是实现起来只需要语言去提供多肽的性能。第二个呢就是它的应用性非常高,操作复重载之后跟原声语言的编程方式是类似的, 所以大家都会说,嗯,极度的模仿操作服重载的拍套曲的方式呢,非常容易 去使用,非常方便去理解,跟理解拍摄代码一样,这个就是拍拖许的优点,那他的缺点也是非常明显。上面呢我们用了一个特别区记录大量的操作, 这个时候呢就需要对特殊的数据结构进行大量的读和写了便利等操作了,非常不利于高阶的微分实现。那高阶微分呢,我们可能会在动力学、生物分子建模、 物理方程模拟等非常常见的一些科学计算场景经常用到,这个时候,这种自动微翻的方式非常不利于求解。第二个呢就是类似于 violf l 这些控制表达其实很难通过操作服去重载的, 那下面我们来看看反向模式,反向模式呢,一般来说是比较简 简单好理解的。又回到我们这个熟悉的图里面呢,正向模式,假设我现在有一个 x 的输入,然后我正向呢就是每一次去计算每一个节点, 然后去计算中间变量的导数,最后呢一个个计算,然后得到我们最终输出的 fsesr, 这个输出对于 x 的导数,这个就是每次正向计算的, 那反向计算呢,就是我从最后一个每个中间变量关于最初的一个导数,那从反向开始,就是从后面开始 计算每一条路径关于逆向输入的一个导数,最后呢,我就求到了 dota f 关于 s 二和 dotaf 关于 s 一的所有的导数形式。那在是机器学习里面呢,因为我的输入神经元非常的大量,而我 输出了类别有限,在机器学习里面呢,所以我们一般都会用到反向模式的自动微风的方式去实现,那这个也是反向传播的一个最原始的 id 或者数学原理。后面我们了解了这一点呢,看反向传播这个算法可能会更有感觉, 下面我想通过简单的几分钟的了解,去跟着大家一起去回顾或者学习一下拍拖曲的 autodiver 是怎么去实现的。这里面呢,所有的操作方式都是根据拍拖曲的最核心的框架的一个嗯,原始理念,然后去复线的。 首先呢,我们需要 from typing in police lane, tuple qualible discipation 这一些简单的操作方便我们下面去一个加 搭载的。那这个 flash 内呢,有什么用呢? flash 内这个函数是用来打印跟 tape 相关的变量,就是我这个 v 呢, fv, 然后杠内呢,这个内就是记录我们下面的每一条 tape, 假设我 s 一等于 v 负一, s 二等于 v 零 v 负一呢,又通过一个计算,每一行每一次计算呢,都有一个 tap 去记录的, 所以呢,我这里面呢,通过这个 freshnet 去记录我每一次 tape 到底是第几个,然后呢?干内呢?第一个就是一,我们从一开始不断的去累积,然后返回我们的 v 等于多少个? 为了更加好的理解拍套区里面的反向模式自动微分的实现,我们实现的代码过程当中呢,完全不依拉于拍套区 的熬头柜的方式,反倒是我们引入了一个新的类,这个类呢叫做 variable, 也就是类似于拍拖曲里面的 tensor。 那我们在计算的时候呢,实际上我们是从最后的损失函数或者 l 来去进行一个计算的 程序当中每算一个张亮 x 的值,就是他的梯度的时候,都会去计算 d l 到 d s 的一个导数。 然后反向模式呢,就是从 dl 对 dl 自身的导数开始,也就是 dl 对 dl 的导数等于一。我们回头看看上面这条公式, v 五就是我的歪对歪对自身的导数是一,从这一个讲式开始,然后使用偏导数和念射法则进行传播,也就是下面这条公式,然后一步步的去算的。那下面呢,我们的代码实现呢, 可能还是比较简单,我的 vivo 部我们可以理解为简单的张亮,对于张亮呢,一开始我们会初始画一个词叫做 w, 通过这个词呢变成张亮的成员变量,然后呢 soft 内呢,就是我们刚才的中间变量,如果没有一开始没有输入内呢,他可能就直接使用 fast 内, 就是我们刚才上面的一个函数在室内,然后不断的去累加一。 接着呢,下面这几个就比较有意思了。 cost 呢,其实是比较方便我们去打印查看的一个过程,我们会把通过 cost 然后上下文去把当前的一个值打印出来,还有当前的内打印出来。 下面这几个呢,就是回到我们一开始去实现,或者上两节分享内容里面的一个实现,只有一条简单 的公式,这里面呢有五个操作,第一个呢就是乘加减三和 log。 我们一开始并没有去实现这几个函数,而是返回了 ops mode, ops add, ops sub。 在反向自动威风的时候,其实最核心的就是一个 tape, 用来跟用来跟踪 variable 的所有的计算,以便于后面用念式求打法则的。这里面呢,就出现了一个 tape 的累。 tape 的累的数呢,就是 name cupo, 它是一个 string。 那我的输入呢,或者我的记录的内容有两个,第一个是 inpost, 第二个是 outpost。 那 population 呢,就是应用我们的捏式求导法则的告诉我的输入是什么,输出是什么。值得注意的是,这里面的输入是我的刁塔 l, 大雕塔 l, post, 输出呢是刁塔 l, 除以刁塔 in post。 tape 呢,所有原始计算的累积的 list 列表,就是我要把所有的计算逆向的过程记录下来,最终通过便利的方式求得每一次反向的自动微分的操作。 那下面呢,我们有另外一个函数叫做 reset tape, reset tape 这个函数很简单,就是重新初始化我们整个规定 tape, 把规定 tape 呢重新初始化一遍。 下面我们来看看具体的每个原子操作怎么去实现。刚才我们在 variable 或者我们的探测里面呢,虫仔帽的 add sub 这些原始操作的时候呢,返回的是一个 op s some 这个原子操作,我们看看现在这个原子操作具体实现了哪些功能。正向的时候的计算比较简单,首先第一个传进来的阿德斯呢,他也是一个 variable 或者一个张亮, 那我们这里面自身其实它是一个张亮,所以我们两个张亮相乘,需要通过 welcome 把它们包起来,最后返回一个 x, 那这个 s 呢?正向计算的时候,我们直接返回出去中间的这一坨,就是为了我们在反向的时候去计算的。 反向的时候呢,我们先不要去看反向的计算,而去看一下我们的 tape 具体做了哪些工作,那这个呢,就是我们的 tape, tape 就是记录我们的输入输出,还有我们反向操作的一个必包函数,那 tape 呢,我们刚才也是重新声明了, 只是记录我们输入输出还有对应的操作,那对应的反向操作呢?就是这个。然后呢,通过规点的 tape 把当前的 tape a panda 进去,就通过一个列表 list 来记录我所有的操作,最后我们就会去便利这个规点 tape, 去把每一次的操作 逆向的求出来,就把所有的正向的计算操作求一遍,把反向的计算操作求一遍, 就求得了最终的刁塔 l 对刁塔 x e s 二 s 三反向的微分的时候呢,我们有一个函数叫做 paper k 选 他的书物呢,是 dr 对 dr 铺的一个值,这个反向呢,就是我的损失函数对输出的一个导数,那 d r 对 ds 呢,就是我当前的一个值。接着呢就是 dx 对 dsf 的一个值,就是阿的 dx 对 drs 的值,就是我当前的数乘法里面,我们可以看到啊,根据乘数的求导法则就是这两个。然后呢我们再求 dr 对 dsf 还有 dr 对 drs 的一个值, 最后呢就把我的输出扔出来,因为这里面呢有两个输出,所以我们会把两个输出都同时反攻出去,那同样的,我们的爱的操作也是相同的方式去处理,我的 sup 操作也是相同的。 那加减乘除里面可能会简单一点的就是加和减,加和减,无论你怎么算啊,它里面就是对自身的数 进行求导呢,等于一,如果你对另外一个数进行求导呢,就是减号,保留减号就等于负一啊。 science 还有 lock 这两个呢,也是比较简单的, lock 就是一除以 self very 就可以了。然后如果你对另外一个数进行求导呢,就是,呃,对 dx 乘以 d soft 在拍一套去 tangofo 或者 manasport 里面,如果不显示的去设置 set autograph 或者实现一个自动微分的时候, 其实只是做了一个正向的计算,在实际上需要反向计算的时候呢,就需要去声明,我这个函数需要进行反向,让我们这里面的反向的模式也是一样的。首先通过一个函数 great, 你要去声明,我需要进行一个反向梯度的求解啦,那输入呢,有两个,第一个是 l, 第二个是 resource 输出 resource 呢,它是一个 x, 代表它是一个 list, 里面呢就对应于我们的书需要求导的所有的函数。 l 呢,就是我最后的 v 零,我们可以看到这里面的公式对应的是这个 resource, 这个从下往上求,我的 l 呢就是 v 五,我的 resource 呢,就是 v 一和,就是 x 一和 s 二对应的 v 复一和 v 零。 回到我们最核心的这个里面呢,我们首先呢创建一个字点 d l 杠低,那 d l 杠低呢?它是一个字点里面呢,就记录了每个 d l 对 ds 或者 d 中间的变量的所有的名字和数值。 然后呢我们最后一个 rabbit 等于一,所以把最后一个 l 的内拿出来,然后丢给他,作为一,我们可以看到这里面呢,最后一个假是是一,这个是所有的前提。 get the one good。 这个内年函数呢,主要是去把所有的 entity, 就是我的 great 里面的所有的 tape 的竖直都记录下来,丢给我的低腰和低,也就把所有的竖直或者我的计算的过程放在我的低腰杠低里面,为的就是方便我进行打印的时候操作。 那这个时候呢,我们可以看到 dl 杠低呢,主要是去记录所有的这个雕,这个低龄,这个具体的计算公式,这段代码是最核心的,里面用了拍省的 reverse 函数, 这意味着我们需要对规点 tape, 就是刚才去计算初始化的时候,所有的 tap 进行一个立项的操作。我们在计算的时候呢,主要是正向的,例如这条公式,我的 fartmood 是正向的, 算一遍的 reverse model 的时候呢,在我的计算图需要反过来进行修剪,所以我们这个时候通过 reverse 把每一个计算操作反过来,然后呢把 enterty 打印出来,这个时候 dr 对 dr post, 然后 gathering get 出来,放在我的 dr 跟 d 里面。 接着呢去把 dr 跟 dne post 计算出来,那这个函数呢,就是正式的计算呢? 还记得我们的 entertain 里面刚才放入了哪些内容吗? entertain 里面呢,我们刚才放入了有几个内容,一个是 inputs, 一个是 rpos, 一个是 popac 选,那我们现在把 popac 选引入进来,然后把 dapos 丢给他,然后就得到我们的 inputs 了, 是吧?我们可以反反向的去计算的,做我的 oppo 输进去我的函数,反向过来得到我的 inpost, 对我们的求解的梯度进行累积。所以在牙科比举证里面去计算的时候,并不是每个牙科比举证算一遍,而是对牙科比举举证计算出来的最后一个逐渐的往上累积,得到我们最终的每一条计算输出的导数。 那这个呢,就是把刚才的低腰便利一遍,然后把低腰的内除件,低腰的内所对应的词打印出来。下面呢,我们以这一条公式为例,看不懂上面的没有关系,我们来看看实际代码里面具体是怎么呈现的,或者回头你再看看我评论里面的开源代码委托在哪里, 你要重新深入的去看一看具体代码是怎么的一个过程。那公式呢?还是那个熟悉的味道, f x e s 二等于零的 s e 加上 s e 乘以 s 二减去 ssr。 这里面呢,由于基于的是操作服从采的计算方式,所以我们在初始化的时候呢,需要两个边量,第一个呢就是 x, 第一个,第二个就是 y, 把 x 跟 x 代表 x 一, y 代表 s 二,然后初始化是二和五,它的名字呢是从负一到零开始, 下面我们来一个正向的计算,正向的计算的结果是一个 ff 呢,他也是个 vivo 的对象,这里面呢代表他是一个张亮或者一个 variable, 我们可以看到它的计算就是 rubberbo 拉 lock 加乘减,再求个 science, 所有的操作都是一模一样的,正向的时候呢,因为我们刚才对每一个数进行打印,所以我们可以看到啊,从负一零等于五,然后 v 等于 lock v e, v 二等于 v 的负一乘以 v 零,然后这么一步步过来,我们可以得到最终的输出结果,等于十一点六五二,零点七,那这个呢,跟我们正向的是一模一样的,正向的求导方式是一模一样的哦,从 v 负零到 v 五,然后每个计算 v 四减 v 三, 是吧? b 五等于 b 四减 b 三,所有的操作都是一模一样的,这个呢就是得益于我们刚才在操作服重载的时候,把我们的操作 打印出来,把每一个需要进行哪一步,做什么动作都打印出来。这个 s 呢,就是正向的计算,通过 type 记录下来每个反向的操作, 然后再到便利的时候逆过来去求每一个立项,然后进行一个累积。那下面我们来看看最后的一个反 反向的时候怎么操作,反向的时候呢,我们去上面有我的 grade 点,然后 l 呢,等于我的 f resource 等于 x 和 y, 意味着我需要对 x 和 y 进行求导,然后把 dx 打印出来,把 dy 打印出来, 我们其实去吊用,这个时候呢,下面这一坨内容就会不断的答应出来。 dld 呢,实际上存的是一个字典,那这个字典呢,存的就是 v 五,我们的第几个,然后它的值是多少? 然后 tape 呢,就是记录我的 inputs 有多少个,我的 outpose 是多多少个。我们从 v 五开始,然后就去 跪求 v 四和 v 三,因为 v 四和 v 三同时都利用到 v 五,那我们可以看到基本上是一样的,然后泡泡可以选呢?这个就是我的泡泡可以选的一个对象,然后一步步的逆向的求解, dx 等于五点五, dy 等于一点七,那这个就有意思了,基本上我们从逆向过来求解的时候就可以求得了 v 一 b 二就是 v 负一, v 零等于五点五等于一点一,一点七,一六 来。今天我们主要是手把手的带着大家去实现一个类似于派套取的核心机制,反向操作服自动重踩的微分。 在这过程当中我们学习了操作服重载,我们回顾了操作服重载的具体的原理和方式,然后又回顾了反向模式的方式。接着呢,通过拍审这个高级语言去模拟了一遍拍拖时的奥特贵的 核心机制原理具体是什么实现的?其中最核心的就是我的 tape 的操作,我们需要把 tape 的 input 搞清楚, tape 具体做了哪些工作,记录哪些工作。然后呢,在重载的过程当中,具体的运算方式是什么样的?这里面运算方式绝对不能写错,写错了可能最后所有的计算都是错误的。 那在具体的奥特贵里面呢,我们又实现了一个微分的自动累加,通过微分的自动累加,实现了牙科笔举,在里面每一行的计算的数据累加就得到返向自动微分,具体的实现。好了,谢谢各位,摆了个。

哈喽,大家好,我是周米。 那今天呢,我们还是回到我们 aib 一期系列里面的前端优化,而前端优化上一节呢,我们讲了一个图层的,哎呀有了图层哎呀之后呢,我们第一个 pass 就是算子融合,算子融合我们又叫做 opu 选,那在今天算子融合里面呢,我们主要分开 三个内容给大家介绍的,第一个呢就是算子融合的方式,算子融合有很多种方式的,大家不要觉得算子融合是很简单, 那我们平时觉得简单呢,是因为我们看的更多的是卷机边路路这种算子的融合的策略,那有了这些策略之后呢,我们就会对他进行总结,然后变成一个具体的一个优化的帕泽优化的算法。那接着呢,我们来看看现在我们处于 哪个位置,这个就是我们的 ai 框架呀,好多的 ai 框架会对我们的拍摄的代码进行解析,变成一个图层的,哎呀就是我们的计算图,有了计算图之后呢,就丢给我们真正的 ai 变异器来变去,就会对我们的代码,对我们的图层的,哎呀进行前端的优化。 现在呢,我们还是在这个位置蒜子融合呢,作为前端的一个 pass, 对我们的 grofty 啊进行改变,把一些小的蒜子变成一个大的蒜子。 现在我们来看看第一个最重要的内容就是算子的融合方式,其实呢,在真正做调研的时候啊,我并不觉得算子的融合方式有多难,但是真正看了之后我才发现,哎, 原来算子的用和方式还能这么多吗?好像有点大声啊,小声点,不然吵到隔壁录课的时候。现在我们来看看网络模型 结构啊。网络模型的结构呢,其实也非常复杂,我们可以看到一串一串下来,大部分网络模型都是以这种方式来去组织的,而我们其实有非常多的小算子,能不能把这些小算子和成一个大的算子,减少我们对科努的调度,然后减少我们对内存的访问呢?这个就是我们, 这个呢就是我们做算子融合最大的一个目的。那现在我们来看看融合有哪种方式。假设我们现在有这么一个左边的这个计算图,让我做一个纵向的融合,把 c 算子和 滴算子进行融合,这个时候呢,我们已经减少了一次的科努的开胶,而且也减少了一次中间的数据的仿存。 那第二种方式呢,就是我算子 a 计算完之后呢,分别给 b 算子和 c 算子进行执行,而 b 算子呢和 c 算子它是一个并行的执行, 就是 b 和 c 是同时执行的,但这里面呢就会有两次的访存。那我向右边的这个手势,我我把 a 算子和 b 算子一起去执行,再把 a 算子和 c 算子进行执行, ab 跟 ac 是同时并行的, 这个时候呢,我只执行两次科诺的开销,而且并发了只有一个来回,就是我只需要一次的仿唇,这种方式也是可以的。 另外图还是这个图,他的方式有很多啊,像现在我们左边的 b 和 c 呢,需要并发,然后他需要调用两次的坑筒开销。 右边呢我把 b 和 c 进行融合,那这种横向的融合我们确确实叫做横向融合,这里面呢减少了一次科努的调度,而且两次的计算结果呢,都放在我们同一个内存块里面,加坏了我们内存访问的效率。 哎,没想到这里面这种图还有这么多用和方式啊,现在呢我们来看看呢, abc 三个算子进行计算的时候呢,会有三次的坑等开销。如果我把 a 和 b 进行融合,就是 a 和 b 进行融合呢, 然后合并完之后,把所有的结果丢在我们的内存里面,这个时候呢再给 c 进行计算,另外一个结果呢给下一个进行计算,这个时候呢可以提高我们的内存的使用效率。从上面几个例子我们可以看出,不同的算子轮和策略会产生不同的算子的开销,也可以带来不同的内存访问的性能的提升。 我们现在呢来看看一个比较综合性的一个融合的方式。现在我们有一个转机旋子,一层一层二五六,然后有一个转机旋子,三层三层有二五六。我会把鼠标所在的这个卷机的算子 呢,把它进行一个扩充,一纳九我们的卷机,然后变成一个三乘三乘二五六。接着呢对这两个三乘三乘二五六的进行一个合并,合并成一个算子,变成我们的卷机,三乘三乘以五二二。 有了这个横向的融合之后呢,我们想做一个纵向的融合,纵向的融合呢,我们现在有个 spree, 有个卷机,有个 add, 现在呢我们把 spree 卷机 add, 把它合成一个算子,变成卷机要的三乘三乘二五六,但是我觉得还不够像激活,一般来说都可以合并在我们前一个计算里面,所以呢我们要把卷机为路合并起来, 这个操作很有意思,就是我们一开始的计算图是比较复杂的,比较多算子的就融合起来了,我们就算子就减少了很多,虽然有部分的计算呢可能会变大,但是总体来说我们减少了柯努的开销,我们减少了对内存 不断的访问。刚才上面那个例子呢,其实我们已经很清楚的看到了, 算子融合确实对我们整个计算图或者整个运算的时候呢,产生很大的收益。那我们主要是解决两个问题,一个是内存强的问题,就是减少我们的访问内存。 那第二个呢,就是并行墙的问题,将我们计算图的算子的节点呢并行的编排,从而提升整体的并行的效率,这个呢就是做算子融合的目的。 现在呢我们一个非常经典的卷机, bnv 路三个算子,三个非常经典的算子进行融合,看看他到底是怎么操作的。那首先呢,我们看一下 bn 在计算的时候呢,我们需要去求那个数数据,特别是 x 的一个均值和方差, 在这里面呢,我们先对 x 求我们的君子,然后再求我们的方叉,然后呢使用君子和方叉对我们每一个数据输入的数据做一个规划和说放的, 而这个君子和方叉呢是学习的一个参数,而 x 呢就是我们前面卷机算出来的一个输入。接着呢给我们的未路进行计算,这个就是我们 b n 的一个正常的流程, 那我们看看正向的时候其实还是很简单,但是反向的时候问题就变得非常复杂了,我们反向的时候呢,数据是从后面往前流的,就我先算完路,再算边,再算卷机。 我在反向的时候呢,首先我要求参数的误差,例如我们的雕塔伽马,雕塔贝塔,而这两个参数误差呢,会依赖于我们的输入雕塔 来和我们的之前的输入 x, 这个 x 呢,也会对他产生影响。所以呢,反向的过程呢,包括球参数误差,还有球输入误差两个部分。毕业这个算子呢,在反向计算的时候呢,关键的仿纯特征就是我需要对内存里面的这些参数 进行访问。第二个呢,我需要大量的去访问我们的刁塔歪,把我们之前反向计算出来的一个输出误差给到我们的刁塔伽玛计算,给到我们的刁塔贝塔计算,还给到我们的刁塔 x 进行计算,这种方式呢,就引起我们的计算对内存进行大量的访问。 在实际的 ai 框架计算里面呢,他这个刁塔瓦呀,不是单单一个数,而是一个项量,一个举证,一个张量,就可能甚至是高维的张量,数据量是非常大的,所以 他对仿唇的要求是非常高的。我们现在来看看计算仿唇的分析,就是对这个仿唇进行一个简单的分析。 在网络模型训练的过程当中,我们需要保存每一层的前向的计算的结果,就是我们刚才所谓的 bn 的 x 在反向计算误差的时候用到的。但是随着我们深度模型的网络模型越大,模型成熟越深,我们需要保存的中间结果和参数量了就会急剧的增加, 这个时候呢就需要消耗大量的内存,所以我们在训练一个大一点的网络模型的时候,经常说内存不够了,希望我们的内存或者显存更大。 而另一方面呢,因为我们的加速器或者 mpu 或者芯片上面的仿存容量是非常有限的,没办法无限制的去保存我们的数据,所以这个时候呢,我们就需要把中间结果可能会 offload 到我们的 cpu 内存里面, 并且在反向的时候再读取出来,那这种方式是非常低效的。那下面呢,我们来看看一个更加明确的例子,还是刚才的卷机边笔录三个算子中间的这个横框呢,就是我们的内存,那假设我们现在有两块内存 正向的时候呢,我们需要 z e、 w 一进行完卷机计算,我们输出 x, 在 b n 计算的时候呢,我需要把 x 输进去,把伽玛贝塔输进去,求得我们的平均值和方差, 还有 y, 这个时候呢,我 y 送给我的未路输出,我的 z。 在反向的时候呢,我同样需要把刚才计算的 y, 把我们刚才的 x 还有我们的刁塔 x, 刁塔干吧,刁塔贝塔,刁塔 x 也是需要计算 和存储的,可以看到这个图呢,我们有大量的箭头,而每种箭头都不一样实现,红色呢就是我们正向对内 存的访问虚线,红色的就是我们求参数误差对内存的访问,而绿色的虚线呢,就是我们求数目的误差对内存的访问,可以看到对内存的访问次数 非常的多,每次都要大量的交互,所以我们希望把,所以我们希望把这些零散的算子和成一个大的科诺,把这些零散的一些数据直接一次性的读取,一次性的读出, 针对卷机编语录呢,我们把边重构成为 bnb, 还有 bna, 就把一个边算纸呢拆成两个,首先 bna 呢来算我们的君子和方叉, nb 呢,就完成我们的规划和说放,像我们刚才说到把这些参数呢统一的计算完之后呢,输给我们的一个 bnb, 然后给我们的 v 路进行执行, v 路执行完之后再给我们的卷机进行执行。 卷机咨询完之后呢,再求我们的误差和方差,并把计算后的最终的结果写到我们的内存里面,那这种方式呢,就是把算子进行融合,可能看这个图你不是很直观,下面呢我们来看看具体的计算公式。 假设我们的计卷机公式呢是 w 乘以 x 加 b 等于 c, 在 bn 的计算呢,就是我把 z 计算完的,然后减去命,然后做一个 bn 的计算,这个呢就是我们的 bn 计算公式,得到我们的 yy 呢,再进行一个 v 六,那我们可以把 v 六先抛开一边, 我们融化后的简化的算子融合,简化的卷机和边之间呢,就是这种关系,我先求 w 一撇,再求 b 一撇,最后呢再求我们的 y 真正的输出。 下面我们来看看 tvn 定义的一个融合规则和具体的算法。首先我们要了解一下 tvm 的一个支配数啊,这我们先来讲讲 tvm 吧, tvm 呢实际上是一个承接其主导的开源项目,之前呢主要是用来做一个推底的 aipnec, 那现在呢,我们来看看 tvm, 其实整体的算子融合的策略是基于支配数来实现的。嗯,那什么是支配数吗? 自配数呢?实际上是由各个自配点来构成的数。嗯,那什么又是自配点呢? 嗯,自拍点就是所有能够达到当前节点路径的公共主线节点,我们叫做 lca。 那听上去有点拗口,我们来看看一个真正的图, 右边的这个图呢,就是我们的支配数,每个节点呢,就是我们每个支配点其实都有一个对应的数值,而这个数值呢,跟这个数值可能会串起来,像这个呢,我们叫他 叫做一个自配点,像这个 incase 呢,它就是一个自配点,每一个算子都是一个自配点,这么几个算子组合起来能到达我们的自配点,这几个算子组合起来也能到达我们的自配点,这几个算子这种方式组合也能够达到我们的自配点。 那为什么我们需要支配数呢?有了支配数,我们就非常的方便的去检查我们每一个闹的到支配点的,闹的是否符合融合的策略。 假设我现在把四七八做了一个融合,那这个时候呢?四七八这个算子已经融合掉了, 五七八这几个算子是没办法进行融合的了,因为七八我已经跟四融合成一个大的算子。有了这个自配数和这个自配点呢,我们就知道哪些节点能够符合我们的融合规则,哪 一些剩下的节点不会对我们的融合规则产生问题。而自配数的生成呢,有几个步骤,就是根据我们的计算图,或者我们计算图其实是一个第一区图嘛,生成一个深度优先搜索的数,那接着呢,我们根据这个深度优先搜索的数呢,产生我们的边, 接下来会根据深度优先搜索数呢对应的边产生我们的 dm 数。然后呢我们加入一个数据结构,叫做 goop, 来描述多个的闹的能够被融合, 那这呢是一个闹的,这是一个闹的,这是一个闹的,这些都是一个节点,通过这个数呢去描述我们的那些闹的我们的节点,我们的算子,这个呢就是整体 tvm 支配数的一个作用。那了解完大概的作用之后呢,我们看看 tvm 的算子的融合的流程。首先呢我们会通过 st 就是 我们的圆满转换,把我们的计算图的哎呀转换成为我们的比类的,哎呀,那这个比类的哎呀呢是 tv 里面自己的哎呀。接着呢去便利这个比类的,哎呀便利完这个比类的,哎呀呢会利用比类的哎呀建立我们刚才所说的第一句数。那第一句数呢,主要是生成我们的自配数的, 生成我们的自配数之后呢,就可以应用我们的算子的融合的算法和规则了。现在我们来打开呢,具体看看。 第一个呢,我们的书是一个 dag 的图,就是我们计算图是一个 dag 嘛,进行深度优先便利生成我们的 dfs。 那在这里面生存的过程当中呢,除了单纯的记录每一个闹的的节点的深度之外,闹的呢就是我们的算子嘛,我们还需要为每一个节点保存他相连的边,保存的他相连的边呢,我们就知道对应的缩影, 找到我们的 lca, 找到能够达到当前节点的公共指路径。 接着呢我们在第二步就是根据我们的 dfs 数,因为刚才已经建立了 dfs 数码,生成一个 dom 的数,那 tvm 呢,就使用 good 这个概念,那这个概念实际上呢,它是一个数据结构,来描述我们这些 note 的 这些算子能不能做融合。如果一个算子不能和其他算子融合,那这个 goop 呢?由自己去组成。如果这几个算子,例如我遇到卷机 b, n, v 度的时候呢,我就把这几个算子合并成一个固,这个时候呢,只有一个固。 最后一步呢,就是定好我的勾之后呢,我们去便利每一个闹的,找到他的支配点所带的路径是否符合我们的融合规则。而这个时候呢,融合规则就变得异常的重要。我们现在来看 看看有哪几种融合规则。首先呢,我们有一种就是映射 injective, 类似于加,还有 potent west 这种节点呢,我们就可以做一个 injective, 然后做一个融合,例如我这里是一个加号,第二次也是一个加号,这个时候呢,我们就可以把两次的加号变成一次的相乘。 那现在我们还有 we 丢选,就是简约函数,这个简约函数也比较好理解,就是输入到输出具有降为的性质,例如 some, max, me 就求最大词,求最小词,这些我们都可以把它进行融合, 我加完之后求最大值,那这个时候呢,我们可能可以把它合成一个具体的算字。另外呢,第三种就是我们的人工定义的规则,我们人工呢去发现一些,例如卷机 bm 笔录,这是可以融合的,我们 人工的去设定一些融合的规则,当然了,人工融合的规则除了卷机边笔录呢,我们可能还有 attes 归啊,还有那个相乘相加。那像这种呢,我们会人工的定义了非常多的 pass 编译器呢,虽然看上去很高大上,很深奥的技术,实际上啊,在做到编译器底层的时候,我们还是定义了很多人工的规则, 通过工程师呢去抽象了很多不同的规则出来,然后把这些规则呢写到 aip 系里面,最后变成一个通用的法则,或者通用的犯式,或者通用的 pass 函数。最后一种就是没有办法进行融合的,例如 sot 这种排序的,没办法进行融合,那我们只能单独的把它拿出来。 那最后我们看看实验的结果呢,是将卷机编语录,然后 wis, 卷机编语录,还有 innlstm, 这些都可以做 钻子融合的。融合之后呢,就是我们的蓝色这条线,实际上执行的效率更高,我们减少了仿纯,减少了科诺调用的次数,所以说会比我们绿色的这个没有进行融合的时候效率更高。哦, 好了,我们进来回顾一下,其实算子的融合呀,分开横向融合和纵向融合,但实际上呢,我们会根据 ai 模型的排布,演示出更多不同的融合的策略。 那我后面我们第二个呢,就是通过卷机编语录这个算子呢,了解到对算子如何进行融合,还有融合后的计算,基本上可以极大的减少我们对返存的压力,但是这个算子的融合呢,我们需要在数学上保持羽翼的一致, 那第三个呢,就是在 aip 系里面呢,一般我们的融合规则都是通过 pass 来承载的,不同的 pass 处理不同的融合规则, 而融合规则呢,就是需要我们人工,我们工程师去预先定。好的。好了,今天到此为止,谢谢各位。摆了个杯,卷的不行了,卷的不行了,记得一键三零加关注哦,所有的内容都会开源,在下面这条链接里面摆了个杯。

嗨,大家好,这里是大模型与分布式训练系列里面的第五节内容。 在开始这一节内容之前呢,我今天下午跟我们公司教练组的刘博去聊,他说我的视频啊,看起来太难太深了,所以呢,他建议我在每一节开始之前呢 加一些背景知识,之后呢再开始。所以在后面的每一张节里面呢,我都会简单的去介绍一下背景的知识。上一节课呢,我们讲了通信的软硬件,还有通信的具体的实现方式,那这一节我们会讲讲通信的原语,什么叫做通信原语吗? 在我们分布式训练系统里面呢,由于我们的网络模型现在越来越大了,大到我们一张卡或者一台服务器已经塞不下了,于是我们会对这个网络模型进行切分,切分完之后呢,可能会放 在不同的机器里面。想象一下,当我们的模型大到要切分到非常多的服务器里面,假设我们现在把一个模型切分到五个服务器,每个服务器之间呢又需要相互通讯,我们把一个大的网络模型切分成很多小的网络模型,那每个小的网络模型之间是有相互的依赖的, 所以我们呢就需要跨界点对数据进行同步,既然涉及到同步中间的过程,就需要进行通讯,跨界点的通讯,跨网络的通讯,跨卡的通讯,各种通讯的方式不同,就取决于我们的系统或者我们的网络拓谱是怎么样组成的。 下面呢有个简单的例子,就是我们的拍套曲的代码,这里面呢我训练了一个网络模型,这里面呢是网络模型的训练过程,我新定义了一个优化器,定义了一个网络模型,接着呢我 迭代十次,每一次迭代在训练反向的时候呢,我需要对梯度进行聚合,那在梯度进行聚合的时候呢,是通过 always do 这个通讯的操作对数据进行聚合的, 那这个 always do 或者这个数据的操作方式,我们又叫做通讯原语,那通讯原语呢?我们叫做通讯的 pimitive。 通讯的原语呢,主要有三种类型,一种是一对多,一种是多对一,另外一种是多对多。下面呢我们分开来去讲解这些通讯方式有哪些不一样。 首先我们看一下一对多的通讯方式,我们叫做 both cost, 就是我有一台服务器零,服务器零把他自己的一些数据同步到不同的机器,就是把我这个绿色的框,绿色的数据块同步给另外三台服务器一、二三,那这个时候呢,我们叫做 both cost。 广播 广播的这种方式呢,最常用于就是我们的网络模型参数的初始化。下面呢这个图就是广播的方式,我在 npo 里面有 a 数据,然后我通过广播使得所有的 mpu 都具备我 a 的这份数据。 那另外一种一对多的方式就是 scatter。 假设我零号卡里面现在有四份数据,分别用不同的颜色代表,我需要按照一定的策略去把这四份数据分发到不同的硬件上面。这个时候呢,我可能零号卡只保留我自己的绿色的数据,把不同的数据呢,每一份都分发到 不同的机器上面,那这个就是 scatter。 下面这个图呢也是 scatter 的一种方式,我现在有一个零号机器,分别有 a, e, b, e, c, e, d, e, 我通过 scatter 的操作,让每一块 mpu 呢都有自己的一份独立的数据,那接着就是多对一,多对一, 一呢,我们更多的称他为聚合的方式,聚合的操作呢又叫做规约,规约的操作呢又可以做加减乘除,求最大值,求最小值。 这里面呢,我们以家为例子,现在假设我每款 gpu 都有一个限量,五一二三七八四二,每款 gpu 都有自己的独立的数据,我通过 reduce some 把所有 gpu 的数据都汇集起来,然后进行一个磊家的操作,这个就是 reduce some 原语的一个具体的操作方式。 假设我每款 mpu 呢都有自己的一个数据,最后呢我通过为丢失把所有数据都汇集到一个 mpu 上面去进行操作。 多对一,还有一个叫 get 的操作, get 的操作,我们看上面的这个图就很明确了,我们现在有四个节点,每个节点都有不同的数据,通过 get 的方式呢,就把所有节点的数据都汇集在 一个卡里面。那我们现在看看下面的这个图,每一款 npu 呢都有自己的数据 abcd, 通过 get 的操作,所有的数据都汇集到一个卡上面,但是呢,这里面只是做一个汇集的操作,并不进行任何计算。 在我们分布式并行的算法里面呢,经常会用到做排序和搜索,我把所有的 mpu 上面的数据都汇集到一起,进行个排序和搜索的操作。之后呢在广播给其他的 mpu。 下面我们来看一下多对多的通讯方式,多对多的通讯方式里面,最简单或者最常用的方式呢,就是 always use ovidiuce。 我们以加的为例子就是 obidiosome, 上面我们有四个节点,每个节点都有一个项链,那通过 obidiosome 呢,我们就去把所有的数据累压起来,然后再广播给各个节点。下面这个图可能会更清楚, 我们有四个 npo, 每块 mpo 都有自己的独立的数据,通过 obe deals some 之后呢,每一款 gpu 呢都有四个 gpu 的汇集的数据。 在多对多里面我们还有 orgada, 假设我们现在有四个节点,每个节点呢都有自己一份独立的数据,我们通过 orgada 把这几份数据呢都同步到所有的机器上面。 orgada 的方式呢,在我们做多环通讯的时候经常会用到的。 另外还有一个 we do skater, we do ska 很有意思, we do ska 这个操作呢,我们首先会进行一个 we do 操作,然后再进行一个 ska 的操作。 假设我们现在每个节点呢都有一款数据,我们首先会执行 reduce 的操作,然后把所有的数据都汇集起来,然后再进行 skate 的切分。看一下 下面这个图就会更加明白。假设我们现在有四款 mpu, 每款 mpu 的数据呢都是相同的,我们 reduce 的操作就把四个 mpu 里面的 a 的数据进行累加,然后放在我们 apu 一里面,然后 b 呢,我们把所有 b 的数据呢进行累加,放在我们第二个 apu 上面,以此类推, 使得每款 mpu 都有一个 reduce 后的数据。最后就是奥特奥,假设我们现在有四个节点,我们希望把每个节点里面想要的数据都汇集在第二个节点上面, 下面我们来看看具体的一个 npo 的例子。假设现在每款 apo 上面都有一个 a 的数据,那这个 a 的数据在进行计算完之后呢?我们新玩进行通讯都变成一块卡的数据啊,然后再进行一个剧类处理的。刚才我们已经讲了一对多 scatter box, 还有多对 e get the reduce 的方式,另外我们还讲了 all reduce, 还有 all getter, 还有 all to all 的这种多对多的通讯的方式。具体其实多对多的方式可以由一对多或者多对一的方式来组成的, 我们在后面多维度并行,数据并行的时候呢,就会充分的用到这种通讯的方式,通过不同的通讯方式去加速我们整个的通讯比。 下面以 ovidius 为例, ovidius 呢,假设我们的 npu 里面有四份数据,每份 npu 都有自己独立的数据,我经过 ouvidius 之后呢,就把四份数据都进行了一个磊加,然后每个卡上面呢,都能得到上面四块 gpu 的数据的汇集。 那我们这个操作其实是等于 reduce getter 再加 or reduce reduce getter 我们刚才已经讲过了,我们现在 ipo 里面呢,有各分的数据, reduce getter 呢,就把上面每一款 gpu 的数据都汇集到某个地质,第二个块的数据都汇集到第二个卡,把第三块的数据都汇集到第三个卡,最后再加上 algado 的方式。 alga 的方式就是进行一个广播,这一块的数据广播给其他,把第二块的数据广播给其他 gpu 上面相同位置的数据, reduce, getter, 再加上 altercate 的操作之后呢,就等于哦 reduce 的这种方式了。所以说在分布式训练系统里面呢, 通讯的方式对我们来说是非常重要的,我们需要控制节点什么时候进行通讯,用什么样的方式通讯才能更好的利用我们整个系统的性能,让我们的模型训练的越快越好。 今天的内容比较简单,我们了解了集合通讯的三种不同的方式,还了解了一堆多呢,主要有 box 广播的方式。那多对一呢?有聚合 get 和 reduce 的方式,另外我们还有多对多的集合通讯的方式。 最后我们了解了多对多其实可以由一对多和多对一的组合方式,例如 overdose 就等于 reduce get, 再加上 all getter 的方式,在这么累卷的环境下做到经常更新实属不易。非常欢迎大家对我一见三年,谢谢各位,拜了个拜。


华为手环九,我现在已经用了两天时间了,就拍完视频之后也会直接肉给粉丝朋友,如果你对身体健康比较关心的话,那这款手环绝对非常推荐。我觉得这次他在这个睡眠监测方面还是下足了功夫的,打开这个科学睡眠之后,就可以深度分析你的睡眠情况,在 app 里面就可以看到自己睡眠的详细信息和状况了,而且还可以查看睡眠呼吸暂停的检测,并且在你睡醒之后也能给到科学的睡眠报告和睡后详细的评估。对了,他这次还支持了这个脉搏播心率失常的分析,可以查看到防颤和早搏的风险。那我这里就记录了一次疑似早搏, 而且在这里面还清楚的记录了脉搏的情况。对于睡眠有问题的朋友,这款手表是非常友好的,它的颜值我个人觉得还是非常高的,好多人说这个做工有问题,就是这个屏幕的缝隙可能会有些大,我暂时呢是还没有遇到这个情况, 那可能是品控的问题吧。那这个手环整体的佩戴还是很舒服的,我我个人觉得没有不适的感觉,那至于其他方面,它到底好不好用呢?我过两天也会更新详细的体验视频,大家感兴趣的话可以点个关注,拜拜!