照片做视频的网站南通网站外包
news/
2025/9/26 13:27:59/
文章来源:
照片做视频的网站,南通网站外包,seo 工具,如何制作一个网站包含多个网页文章目录 第五课#xff1a;MindSpore自动并行1、学习总结#xff1a;数据并行模型并行MindSpore算子级并行算子级并行示例 流水线并行GPipe和Micro batch1F1B流水线并行示例 内存优化重计算优化器并行 MindSpore分布式并行模式课程ppt及代码地址 2、学习心得#xff1a;3、… 文章目录 第五课MindSpore自动并行1、学习总结数据并行模型并行MindSpore算子级并行算子级并行示例 流水线并行GPipe和Micro batch1F1B流水线并行示例 内存优化重计算优化器并行 MindSpore分布式并行模式课程ppt及代码地址 2、学习心得3、经验分享4、课程反馈5、使用MindSpore昇思的体验和反馈6、未来展望 第五课MindSpore自动并行
1、学习总结
数据并行 数据并行过程:
每一张卡上放置相同的模型参数、梯度、优化器状态不同的卡送入不同的数据训练反向传播获得梯度后进行AllReduce
数据并行的问题:
要求单卡可以放下模型.多卡训练时内存冗余
模型并行 **模型并行是算子层面的并行它利用某些算子的特性将算子拆分到多个设备上进行计算。**因此并不是网络中所有的算子都可以拆分计算,可以拆分的算子需满足如下特性:
可以并行计算的算子算子其中一个输入来自于Parameter
MindSpore算子级并行
MindSpore对每个算子独立建模用户可以设置正向网络中每个算子的切分策略(对于未设置的算子默认按数据并行进行切分)。在构图阶段框架将遍历正向图根据算子的切分策略对每个算子及其输入张量进行切分建模使得该算子的计算逻辑在切分前后保持数学等价。框架内部使用Tensor Layout来表达输入输出张量在集群中的分布状态Tensor Layout中包含了张量和设备间的映射关系用户无需感知模型各切片在集群中如何分布框架将自动调度分配。框架还将遍历相邻算子间张量的Tensor Layout如果前一个算子输出张量作为下一个算子的输入张量且前一个算子输出张量的Tensor Layout与下一-个算子输入张量的Tensor Layout不同则需要在两个算子之间进行张量重排布(Tensor Redistribution)对于训练网络来说框架处理完正向算子的分布式切分之后依靠框架的自动微分能力,即能自动完成反向算子的分布式切分。
算子级并行示例 由于第一个算子输出的Tensor Layout是第零维切分到集群而第二个算子要求第一个输入Tensor在集群上复制。**所以在图编译阶段会自动识别两个算子输出/输入之间Tensor Layout的不同从而自动推导出Tensor重排布的算法。**而这个例子所需要的Tensor重排布是一个AllGather算子(注: MindSpore的AllGather算子会自动把多个输入Tensor在第零维进行合并)
流水线并行
受server间通信带宽低的影响传统数据并行叠加模型并行的这种混合并行模式的性能表现欠佳需要引入流水线并行。流水线并行能够将模型在空间上按stage进行切分每个stage只需执行网络的一部分大大节省了内存开销同时缩小了通信域缩短了通信时间。流水线(Pipeline) 并行是将神经网络中的算子切分成多个阶段(Stage) 再把阶段映射到不同的设备上使得不同设备去计算神经网络的不同部分。 GPipe和Micro batch
**简单地将模型切分到多设备上并不会带来性能的提升因为模型的线性结构到时同一时刻只有一台设备在工作而其它设备在等待造成了资源的浪费。**为了提升效率流水线并行进一步将小批次(MiniBatch)切分成更细粒度的微批次(MicroBatch)在微批次中采用流水线式的执行序从而达到提升效率的目的。 1F1B
**MindSpore的流水线并行实现中对执行序进行了调整来达到更优的内存管理。**如图3所示在编号为0的MicroBatch的正向执行完后立即执行其反向这样做使得编号为0的MicroBatch的中间结果的内存得以更早地(相较于上图)释放进而确保内存使用的峰值比上图的方式更低。 流水线并行示例
流水线并行需要用户去定义并行的策略通过调用pipeline_ stage接口来指定每个layer要在哪个stage上去执行。pipeline_ stage接口的粒度为Cell。所有包含训练参数的Cell都需要配置pipeline_ stage并且pipeline_ stage要按照网络执行的先后顺序从小到大进行配置。
class ResNet(nn.Cell):ResNetdef __init__(self, block, num_classes100, batch_size32):initsuper(ResNet, self).__init__()self.batch_size batch_sizeself.num_classes num_classesself.head Head()self.layer1 MakeLayer0(block, in_channels64, out_channels256, stride1)self.layer2 MakeLayer1(block, in_channels256, out_channels512, stride2)self.layer3 MakeLayer2(block, in_channels512, out_channels1024, stride2)self.layer4 MakeLayer3(block, in_channels1024, out_channels2048, stride2)self.pool ops.ReduceMean(keep_dimsTrue)self.squeeze ops.Squeeze(axis(2, 3))self.fc fc_with_initialize(512 * block.expansion, num_classes)# 下面就是流水线并行的配置self.head.pipeline_stage 0self.layer1.pipeline_stage 0self.layer2.pipeline_stage 0self.layer3.pipeline_stage 1self.layer4.pipeline_stage 1self.fc.pipeline_stage 1内存优化
重计算
在计算某些反向算子时需要用到一些正向算子的计算结果导致这些正向算子的计算结果需要驻留在内存中直到依赖它们的反向算子计算完这些正向算子的计算结果占用的内存才会被复用。这一现象推高了训练的内存峰值在大规模网络模型中尤为显著。如:
DropoutActivations
解决办法是通过时间换空间为了降低内存峰值 重计算技术可以不保存正向计算结果让该内存可以被复用然后在计算反向部分时重新计算出正向结果。 重计算效果
以GPT3模型为例设置策略为对每层layer对应的Cell设置为重计算然后每层layer的输出算子设置为非重计算。72层GPT3网络开启重计算的效果如下图所示:
重计算使用方式
为了方便用户使用MindSpore提供了针对单个算子和Cell设置的重计算接口。当用户调用Cell的重计算接口时这个Cell里面的所有正向算子都会被设置为重计算。
class ResNet(nn.Cell):ResNetdef __init__(self, block, num_classes100, batch_size32):initsuper(ResNet, self).__init__()self.batch_size batch_sizeself.num_classes num_classesself.conv1 conv7x7(3, 64, stride2, padding0)self.bn1 bn_with_initialize(64)self.relu ops.ReLU()self.maxpool nn.MaxPool2d(kernel_size3, stride2, pad_modesame)self.layer1 MakeLayer0(block, in_channels64, out_channels256, stride1)self.layer2 MakeLayer1(block, in_channels256, out_channels512, stride2)self.layer3 MakeLayer2(block, in_channels512, out_channels1024, stride2)self.layer4 MakeLayer3(block, in_channels1024, out_channels2048, stride2)# 这里就是对每层进行重计算的方式self.layer1.recompute()self.layer2.recompute()self.layer3.recompute()self.layer4.recompute()self.pool ops.ReduceMean(keep_dimsTrue)self.squeeze ops.Squeeze(axis(2, 3))self.fc fc_with_initialize(512 * block.expansion, num_classes)优化器并行 在进行数据并行训练时模型的参数更新部分在各卡间存在冗余计算优化器并行通过将优化器的计算量分散到数据并行维度的卡上在大规模网络上(比如Bert、 GPT) 可以有效减少内存消耗并提升网络性能。 传统的数据并行模式将模型参数在每台设备上都有保有副本把训练数据切分在每次迭代后利用通信算子同步梯度信息最后通过优化器计算对参数进行更新。数据并行虽然能够有效提升训练吞吐量但并没有最大限度地利用机器资源。其中优化器会引入冗余内存和计算消除这些冗余是需关注的优化点。
ZeRO (1-3)
优化器状态切分pos切分优化器状态到各个计算卡中在享有普通数据并行相同通信量的情况下可降低4倍的内存占用添加梯度切分posg在pos的基础上进一步将模型梯度切分到各个计算卡中在享有与普通数据并行相同通信量的情况下拥有8倍的内存降低能力添加参数切分posgp在posg的基础上将模型参数也切分到各个计算卡中内存降低能力与并行数量成线性比例通信量大约有50%的增长 参数分组(Weights Grouping) 将参数和梯度分组放到不同卡上更新再通过通信广播操作在设备间共享更新后的权值。该方案的内存和性能收益取决于参数比例最大的group。当参数均匀划分时理论上的正收益是N- 1/N的优化器运行时间和动态内存以及N- 1/N的优化器状态参数内存大小其中N表示设备数。而引入的负收益是共享网络权重时带来的通信时间。 参数切分(Weights Sharding) **对参数做层内划分对每一个参数及梯度根据设备号取其对应切片各自更新后再调用通信聚合操作在设备间共享参数。**这种方案的优点是天然支持负载均衡即每张卡上参数量和计算量一致缺点是对参数形状有整除设备数要求。该方案的理论收益与参数分组一致为了扩大优势框架做了如下几点改进。
**对网络中的权重做切分可以进一步减少静态内存。**但这也需要将迭代末尾的共享权重操作移动到下-轮迭代的正向启动前执行保证进入正反向运算的依旧是原始张量形状。**优化器并行运算带来的主要负收益是共享权重的通信时间如果我们能够将其减少或隐藏就可以带来性能上的提升。**通信跨迭代执行的一个好处就是可以通过对通信算子适当分组融合将通信操作与正向网络交叠执行从而尽可能隐藏通信耗时。通信耗时还与通信量有关对于涉及混合精度的网络如果能够使用fp16通信通信量相比fp32将减少- -半 MindSpore分布式并行模式 数据并行用户的网络参数规模在单卡上可以计算的情况下使用。这种模式会在每卡上复制相同的网络参数训练时输入不同的训练数据适合大部分用户使用。 半自动并行用户的神经网络在单卡上无法计算并且对切分的性能存在较大的需求。用户可以设置这种运行模式手动指定每个算子的切分策略达到较佳的训练性能。 自动并行用户的神经网络在单卡上无法计算但是不知道如何配置算子策略。用户启动这种模式MindSpore会自动针对每个算子进行配置策略适合想要并行训练但是不知道如何配置策略的用户。 混合并行完全由用户自己设计并行训练的逻辑和实现用户可以自己在网络中定义AllGather等通信算子。适合熟悉并行训练的用户。
课程ppt及代码地址 github地址网络不好的可以访问下面我克隆到gitee上的地址Parallel gitee地址Parallel
2、学习心得
通过本次学习更加熟悉了华为Mindspore这个国产深度学习框架同时也对mindspore的各种并行策略有所了解峰哥通过resnet50这个示例把各种并行策略实现都做了一个详细的讲解还是比较印象深刻的课后不懂的还可以再跑跑相关的代码示例总之各种并行策略在代码上的实现方式还是挺简单的基本就是一行代码就搞定了。
3、经验分享
在启智openI上的npu跑时记得使用mindspore1.7的镜像同时安装对应mindnlp的版本不然可能会因为版本不兼容而报错。另外就是各种并行策略的代码都要跑一跑结合视频去加深理解。
4、课程反馈
本次课程中的代码串讲我觉得是做的最好的地方没有照着ppt一直念而是在jupyter lab上把代码和原理结合到一块进行讲解让学习者对代码的理解更加深入。我觉得内容的最后可以稍微推荐一下与Mindspore大模型相关的套件让学习者在相关套件上可以开发出更多好玩和有趣的东西
5、使用MindSpore昇思的体验和反馈
MindSpore昇思的优点和喜欢的方面
灵活性和可扩展性 MindSpore提供了灵活的编程模型支持静态计算图和动态计算图。这种设计使得它适用于多种类型的机器学习和深度学习任务并且具有一定的可扩展性。跨平台支持 MindSpore支持多种硬件平台包括CPU、GPU和NPU等这使得它具有在不同设备上运行的能力并能充分利用各种硬件加速。自动并行和分布式训练 MindSpore提供了自动并行和分布式训练的功能使得用户可以更轻松地处理大规模数据和模型并更高效地进行训练。生态系统和社区支持 MindSpore致力于建立开放的生态系统并鼓励社区贡献这对于一个开源框架来说非常重要能够帮助用户更好地学习和解决问题。
一些建议和改进方面
文档和教程的改进 文档和教程并不是很详细希望能够提供更多实用的示例、详细的文档和教程以帮助用户更快速地上手和解决问题。更多的应用场景示例 提供更多真实场景的示例代码和应用案例可以帮助用户更好地了解如何在实际项目中应用MindSpore。
6、未来展望
大模型的内容还是很多的希望自己能坚持打卡将后面的内容都学习完并做出一些有趣好玩的东西来最近准备尝试做做社区大模型相关的代码迁移精度验证任务了希望能够学以致用提高自己的技术水平
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918318.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!