没有合适的资源?快使用搜索试试~ 我知道了~
380→用于高效流水线DNN训练的弹性平均摘要陈子豪zhchen@stu.ecnu.edu.cn华东师范大学wnqian@dase.ecnu.edu.cn华东师范大学陈旭cxu@dase.ecnu.edu.cn华东师范大学周傲英ayzhou@dase.ecnu.edu.cn华东师范大学处理一批的如今,DNN模型的规模迅速增长为了训练大型模型,基于流水线并行化的框架将模型划分为GPU,并将每批数据切片为多个微批。然而,管道并行存在气泡问题和低峰值利用率GPU 1GPU 2GPU 3GPU 4微批量向前训练时间落后泡沫的GPU。最近的工作试图解决这两个问题,但未能利用香草管道并行性的好处,即,将通信与计算重叠。 在这项工作中,我们采用了一个弹性平均为基础的框架,探索弹性平均添加多个并行管道。为了帮助框架利用管道并行的优势,同时减少内存占用,我们提出了一个时间表,先进的前向传播。此外,由于并行管道和微批的数量对框架性能至关重要,我们提出了一种基于分析的调优方法来自动确定设置。 我们将这些技术集成到一个原型系统中,即基于PyTorch的AvgPipe。 我们的实验表明,平均管道实现了1.7倍的加速比最先进的解决方案的管道并行平均。CCS概念:·计算方法大规模并行算法。关键词:深度学习系统,流水线并行,弹性平均陈旭是核心作者上海大数据管理工程研究中心允许免费制作本作品的全部或部分的数字或硬拷贝,以供个人或课堂使用,前提是制作或分发副本的目的不是为了盈利或商业利益,并且副本的第一页上有本声明和完整的引用必须尊重作者以外的其他人拥有的本作品组件的版权。允许使用学分进行摘要以其他方式复制、重新发布、在服务器上发布或重新分发到列表中,需要事先获得特定许可和/或付费。 请求权限请发邮件至permissions@acm.org。PPoPP©2023版权归所有者/作者所有。 授权给ACM的出版权。ACM ISBN 979-8-4007-0015-6/23/02。. . 15美元https://doi.org/10.1145/3572848.3577484图1. 香草管道主义1介绍随着数据量的增加和硬件的发展,深度神经网络(DNN)在过去十年中取得了巨大的进步。 为了跨加速器训练模型,提出了包括TensorFlow [7],PyTorch [3],Caffe [15]和MXNet [1]的解决方案。通常,它们提供接口来训练数据并行的DNN模型,这会在每个GPU上复制模型权重,因此无法支持大型模型训练。然而,最近,DNN模型的规模迅速增长,以在一系列应用中实现更高质量的输出,特别是对于自然语言处理(NLP)[8,29]。因此,出现了一种模型并行训练方式,称为流水线并行[14流水线并行在GPU上划分连续的模型层,将每批数据切片为微批,并通过GPU进行流水线处理,如图1所示。此外,流水线并行避免了同步模型权重[23],并自然地将GPU之间的通信与计算重叠,可能优于数据并行。然而,流水线并行性受到未充分利用的GPU的影响。DNN训练涉及反向传播,阻塞训练管道并导致气泡问题[14]。例如,在图1中,在微批处理4的前向传播之后,GPU 1必须等待下游GPU发回后向结果。 一个简单的解决方案是在一个批次中加入更多的微批次,减少气泡时间的比例。这反过来又增加了批量大小并阻碍了统计效率[16,21,34],即,需要更多的时期来实现模型的目标质量为 了 在不 改变 批 量 大 小 的 情 况 下 解 决 气 泡 问 题 ,PipeDream [23]版本模型权重,并使用多版本管道填充气泡。但是,由于有多个版本,PipeDream的内存占用与GPU数量呈线性关系,这意味着无法1 2 3 41 2 3 41 2 3 4585 6 75 6 7 85 6 7 85 6 7 81 2 3 441 2 31 2 3 41 2 3 41 2 3 4PPoPP陈子豪,陈旭,钱伟宁,周傲英3811 21 32 43 54 65 76 87 98 1091 122 334 45 56 67 78 89 9101 2 315 263748 59 610 7 111 425 3647 58 69 710 8111 2 3 4扩 展 集 群 以 训 练 更 大 的 模 型 [24] 。 为 了 节 省 内 存 ,PipeDream-2BW [24]通过有界陈旧训练减少了版本号。此外,PipeDream-2BW和Dapple [11]提出了一个一个向前一个向后(1F 1B)的时间表,该时间表在微批次的向前和向后传播之间交替,以避免隐藏激活。Chimera [19]还采用双向管道来消除百分之八十百分之六十百分之四十百分之二十0%的百分比01 2 3 4 5 6 7 8培训时间(秒)内特泡泡然而,它们对通信效率的要求都很严格,在分布式环境中的性能甚至可能比普通流水线还要差。这是因为,当交错的前向和后向传播,系统不能遵循香草流水线重叠通信与计算。在本文中,我们提出了AvgPipe,一个分布式火车-使用基于弹性平均的框架的测量系统,图2.BERT示例中未充分利用的GPU较大批量大小GPU 1GPU 2GPU 3GPU 4以减轻流水线并行性的气泡问题,同时保持统计效率。基本上,弹性平均技术在每次迭代中缩放馈送到训练过程 AvgPipe采用多个并行管道,其中每个管道在每次迭代中处理一批数据,并通过弹性平均来训练并行模型。通过处理更多的批次,AvgPipe能够将每个批次切成更多的微批次并减少气泡。此外,我们没有像最近的弹性平均工作那样创建新的优化器[18],而是探索了一个新的框架,以便AvgPipe与各种优化器兼容(例如,Adam [17])。然而,弹性平均的技术不能直接与流水线并行工作,因为副本(par-park)模型增加内存占用。 为了节省时间,AvgPipe 遵 循 PipeDream-2BW 和 Dapple 采 用 1F 1B 时 间表。此外,鉴于1F1B不能完全重叠通信与计算,我们提出了先进的前向传播。它提前调度部分前向传播,以便AvgPipe可以利用气泡时间和重叠通信,以较低的内存占用进行计算。此外,并行流水线和微批的数量,称为并行度,是必不可少的性能和内存占用。例如,将一个批分割成更多的微批可能会导致GPU的峰值利用率降低,而添加更多的并行流水线可能会导致更高的内存占用。 为了简化并行度的设置,我们提出了一种基于剖析的调优方法。该方法基于一个短的性能分析运行来预测不同设置下的性能,并在给定的内存约束下选择最佳性能最后,我们的实验结果表明,AvgPipe能够实现4.7倍和1.7倍的加速比,分别超过最先进的数据并行和流水线并行。在其余部分,我们强调弹性平均的动机-第二部分,做出以下贡献。训练时间微批量正向反向磁泡(a) 较大批量大小使用micro-batch 1版本发布微批1GPU 1GPU 2GPU 3GPU 4训练时间微批量正向反向磁泡(b) 多个版本图3.减少泡沫的方法我们在第3节中提出了一个基于弹性平均的框架,它提高了流水线并行和优化器并行的性能。我们在第3节中提出了先进的前向传播,它可以节省内存,同时防止通信开销导致的性能下降。我们在第5节中提出了一种基于分析的调优方法,该方法可以用可忽略的分析时间来调优并行度,以利用AvgPipe的性能。我们将在第6节讨论AvgPipe的实现,并在第7节演示其性能。此外,我们在第8节中介绍了相关工作,并在第9节中总结了我们的工作。2激励弹性平均在流水线并行中,GPU的气泡和低峰值利用率促使我们采用弹性平均。泡沫由于反向传播,流水线中的GPU并行性将周期性地空闲,从而导致气泡。 图2显示了来自变压器(BERT)[9]的训练双向编码器表示的气泡。为了减少气泡部分,可以增加批量大小,如图3(a)所香草管道PipeDream-2BW使用GPU 1····1 2 3 4 5 67 81 2 3 4 5 6 7 81 2 3 4 5 67 81 2 3 4 5 6 7 81 2 3 4 5 67 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81234567 8PPoPP陈子豪,陈旭,钱伟宁,周傲英382示。然而,更大的批量会降低统计效率,并导致更多的训练时期[18,34]。用于高效流水线DNN训练的弹性平均PPoPP382参考模型并行模型2处理两批并行模型1参考并行模型1并行模型1GPU 1GPU 2并行模型2modelparallelmodel 1 referenceGPU 3并行模型2modelparallelmodel 1 reference参考模型GPU 4并行模型2模型并行模型1参考并行模型2刑罚微批量培训时间向前推进落后并行模型2模型泡沫(a) 独立更新发散(b) 弹性平均图4.使用弹性平均的管道并行性概述图5. 弹性平均或者,PipeDream [23]使用多版本管道来填充气泡。如图3(b)所示,PipeDream在GPU 1中的微批处理1的反向 传 播 之 后 生 成 模 型 的 版 本 然 后 , 基 于 此 版 本 ,PipeDream立即执行微批次5的正向传播,以消除气泡。不幸的是,PipeDream在完成微批处理5之前无法发布微批处理1的版本。这意味着,PipeDream在训练期间必须维护四个(等于GPU的数量)版本,这不是内存效率[24,33]。为了保存内存,PipeDream-2BW [24]允许陈旧的训练,并且只维护两个版本。尽管如此,如图2所示,PipeDream-2BW仍然周期性地空闲GPU背后的原因是GPU之间的通信开销,这将在第4节中进一步讨论。GPU的低峰值利用率。在流水线并行中,每个GPU每次处理一个微批然而,由于微批的大小很小,算术强度不够高,因此训练无法利用GPU的计算能力如图2所示,尽管有空闲和通信时间,GPU 1的峰值利用率在流水线并行中仅为60%左右总的来说,我们学到了两个教训。首先,虽然大的微批量解决了气泡,但它也降低了统计效率。其次,小尺寸的微批处理导致低运算强度,从而导致GPU内核未得到充分利用。因此,这里的挑战是增加微批量和算术强度,同时保持原始的统计效率。为了缓解这一问题,我们探索了一个基于弹性平均的新框架[35]。如图4所示,该框架将一个批处理分割为更多的微批处理,并并行处理多个批处理以克服气泡和GPU的低峰值利用率3流水线并行中的弹性平均技术为了提高流水线并行的性能,我们采用了弹性平均的思想。我们从3.1节开始讨论弹性平均的利弊。然后,我们在3.2节中提出了一个基于弹性平均的框架,以克服现有弹性平均技术的缺陷。微批量过程管道微批量GPU 1QGPU 2消息队列Ⓢ ➍消息队列@消息队列消息队列消息队列@GPU 3消息队列GPU 4消息队列消息队列并行模型1参考模型并行模型2图6. 基于弹性平均的框架3.1弹性平均的优点和缺点弹性平均的主要思想是在保持统计效率的同时增加在实践中,已经观察到使用小批量可以提高泛化性能和优化收敛[16,18,32]。通常,从较大批次训练的梯度范数较小,这可能导致较低的统计效率,因为梯度是通过批次大小归一化的。 为了增加并行性并保持统计效率,我们可以添加多个并行模型。每个模型都独立地使用小批量进行训练[30],如图5(a)所示。 然而,这可能导致平行模型的分歧[20]。因此,我们使用弹性机构将平行模型拉向中心位置,如图5(b)所示。这为我们提供了调整平行度的灵活性(例如,增加微批次或并行模型的数量然而,现有弹性平均技术[18,35]的缺陷之一鉴于一系列优化器[10,17,27]在不同模型上显示出比普通SGD优化器更好的统计效率,扩展的SGD优化器在实践中的使用有限。此外,扩展的优化器不能直接支持大型模型训练,因为额外的并行模型占用的空间更大,这与流水线并行性的意图背道而驰。3.2基于弹性平均的框架为了与各种优化器兼容,我们提出了一个基于弹性平均的流水线并行框架。816816715715614614513534121423113112101210119916151439 10 116 7 814 15 1685137412631152101149121 2 31615149 10 11 12 134 5 6 7 812 13 14 15 16831172106191 2 3 4 5169 10 11 12 13 14158162108191 2 3 4 5 6 7345671112131415PPoPP陈子豪,陈旭,钱伟宁,周傲英383(−)∈[]���− +如图6所示,我们引入了并行模型和框架中的参考模型并行模型。AvgPipe启动并行管道,每个管道在本地执行前向和后向传播以训练并行模型。���具体而言,首先,AvgPipe将并行模型划分到多个GPU。 每个GPU负责模型中连续层的一个分区。然后,并行流水线在每个GPU上启动一个进程,迭代地执行以下步骤。第二步是通过GPU对微批的前向和后向传播进行流水线处理,并通过用户指定的优化器计算本地更新在这里,优化器有多种选项。步骤104是更新并行模型的权重 除了局部更新之外,AvgPipe还将弹性平均应用于并行模型。的用参考值GPU 1GPU 2GPU 1GPU 2GPU 1GPU 2微批量训练时间向前落后泡沫通信t0t1模型权重比为1���*��� * 这里,n =0,1表示并行模型的依赖性,其被设置为图7.一个批次上的不同时间表[18 ]第18话。步骤104是将本地更新发送到参考模型为了防止进程间通信阻塞管道,AvgPipe以异步方式通过消息队列管理发送。参考模型。为了支持弹性平均,AvgPipe维护一个参考模型作为并行模型的中心也就是说,参考模型中的每个权重保持并行模型中相应权重的平均值。AvgPipe使用参考模型来决定将平行模型拉向哪个方向和拉多远,以防止发散。具体而言,AvgPipe将参考模型与并行模型共同分区。对于每个GPU,AvgPipe启动一个单独的进程来管理参考模型,以免阻塞并行管道。该过程迭代地执行两个步骤在步骤104中,进程通过消息队列从每个并行流水线接收本地更新。然后,累积本地更新以用于后续更新。在步骤S104中,在接收到所有本地更新之后,即,每个并行流水线完成一个批,过程标准化,应用累积更新。4性能感知调度尽管基于弹性平均的框架采用并行流水线来提高性能,但是模型复制导致更高的存储器占用,这违背了流水线并行性的意图,即,解决GPU内存不足的因此,我们寻求一种性能感知的计划,使AvgPipe能够训练大型模型。接下来,我们将阐述现有的流水线并行调度,并提出基于它们的先进的前向传播4.1现有附表中的问题流水线并行的基本调度是全前向全后向(AFAB)调度,它遵循数据并行的原则。具体地,如图7(a)所示,AFAB调度开始于仅在批处理的所有正向传播之后进行反向传播 它完全重叠了通信和计算,但必须在GPU内存中维护一个批次的所有激活,从而扩大了内存占用。为了减轻内存占用问题,PipeDream-2BW和Dapple采用了一个向前一个向后(1F 1B)的时间表(也称为早期向后时间表[11])。也就是说,它们在微批的前向和后向传播之间交替,以便不时地经由后向传播来释放隐藏在GPU存储器中的前向激活。具体来说,如果有GPU,那么������第10个GPU只需要存储最多1000个GPU的激活������微批量如图7(b)所示,当n=2,第一个GPU,即,���=1,需要隐藏2个微批次的激活。不幸的是,1F1B调度还阻止了系统与计算完全重叠的通信,因为它在前向和后向两个方向上交错传播管道。 如图7(a)所示,通信每批仅阻塞AFAB计划两次。但是通信阻塞1F1B调度九次,如图7(b)所示例如,1F1B中的通信导致GPU2上的微批处理2和3的处理之间的饥饿,这延迟了GPU 1上的微批处理4的向后传播。因此,1F1B的训练时间���1变得比AFAB的训练时间���0长。总的来说,1F1B计划牺牲了训练时间,以减少内存占用。4.2高级前向传播实际上,多个并行管道会导致更大的内存占用. 为了节省内存,AvgPipe遵循PipeDream- 2BW和Dapple使用1F1B时间表。只要我们将一个批处理分割成更小的微批处理,就可以减少并行流水线带来的额外GPU内存7 8的t0(a)AFABt1训练时间移动的t0(c)前进P(一)(b)第(1)款(c)第(1)款86 74 5312167856745634523431 2(b)1F1B训练时间787655343211867654344231 2训练时间3 4 5 6 7 87 8 1 21 2 3 4 5 61 2 3 4 5 61 2 3 4 5 6 7 8878878125612峰值存储器用于高效流水线DNN训练的弹性平均PPoPP384/()()算法1在第一个GPU输入:每批处理中的微批处理数量,GPU数量,1:_���������←−1//相当于1F 1B进度表���2:whilenext_batch()do3:对于=1, 2,···,���������������������_���������4:forward_a_micro_batch()//提前转发5://将剩余的微批6:对于=1, 2,···,−���������������������_���������做7:forward_a_micro_batch()8:backward_a_micro_batch()第九章:if_fasterandis_available(可用) 然后10:调整时间调整时间_调整时间+//调整时间_调整时间然而,1F1B调度遭受通信开销。 为了解决性能问题,我们进一步提出了先进的前向传播,利用气泡时间在流水线并行加速执行。具体来说,我们观察到GPU 1有足够的气泡时间来执行微批处理2之后的微批处理3在此基础上,我们打算利用气泡时间提前执行微批的前向传播,防止下游GPU的饥饿。如图7(c)所示,如果GPU 1提前执行微批处理3的前向传播,则AvgPipe能够将微批处理3的前向通信与GPU 2上的微批处理1和2的计算重叠,从而防止GPU 1和GPU 2的后续饥饿。利弊 与AFAB时间表相比,AD-Vance前向传播实现了相同的训练时间,但是具有较低的峰值存储器占用(图7的示例中的AFAB调度的3×8)。请注意,尽管与1F1B调度相比,提前前向传播牺牲了上游GPU的部分内存,但它毕竟对性能有利 如图7(c)所示,第一个GPU隐藏了三个微批的激活,而1F1B调度有两个微批。但是,我们可以通过将一个批处理分割成更多的微批处理来稀释额外的内存占用。只要微批处理的大小足够小,额外的内存占用就可以忽略不计。此外,先进的前向传播本质上是一个香草AFAB和1F1B计划之间的权衡,这意味着它可以退化为其中任何一个一方面,如果理想地,通信开销是最小的,则向前传播的微批的数量可以是零,即,相当于1F1B计划。 另一方面,如果通信开销很大并且可用内存足够,则调度将提前执行所有微批的前向传播,这相当于AFAB调度。关于Advance Forward Propagation的决定 为了避免浪费内存,AvgPipe在执行提前前向传播时采取保守策略,如A1-出租m 1所示。最初,AvgPipe执行1F1B计划(第1行)。然后,AvgPipe逐渐增加每次迭代向前传播的微批的数量,直到内存占用达到用户定义的限制或训练停止变快(第9-10行)。5调整非线性度在基于���弹性平均的框架中存在两个并行度:微批次数量μ和并行流水线数量μ。它们都显著影响训练性能(根据我们的实验,性能有一个数量级的差异)。在本节中,我们将介绍调优并行度的挑战,以及我们基于分析的调优方法。5.1挑战调谐的非线性度可能有一个调优准则来提高性能,即最大化并行度。具体来说,该指南增加了微批次数量以减少气泡,并增加了并行管道数量以优化GPU的峰值利用率尽管如此,该准则并不总是可行的,原因有三。首先,给定固定的批次大小,性能并不总是随着微批次数量而增加,因为微批次可能太小,以至于AvgPipe不能完全利用所有GPU内核。第二,当增加并行流水线数量时,GPU利用率的边际效用递减。第三,两个平行等位性程度都与GPU利用率和内存占用相关,因此我们不能天真地逐个调整它们。由于用户设置并行度并不简单,因此AvgPipe需要一种调优方法。 一种方法是遍历度数的所有设置,具有少量的批次(例如,10批)。然而,遍历花费数小时(例如,在我们的实验中用于BERT模型的训练超过两个小时)。为了获得最佳的并行度,可以忽略不计的开销,我们探索一种有效的调整方法。5.2基于性能分析的调优方法由于并行度的调整既必要又复杂,我们提出了一种基于剖析的调整方法。 其思想是只分析一种并行度设置,并根据该配置文件预测其他设置下的性能和内存占用。最后,我们选择的设置,实现最佳的预测结果,并满足内存约束。因此,该方法包括两个阶段,剖析和预测。5.2.1性能和内存分析。 在分析阶段,我们尝试设置一定的并行度。 特别是,我们使用一个相当大���的和一个小的���,使GPU没有得到充分利用。在我们深入研究之前,一般来说,PPoPP陈子豪,陈旭,钱伟宁,周傲英385GPUΣ.������()−.()网���1���2������������=���GPU资源过度使用的配置文件不足以预测每个-���=������∗���GPU+你好,我很高兴见到你。���������∗���.(二达到100%。否则,我们无法学习������(���)∗from������(���),∫ΣΣ.Σ.ΣGPU 1GPU 2第二,我们预测了当=时的值,������ ������ =���0。类似地,由于有���平行线而不是���平行线百分百.���Σ∗���∗������训练时间我们推断,��� .()是一个巨大的���. (���)中选择。在此之前,微批量转发如果.���()如果 是,���∗���. 其他-0%的百分比训练时间磁泡通信������乌戈普. .���∗���Σ 乌戈普否则,���∗���������������(���)∗ −1, 0 of1吨1吨*额外的1234T2GPU*/m*{2/m*{2/m*{2/m*21使用GPU 1������������PPoPP陈子豪,陈旭,钱伟宁,周傲英386GPU()下一页.Σ利用不足。我们让AvgPipe用20个1F1B通过先进的前向传播,这是合理的假设性能AFAB和1F1B与先进的批处理进入计算队列���,通信���技术阻断GPU,和气泡计数器 ,首先,我们预������尺寸���GPU原始的。作为对现实世界的简化原始. 因此,委员会认������(���)∗is��� of������(���), as depicted图8. 预测∗图9. 预测。额外的时间。总体而言,���对于������,我们有GPU网.- 是的- 是的ΣΣPPoPP陈子豪,陈旭,钱伟宁,周傲英387.Σ.- 是的���- 是的Σ������������= 微批量- 是的到GPU,������GPU���GPU∗图8中的阴影区域。因此,对于=,我们有GPU���GPU������∗先进行微批处理,并完成相应的计算,.Σ特别是当新的设置有资源PPoPP陈子豪,陈旭,钱伟宁,周傲英388如第5.2.1节所述,我们quire()tonot������PPoPP陈子豪,陈旭,钱伟宁,周傲英389根据设定批次在培训期间,我们收集GPU利用率、计算时间、通信时间和PPoPP陈子豪,陈旭,钱伟宁,周傲英390存储器占用空间,用于预测相位。5.2.2预测性能。 根据侧写,我们PPoPP陈子豪,陈旭,钱伟宁,周傲英391如果算术强度变低。为了说明,PPoPP陈子豪,陈旭,钱伟宁,周傲英392���������100%不一定意味���着50%������当���λ= 2时���。沟通时间������。 为了计算通信量-PPoPP陈子豪,陈旭,钱伟宁,周傲英393预测在不同的paral设置下的性能PPoPP陈子豪,陈旭,钱伟宁,周傲英394.���/������.���..���.ΣΣ���������������网时间,T,从配置文件和������GPUΣ ∗在方程式2中预测。阳离子块GPU���������T−������GPU0,0���时间的流逝因此,对于=,���.Σ ∗以及下游GPU,������.也就是乌戈普不没有上游GPU。对于n=2、 3、···、n,GPUn必须等待Σ∗=Σ∗.Σ起起起时间阻塞GPU,我们首先评估总通信量,阳离子时间,然后减去重叠时间。因此,委员会认为,PPoPP陈子豪,陈旭,钱伟宁,周傲英395lelism度。因为我们已经克服了PPoPP陈子豪,陈旭,钱伟宁,周傲英396的预测。������我们依靠的是全面的沟通PPoPP陈子豪,陈旭,钱伟宁,周傲英397前向传播足够近另外,目的是比较不同的设置,而不是评估确切的PPoPP陈子豪,陈旭,钱伟宁,周傲英398训练时间。因此,我们预测了AFAB的性能而不是1F1B,以简化性能分析。
下载后可阅读完整内容,剩余1页未读,立即下载
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)