没有合适的资源?快使用搜索试试~ 我知道了~
2( )f 21231397660在分散学习个性化模型的过程中学习协作0李双通1 周天一2,3 田欣梅1 陶大成401中国科学技术大学;2华盛顿大学西雅图;3马里兰大学学院公园;4京东探索学院0lst2015@mail.ustc.edu.cn, tianyizh@uw.edu, xinmei@ustc.edu.cn, dacheng.tao@gmail.com0摘要0由于每个边缘设备上可用的私有数据和计算资源有限,为用户定制的计算机视觉任务学习个性化模型具有挑战性。分散学习(DL)可以利用分布在网络拓扑上的设备上的图像来训练全局模型,但不适用于为不同任务训练个性化模型或优化拓扑。此外,在DL中用于聚合邻居梯度消息的混合权重对于个性化可能是次优的,因为它们对不同节点/任务和学习阶段不是自适应的。在本文中,我们动态更新混合权重以改进每个节点任务的个性化模型,并同时学习稀疏拓扑以减少通信成本。我们的第一种方法“学习协作(L2C)”直接优化混合权重,以使预定义节点/任务集合的每个节点的本地验证损失最小化。为了为新节点或任务生成混合权重,我们进一步开发了“元L2C”,它通过比较两个节点的模型更新来学习注意机制以自动分配混合权重。我们在各种基准和实验设置上对两种方法进行了评估,用于图像分类。与IID/非IID分散化和联邦学习的经典和最新方法进行了全面比较,证明了我们的方法在识别节点之间的协作者、学习稀疏拓扑以及以低通信和计算成本生成更好的个性化模型方面的优势。01. 引言0为计算机视觉任务训练大型模型,如深度神经网络(DNNs)和视觉变换器[6, 38,40],需要大量数据,但在许多应用中,数据分布在数百万甚至数十亿个个人/IoT设备上。由于隐私保护和有限的通信带宽,通常禁止传输其本地数据,因此无法在所有设备上进行集中式学习0节点3:0鸟对鸭0节点2:0狗对猫0节点1:0卡车对汽车0iθ0θj()f�α023 w0Δθ31θΔ1θ03θ0图1.分散学习在本地模型更新和邻居模型更新的聚合之间交替进行。我们提出了“学习协作(L2C)”和元L2C来优化并生成每轮模型聚合的混合权重wi,j,以实现更好的个性化本地模型在其自己的任务/数据上。虽然L2C直接优化混合权重,元L2C学习了一种注意机制,自动产生θi和θj之间的混合权重。数据是不可行的。相反,联邦学习(FL)[29]和分散学习(DL)[24]作为两种广泛研究的分布式学习方案,旨在通过仅在多个设备之间共享本地模型/梯度而不泄露其私有数据来训练全局模型。FL和DL在设备上的本地模型更新和跨设备模型聚合之间进行迭代,即每个节点在更新其他节点的模型之前使用其本地数据来更新其模型。它们的主要区别在于FL通过聚合本地模型并与更新的全局模型同步所有节点来定期更新中央服务器上的全局模型。相比之下,DL既不假设中央服务器也不假设显式的全局模型:每个设备只能与其网络拓扑上的邻居节点通信并聚合其消息以更新其自己的本地模型,而无需全局同步。在对拓扑和聚合的混合权重进行一定的假设[24]的情况下,DL中的本地模型可以证明收敛到“共识”全局模型。FL和DL针对不同的目标97670实际中的分布式学习设置。然而,在实践中,设备及其用户可能针对不同的任务,并且它们的本地数据分布不相同,例如,当它们属于不同的地理群体时,一个全局模型可能在所有设备上表现不佳。如何为每个本地模型个性化其自己的任务/分布,并同时利用设备之间共享的知识,是FL和DL中出现的一个关键挑战。最近,通过个性化来解决设备之间的数据/任务异质性问题引起了越来越多的关注。在FL中,由于全局模型是明确优化和广播的,全局一致性和本地模型个性化之间的权衡是不可避免的,并且可能依赖于仔细的超参数调整。当考虑其他标准,例如全局模型的公平性和鲁棒性时,这变得更加具有挑战性。相反,在DL中,对于本地个性化来说更自然:主要挑战是为每个设备的特定任务而不是全局一致性优化邻居消息的聚合。最近,CGA [7]在非IIDDL中考虑了每个节点的可学习混合权重,并找到了与其邻居梯度正相关的下降方向。然而,这并没有直接优化个性化性能,并引入了额外的约束。此外,聚合仅针对预定义拓扑上的一组固定节点/任务进行学习,因此无法推广到新添加的设备或未见任务。在本文中,我们进一步迈向更自动化和自适应的个性化本地模型的分散学习。为此,我们学习了一种聚合方案,即“学会协作(L2C)”,它自动加权并混合邻居的消息,以便在本地任务/数据上获得更好的性能。与FL/DL类似,我们在每个节点上的本地模型训练和邻居模型更新的聚合之间交替进行。受到元学习的启发,我们将这个问题形式化为通过每轮加权聚合后的本地模型的验证损失最小化。L2C仅基于验证损失优化混合权重,因此每个节点对其他节点的任务或数据分布是不可知的,以更好地保护其隐私。实证上,L2C学习到的混合权重可以忠实地反映出两个节点是否具有相似的任务和/或数据分布,因此在实践中通常是稀疏的。此外,它们在早期阶段迅速收敛,因此我们可以利用它们的稀疏性来创建稀疏的网络拓扑,这可以大大节省其余训练的通信成本。然而,L2C学习到的混合权重与一组预定义的节点/任务相关联,因此无法适应新的节点/任务或数据分布。为了避免为新节点从头开始优化混合权重,我们提出了元L2C,它学习了一种注意机制,以根据0节点及其邻居的模型。与元学习类似,我们可以在一组具有不同任务的节点上训练元L2C,然后将其应用于新的节点/任务组合,而无需重新训练或微调。因此,预训练的元L2C可以在训练开始时准确捕捉任务相似性的稀疏拓扑结构的混合权重,进一步提高L2C的训练和通信效率。我们在图1中总结了L2C和元L2C的主要框架,两者都只需要轻量级模型。在三个基准数据集的实验中,L2C和元L2C始终优于具有和不具有个性化或数据异质性特定设计的FL/DL方法。我们进一步展示了元L2C在转移到未见任务或数据时的良好泛化性能。此外,我们通过案例研究进行了实证分析,展示了L2C/元L2C可以生成准确捕捉节点之间任务相关性的混合权重和用于高效通信的稀疏拓扑结构。此外,我们还通过实证分析了L2C/元L2C对训练/验证划分和通信轮数/预算的敏感性。02. 相关工作0联邦学习(FL)[29]通过在每个节点上交替进行本地(随机)梯度下降和在服务器端聚合本地模型来训练各个节点/客户端上的全局模型,作为全局模型的更新。先前的研究发现,在数据分布在设备上不相同的非IID设置中,FL的性能会下降,无论是从经验上[13]还是从理论上[16]。此外,统计异质性削弱了全局模型在某些节点的本地任务上的性能,并导致节点之间的公平性差[22]。已经研究了几种策略来解决这个非IID的挑战:(1)修改模型聚合,例如通过知识蒸馏[27],对聚合进行聚类和采样低方差更新[10],贝叶斯重构[4],在聚合之前匹配不同模型的神经元/通道[35],选择具有代表性梯度信息的多样子集的客户端[2]等等;(2)通过近端项对本地目标进行正则化[1,21]。这些方法侧重于改进全局模型以更好地适应非IID分布,但它们并不旨在为每个节点生成个性化模型,这是近期文献中越来越受到关注的一个开放挑战。当每个节点没有足够的数据来单独训练个性化模型时,它仍然可以通过FL中的全局模型利用其他节点的知识。各种方法明确地在FL中为每个节点优化个性化模型:(1)优化公式在全局模型和本地个性化之间进行权衡[20,33];(2)本地节点的聚类[11,31,37]并在每个簇内应用聚合;(3)个性化本地模型的某些层[23,25,5];(4)将全局视图的数据知识蒸馏到本地模型训练中[42];(5)将全局模型训练为本地模型的初始化[8]或生成器[32],或者(6)发送原型[34]以规范本地模型的训练。大多数方法训练一个所有节点共享的全局模型,并同时优化每个节点的本地模型,因此几乎不可避免地在全局目标和本地目标之间进行权衡,导致对本地客户端的数据分布产生次优的个性化模型。Initializeθs steps ofθi12i− α∇θL(θt+ 12i; Dtraini),(1)followed by an aggregation step that updates θt+ 12iwith acombination of model updates ∆θtj ≜ θtj − θt+ 12jsent fromits neighbor nodes N(i), i.e.,Aggregation θt+1i= θt+ 12i(i)wi,j∆θtj(i)wi,j∆θtj,(2)97680模型,即批归一化层[23]、浅层[25]、本地头[5];(4)将全局视图的数据知识蒸馏到本地模型训练中[42];(5)将全局模型训练为本地模型的初始化[8]或生成器[32],或(6)发送原型[34]以规范本地模型的训练。大多数方法训练一个所有节点共享的全局模型,并同时优化每个节点的本地模型,因此几乎不可避免地在全局目标和本地目标之间进行权衡,导致对本地客户端的数据分布产生次优的个性化模型。0去中心化学习不假设存在中央服务器或明确的全局模型聚合,尽管其目标是所有本地模型朝着相同的模型达成共识。早期的研究将流言平均[3]与SGD相结合。在假设拓扑结构如双随机混合权重[15]的情况下,可以证明在对等通信迭代后,所有本地模型都会收敛到一个“共识模型”[24]。尽管在IID设置中它们显示出有希望的性能,但[13]指出它们在非IID场景中会遭受严重的性能退化。为了解决这个问题,[26]将去中心化SGD的动量项修改为适应异构数据;[13]用层归一化替换批归一化以避免模型发散。[17]将节点分配给簇,但仍需要假设每个簇内的节点共享相同的任务和分布,这在一般的异构设置中可能不成立。[7]找到每个节点接近其局部梯度且与其邻居的梯度正相关的下降方向,从而消除了异构引起的冲突。这些方法仍然专注于实现全局共识模型,这可能对每个本地任务来说都不是最优的。此外,各种方法需要频繁地通信和聚合本地梯度(例如,每一步),而FL允许在聚合之间进行多个本地epoch。由于FL/DL中的许多工作旨在训练全局模型或在所有节点上达成共识,因此它们的本地个性化必须在全局目标和本地任务之间进行权衡。相反,我们只关注在DL设置中个性化本地模型,并研究如何聚合邻居的梯度以改进每个节点的模型以适应其自身的任务和数据分布。受元学习(如MAML[9])的启发,我们通过找到最小化每个节点上验证损失的邻居混合权重来探索“学习协作”的思想,这与元学习中在图上关联不同任务[28]和多任务学习[41]的直觉相似。与采用MAML思想的DL方法相比,例如训练元模型作为本地模型的初始化[8]或生成器[32],我们的元模型是混合权重矩阵或其生成器,这更加0轻量级、更易于训练且泛化能力更强。03. 学习协作0在本节中,我们开发了一种分散学习方法“学习协作(L2C)”,通过加权聚合邻居节点的模型更新来更新每个节点的个性化模型。与FL/DL类似,L2C在本地更新和模型聚合之间交替进行。与FL/DL不同,L2C中聚合的混合权重是可学习和动态的,而不是预定义和固定的。此外,每个节点仅与其邻居协作以改进其本地模型,因此不需要在全局一致性和个性化之间进行权衡。我们将问题定义为最小化每个节点上个性化模型在验证集Dvali上的验证损失。虽然L2C直接优化一组固定节点/任务的混合权重,但我们进一步提出了元L2C,它可以通过注意机制自动分配给定节点/任务的模型的混合权重。我们详细阐述L2C和元L2C的算法,然后分析它们的通信和计算复杂性。03.1. 个性化模型的分散学习0我们研究了K个本地节点/设备的非IID设置,每个节点i∈[K]都有自己在数据分布Di上定义的任务,该任务与其他节点的任务不同。每个节点i都有一个私有数据集Di,可以将其分为训练集Dtraini和验证集Dvali。在各种实际场景中,每个节点都没有足够的数据仅凭自身训练可靠的本地模型。它不能利用其他节点的数据,因为涉及隐私问题,但通常允许通信模型和梯度。按照分布式学习中的类似协议,我们在每个节点上在本地(随机)梯度步骤和来自邻居节点的模型更新的聚合步骤之间交替进行。具体而言,在第t轮,每个设备i的本地学习从θti开始,并运行s步梯度下降来最小化其训练损失L(θi;Dtraini),即0i 2 ← θt i,0= θt i − �0其中混合权重wi,j可以解释为节点j对节点i的“协作得分”。minαi L(θt+1i; Dvali), wi,j =exp(αi,j)ℓ∈i∪N (i) exp(αi,ℓ),(3)f(θi, θj) = ⟨E(θt+ 12i− θ0i ; α), E(θK976903.2. “学习协作”与可学习的混合权重0与在FL或DL中预定义的混合权重wi,j不同,其目标是使所有客户端i∈[K]的θti收敛到一个共识全局模型,而IID分布下,我们训练混合权重以获得更好的个性化性能。特别地,我们的目标是找到混合权重,使得聚合模型θt+1i在每个客户端i∈[K]的Dvali上最小化验证损失,即0其中wi中的混合权重是通过可学习参数αi通过softmax函数计算得出的。直观上,如果客户端i和客户端j的任务和数据分布相似,则wi,j应该较大。然而,在各种实际设置中,这种相似性通常是事先未知的,并且很难在没有数据共享或准确的相似性度量的情况下进行估计。因此,我们提出了一种“学习协作(L2C)”框架,以端到端的方式学习混合权重。特别地,L2C在更新/聚合本地模型(即方程(1)-(2))和优化混合权重(即方程(3))之间交替进行。因此,混合权重可以通过多轮模型聚合进行训练,并收敛到准确反映客户端之间的“协作得分”的值。与FL/DL的训练成本相比,我们只需要优化K2个额外参数,因此L2C在每轮中不会引入任何显著的额外计算。03.3. 将“学习协作”作为元学习器0尽管L2C在参数化混合权重方面很简单,但它缺乏为不同的训练阶段或具有未见任务的新客户生成自适应混合权重的灵活性和能力。例如,客户端的最相似邻居在早期阶段可能被分配最大的混合权重,但由于过度利用,它们的改进可能在后期减弱。另一方面,实践中常常会动态地向网络中添加具有未见任务的新节点,因此为固定客户端集优化的混合权重无法推广到这些新客户端。受元学习思想的启发,我们进一步研究了一个学习产生适应于训练阶段、新客户模型或未见任务的混合权重的meta-L2C模型。具体而言,meta-L2C由模型权重的编码器和注意力模块组成,其中前者产生局部模型的紧凑表示,后者根据表示之间的成对相似性计算混合权重。特别地,我们根据可学习的相似度 f(θ i, θ j)计算混合权重 w i,j,即0w i,j = exp(f(θ i, θ j)) � ℓ ∈ i ∪N(i) exp(f(θ i, θℓ)),(4)0根据点积注意力的定义,f(θ i, θ j) 可以计算为编码器 E(∙; α)产生的 θ i 和 θ j 的表示之间的内积。具体而言,在第 t轮的局部更新(公式(1))之后和聚合(公式(2))之前,我们计算表示的内积0i 2 − θ 0 i ; α),它取决于 θ i 自初始化 θ 0 i以来的变化。我们去除 θ 0i,因此编码器的输入主要由过去训练轮次上计算的(随机)梯度在数据上确定。因此,第 t 轮的 f(θ i, θ j) 定义为0j 2 − θ 0 j ; α) � . (5)0然后,我们通过聚合其邻居的模型更新(公式(2))和由公式(4)中的注意力模块产生的混合权重来更新每个局部模型。与L2C类似,我们最小化聚合模型的验证损失 {θ t i} K i=1来训练meta-L2C模型,即0min E(∙;α) 1 K0i =1 L (θ t +1 i; D val i) . (6)0在实践中,DNN通常包含数百万到数十亿个参数,这会显著增加 E(∙; α)的输入维度和模型大小。对于结构化的DNN,例如卷积神经网络,我们可以采用通道共享策略,并将相同的编码器应用于同一层的每个通道的参数。具体而言,我们将 El(∙),例如一个两层全连接网络,应用于第 l层的每个滤波器,并将同一层的所有 C个滤波器的输出嵌入连接起来,即0ϕ l = [E l(θ l, 1), E l(θ l, 2), ∙ ∙ ∙ , E l(θ l, C)],(7)0其中 θ l,j 是第 l 层的滤波器/通道 j 的参数。整个模型 E(θ)的表示将所有 L 层的嵌入连接起来,即0E(θ) = [ϕ 1, ϕ 2, ∙ ∙ ∙ , ϕ L] . (8)03.4. L2C和meta-L2C的算法0我们在算法1中给出了L2C和meta-L2C的完整算法:它们共享大多数过程,除了突出显示的步骤。每个算法在局部模型更新(第6-11行)和模型聚合(第15-16行)之间交替进行,其中聚合权重由L2C或meta-L2C在第13-14行产生。我们通过(随机)梯度下降(第18行)来解决公式(3)和公式(6)中的优化问题。在第T0轮结束时,我们尝试删除每个节点中具有最小混合权重的前K0个邻居,以便为将来的训练轮次节省通信成本创建稀疏拓扑结构。θ2i← θ2i− α∇θL(θ11∆θtiθtiθt+ 12i, ∆θtiθ..................Device1(N classes)Device (N classes)MNMPDevice K= N(N classes)Device 1(N classes)MN +Communication costThe communication cost of L2C isO(msNb), where ms is the number of edges on the topologyand Nb is the model size, so the sparse topology in line 21reduces the cost. On the other hand, meta-L2C needs extracommunication cost for sending/receiving ∆�θi in line 11 andfor AllReduce in line 24 of Algorithm 1: the former’s cost isO(msNb), while the latter’s cost can be much smaller if theaverage number of channels per layer ¯c is large and the outputdimension d of El( ) is small, e.g., for Ring-AllReduce [12]Implementation of L2C and meta-L2C modelsWe ap-ply a lightweight fully connected network of two layers with97700算法1:L2C和meta-L2C01输入α,β,邻居集合{N(i)}Ki=1,{Dtraini}Ki=1,{Dvali}Ki=1,S,T,T0,K002 输出{θTi}Ki=13初始化{θ0i}Ki=1和{αi}Ki=14 对于t =0:T do 5 对于设备i = 1:K并行执行06 // 本地SGD更新0i2 ← θti8 对于本地SGD步骤m = 0:S do0i2; Dtraini)010 结束0i2 − θ0i012 // 计算混合权重013 wi,j ← exp(αi,j) �0ℓ∈i∪N(i)exp(αi,ℓ)014 wi,j ← exp(f(∆�θti, ∆�θtj))0�0ℓ∈i∪N(i)exp(f(∆�θti, ∆�θtℓ))016 θt+1i ← θti − �0j∈N(i) wi,j∆θtj017 // 更新L2C/meta-L2C参数018 αi ← αi − β�αiL(θt+1i; Dvali)019 // 删除稀疏拓扑的边20 如果t == T0 then021对于每个设备i,移除具有最小wi,j的K0个邻居j∈N(i)22结束23 结束024 αi ← AllReduce(αi)025 结束0组1 P ... ...0类别1 类别2 类别3 类别M0(a)0(b)0(c)01 2 ... P01 2 3 M0随机洗牌0随机洗牌0随机洗牌01 2 3 M0设备10(N个类别)0设备0(N个类别)0MN0MP 设备 K = N(N个类别)0设备 10(N个类别)0M N+0图2.我们实验中非独立同分布任务的生成。给定一个包含M个类别的数据集,每个类别有P个数据分片,我们的目标是绘制K = MP/N个任务,每个任务在N 100 rounds), thesame as our methods, except FedAvg which needs more (i.e.,> 1000) epochs to converge. For fair comparisons, we keeptheir communication cost per node and local epochs in eachround to be no smaller than that of our methods. For FLbaselines, the communication happens between the globalserver and clients, so we randomly select 10% clients foraggregation and apply 5 local epochs per client in each round.For DL baselines, i.e., DPSGD and CGA, we let every devicecommunicate with about 10% nodes in every round. Sincethey originally propose to only run one local SGD step perround on a single mini-batch, we evaluate them with twosettings, i.e., one local step per round and 5 local epochs perround, and we apply more rounds for the former to matchthe total local epochs (i.e., 500 epochs) of other methods. Tomatch the communication cost of our methods, we extend thering and bipartite topology used in previous DL works [7] toincrease the number of neighbors for each node. Specifically,we study (1) a “group-ring” topology that connects two nodesi and j if |i − j| ≤ (K−K0)2or K − |i − j| ≤ (K−K0)2; and(2) a generalized bipartite topology that randomly partitionall nodes into two groups and then connect each node in agroup to K − K0 = 10 nodes randomly drawn from theother group. In our experiments, they both outperform theiroriginal versions with fewer neighbors and communications.Hence, in the following, we always report the best resultamong all the four types of topology for each DL baseline.Training HyperparametersIn all methods, for localmodel training, we use SGD with learning rate of 0.01,weight decay of 5 × 10−4, and batch size of 10. For otherhyperparameters of baselines, we use the values proposed intheir papers except the learning rate, which is kept constantand is tuned/selected as the best validation accuracy amongMethodCIFAR-10CIFAR-100MiniImageNetLocal SGD only87.50±1.3755.47±2.0841.59±2.56DPSGD(s=1 step)83.01±1.3140.56±1.2430.26±2.39DPSGD(s=5 epochs)75.89±1.4435.03±1.3928.41±2.23CGA(s=1 step)65.65±2.3730.81±3.8227.65±3.10CGA(s=5 epochs)divergedivergedivergeFedAvg70.65±3.8840.15±4.0134.26±4.44FOMO88.72±0.2952.44±0.7044.56±0.77Ditto87.32±0.6954.28±0.5742.73±1.21L2C(ours)90.14±0.3459.00±0.4250.03±0.75meta-L2C(ours)92.10±0.7258.28±1.2648.80±1.42Table 2. Test accuracy (mean±std) of 100 local models on non-IID tasksproduced by Fig. 2. L2C and meta-L2C outperform all FL/DL baselines.010005005060708090local SGD onlymeta-L2CL2CFOMODittoCGA(s=1 step)DPSGD(s=5 epochs)DPSGD(s=1 step)010005000.000.250.500.751.001.251.501.75al SGD onlymeta-L2CL2CFOMODittoCGA(s=1 step)DPSGD(s=5 epochs)DPSGD(s=1 step)[0.01, 0.05, 0.1].97710总本地轮数0测试准确率0测试0总本地轮数0训练损失0训练0图3.CIFAR-10上总本地轮数与测试准确率和训练损失(均值±标准差)的关系。L2C和meta-L2C比FL/DL基线更快地收敛到更好的测试/训练性能。所有方法运行100轮通信,除了CGA(s=1步)和DPSGD(s=1步),它们每个本地SGD步骤进行一次通信。FedAvg需要>1000轮才能收敛,因此没有包括在内。04.1. 主要结果0本地测试准确率和收敛性。在表2中,我们报告了100个节点在分配的非IID任务上的所有模型的测试准确率。L2C和meta-L2C在三个数据集和不同的随机非IID划分上都明显优于所有FL/DL基线。对于基线方法,我们注意到那些仅针对全局共识模型而不鼓励本地模型个性化的方法,如FedAvg、DPSGD和CGA,在性能上甚至比仅关注个性化的简单“仅本地SGD”方法表现更差。Ditto和FOMO在全局共识和本地目标之间进行权衡,FOMO与我们的方法具有类似的个性化目标(本地验证损失),它们的性能优于其他基线方法,但仍然不及我们的方法。在图3中,我们展示了所有方法的测试准确率和训练损失的收敛情况:尽管FOMO和仅本地SGD也收敛得很快,但meta-L2C在测试准确率上实现了最快的收敛。0学习到的混合权重和拓扑结构。在图4a-4b中,我们报告了L2C和meta-L2C在通信轮数上产生的混合权重,这是一个更简单的非IID设置,其中存在一组被分配相同任务的节点。结果显示,我们的方法可以快速识别相同任务的节点,并在聚合中给予它们更大的混合权重,从而产生更好的个性化模型。151015151015Round0151015151015Round1151015151015Round2151015151015Round10151015151015Round0151015151015Round1151015151015Round2151015151015Round10151015151015Round0151015151015Round1151015151015Round2151015151015Round10150100150100150100150100150100150100150100150100150100150100150100150100150100150100150100150100raygirlrocketbridgemotorcyclemountaintableorangePine treeporcupinemountaingirlrocketporcupineforestleopardchairtelephonetigerplainchairhousecloudgirlWillow treebusrocketbutterflyStreetcarelephantsharkshrewlizardspidercancattleorchidcrocodilecupelephant10.187kgw=20.196kgw=3kgw=12 shared classess7 shared Dgparenet c laicessev24 shared classesDevice g30 shared classesDevice gwolffoxwormhamster Aquarium_fishwomanLawnmowerbutterflyPine treedinasourfoxhamsterwomanbutterflyappleforestbuschimpanzeepoppyPalm treewomanLawnmowersharkcaterpillartigerpossumcrabbridgemountain sunflowerorangeorchidkey
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 十种常见电感线圈电感量计算公式详解
- 军用车辆:CAN总线的集成与优势
- CAN总线在汽车智能换档系统中的作用与实现
- CAN总线数据超载问题及解决策略
- 汽车车身系统CAN总线设计与应用
- SAP企业需求深度剖析:财务会计与供应链的关键流程与改进策略
- CAN总线在发动机电控系统中的通信设计实践
- Spring与iBATIS整合:快速开发与比较分析
- CAN总线驱动的整车管理系统硬件设计详解
- CAN总线通讯智能节点设计与实现
- DSP实现电动汽车CAN总线通讯技术
- CAN协议网关设计:自动位速率检测与互连
- Xcode免证书调试iPad程序开发指南
- 分布式数据库查询优化算法探讨
- Win7安装VC++6.0完全指南:解决兼容性与Office冲突
- MFC实现学生信息管理系统:登录与数据库操作
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功