模型剪枝中的预训练权重真的有用么?重新思考模型剪枝的价值

news2025/3/11 3:30:29

在这里插入图片描述

论文地址:https://arxiv.org/pdf/1810.05270.pdf
发表时间:2019年3月5日
相关笔记:https://blog.csdn.net/qq_19784349/article/details/107202447

Liu等人的多项实验结果表面对剪枝模型进行微调只能提供比使用随机初始化权值训练该模型相当或更差的性能。对于假设有一个预定义的目标网络体系结构的剪枝算法,我们可以摆脱完整的pipeline,直接从头开始训练目标网络。我们观察多个网络架构、数据集是一致的,这意味着:

  • 1)训练大型,过度参数化模型通常不是一个有效的最终模型 在imagenet上的模型迁移到私域数据中存在较多的冗余
  • 2)学习到的大模型的“重要”权重,在较小的剪枝中是没有价值的 只有在剪枝比例比较高时,预训练权重才是占优势的
  • 3)修剪架构本身,而不是一组继承的“重要的”权重,对最终模型的效率更重要,修剪作为一个限定检索范围的轻量化模型结构搜索范式是有用的。

我们的研究结果表明,在未来的结构化修剪方法的研究中,需要更仔细的基线评估。我们还与“彩票假说”(Frankle & Carbin,2019)进行了比较,发现在最佳学习率下,弗兰克kle&Carbin(2019)中使用的“中奖彩票”初始化并没有比随机初始化带来改善。这里主要表明初始学习率对训练效果的影响,使用sgd,lr=0.1训练效果好于0.01;这里只在cifar10数据上对比,仅表明在易数据上,loss线鞍部较多,使用大学习率更容易跳出鞍部

本文主要表明,在小数据集上(分类数较少),使用imagenet预训练后的重参数模型去迁移训练再剪枝是没有必要的,不如直接去训练轻量化模型;在任务难度较大时(分类数较多时),可以剪枝过程中得到的预训练权重才能发挥一定程度的价值。 现有的论文中,剪枝之所以有用,是因为对不使用预训练权重的剪枝结构训练不到位

1、模型剪枝

1.1 剪枝定义

过度参数化是深度神经网络中一个被广泛存在的情况,这导致了高计算成本和高推理内存占用。在低资源环境下,网络剪枝被广泛用于降低深度模型的推理成本。典型的网络剪枝过程包括三个阶段: 1)训练一个大型的、过参数化的模型(有时有预训练后的模型),2)根据一定的标准对训练后的大型模型进行剪枝,3)对剪枝后的模型进行微调,以恢复失去的性能。
在这里插入图片描述

网络剪枝方法的一个主要分支是个体权重剪枝(非结构化剪枝),该方法基于权重对结果的贡献进行剪枝(如L1、L2范数等)。然而,这些非结构化剪枝方法的一个缺点是,由此产生的权重矩阵是稀疏的,如果没有专用的硬件,这就不能达到压缩和加速的效果。

网络剪枝方法的另一个分支是结构化修剪方法,该方法会在通道甚至层的级别上进行修剪。由于网络的基本结构仍然被保留下来,因此不需要专门的硬件/库来实现其好处。在结构化剪枝方法中,通道剪枝是最流行的,因为它在最细粒度的级别上运行,同时仍然适合传统的深度学习框架。还有一些启发式方法,基于训练后的权重信息按照剪枝目标从原始模型中遴选出预训练权重。结合本文的观点,结构化剪枝,是不需要预训练权重的。

1.2 剪枝理论依据

一般来说,在这个修剪过程背后有两个共同的信念。首先,我们认为从训练一个大型的、过度参数化的网络开始是重要的,因为它提供了一个高性能模型(由于更强的表示和优化能力),可以安全地删除一组冗余参数,而不显著影响精度

人们通常认为这优于直接从头开始训练更小的网络。其次,修剪后的体系结构训练后的权重是重新训练好小模型的关键。因此,很多剪枝方法都在研究如何删除冗余权重,保留重要权重

1.3 剪枝真的必要么?

基于对具有多个网络架构的多个数据集上最先进的剪枝算法的广泛的经验评估,观察到以下两种现象。

  • 首先,对于具有预定义目标网络架构的结构化剪枝方法(图2),直接从随机初始化中训练小目标模型可以实现与从三阶段管道中获得的模型相同的性能,如果不是更好的话。在这种情况下,不需要从一个大型模型开始,而是可以直接从头开始训练目标模型。
    在这里插入图片描述

  • 其次,对于具有自动发现目标网络的结构化剪枝方法,从头开始训练剪枝后的模型也可以获得比微调相当甚至更好的性能

以上结论表明,模型剪枝中最为重要的是剪枝后的结构,而非预训练的权重,这里其实也间接性证明了结构化剪枝是正确的。 应该将模型剪枝研究的重心放到结构遴选,而非预训练权重。

本文实验还发现非结构化修剪方法的预训练权重在大规模数据集上是有用的,但小规模数据集上没有先验优势。这其实是由剪枝方法所确定的,结构化剪枝,重点在于结构;而非结构化剪枝,重点在于权重,其破坏了结构的优雅性,从而使的没有预训练权重的模型更难被优化。

2、研究方法及数据

2.1 剪枝方法说明

结构化剪枝:目标剪枝模型的体系结构可以由人(即预定义的结构化修剪)或剪枝算法(即自动结构化剪枝)来确定。

当人类预先定义目标体系结构时,一个常见的标准是在每一层中要修剪的通道的比率。例如,我们可能希望在VGG的每层中删除50%的通道。在这种情况下,无论哪些特定的通道被修剪,剪枝后的目标体系结构都保持不变,因为剪枝算法只在局部修剪每一层中最不重要的50%的通道。在实践中,每一层的比例通常是通过实证研究或启发式来选择的。

当目标架构由剪枝算法自动确定时,它通常基于剪枝标准,该准则全局比较跨层的结构(例如,通道)的重要性。

非结构化剪枝 也属于自动方法的类别,其中剪枝权重的位置是由训练过程和剪枝算法决定的。

使用Scratch-E来表示训练相同epoch的修剪模型,
使用Scratch-B表示相同计算预算的训练(在ImageNet上,如果修剪模型节省的FLOPs超过2倍,则将训练epoch的数量增加一倍)

2.2 预定义的结构化修剪

基于l1-范数的滤波器剪枝 是关于卷积网络的滤波器/信道剪枝的最早的工作之一。在每一层中,有一定比例的l1-范数较小的滤波器将被修剪。表1显示了我们的结果。“修剪模型”列显示了预定义目标模型的目标模型列表。我们观察到,在每一行中,经过Scratch训练的模型至少达到了与微调模型相同的精度水平,在大多数情况下,Scratch-b略高于Scratch-e。在ImageNet上,两种Scratch-B模型都明显优于微调模型

在这里插入图片描述
ThiNet方法贪婪地修剪对下一层激活值影响最小的通道。如表2所示,对于VGG-16和ResNet-50,Scratch-e和Scratch-b几乎总是可以比微调模型获得更好的性能,通常有很大的优势。唯一的例外是VGG-Tiny的Scratch-e,模型从VGG-16(流量减少了15×),因此大大减少了Scratch-e的训练预算。该模型的Scratch-B的训练预算也比原来的大模型小7倍,但它可以达到与微调模型相同的精度水平。
在这里插入图片描述

基于回归的特征重建方法 通过最小化下一层的特征图重建误差来修剪信道。与ThiNet(Luo et al.,2017)相比,该优化问题是通过套索回归来解决的。结果如表3所示。同样,就大型模型的相对精度下降而言,scratch训练模型比微调模型更好。
在这里插入图片描述

2.3 自动结构化剪枝

Network Slimming 在训练过程中,对批处理归一化层(Ioffe&szeged,2015)的通道级比例因子施加l1稀疏性,然后对较低比例因子进行修剪。由于信道缩放因子是跨层比较的,这种方法产生自动发现的目标体系结构。如表4所示,对于所有的网络,从头开始训练的小模型可以达到与微调模型相同的精度。更具体地说,我们发现Scratch-B始终优于(10个实验中的8个),而Scratch-E略差,但仍主要在标准偏差范围内。

在这里插入图片描述
Sparse Structure Selection 也使用稀疏缩放因子来修剪结构,可以看作是网络瘦身的泛化。除了渠道之外,可以是ResNet或ResNeXt组中的剩余块(Xie等人,2017)。我们检查了残差块的剪枝,其中ResNet-50被剪枝为ResNet-41、ResNet-32和ResNet-26。表5显示了我们的结果。平均而言,Scratch-E优于修剪模型,并且对于所有模型,Scratch-B优于两者。
在这里插入图片描述

2.4 基于非结构化大小的修剪

基于非结构化大小的权值剪枝(Han et al.,2015)也可以被视为自动发现架构,因为在训练之前不能确定精确的零的位置,但我们强调了它与使用另一个分段的结构化剪枝的差异。因为我们评估的所有网络架构都是全卷积的(除了最后一个全连接层),为了简单起见,我们在这里只在卷积层中删除权值。在从头训练修剪后的稀疏模型之前,我们根据该层中保留多少非零权值,重新缩放权重初始化的高斯分布的标准差。这是为了保持反向梯度信号的尺度不变,如(He et al.,2015),然而,在我们的观察中,与未放尺度的同行相比,这并没有带来收益。 “剪枝比”表示在所有卷积权值集中剪枝的参数的百分比。
在这里插入图片描述
在较小规模的CIFAR数据集上,当修剪的比例较小(≤80%)时,Scratch-e有时不如微调的结果,但Scratch-b的性能至少与后者相当。然而,我们观察到,在某些情况下,当修剪率很大(95%)时,微调可以从头开始优于训练。在大规模ImageNet数据集上,我们注意到,尽管具有良好的精度水平,但Scratch-b结果大多比微调的结果差。这可能是由于在高度稀疏网络(CIFAR)上进行直接训练的难度增加,或者是数据集本身的规模/复杂性(ImageNet)。另一个可能的原因是,与结构化修剪相比,非结构化修剪后重量分布发生了显著的变化.(详见附录F)。Scratch-训练行为的差异也表明了结构化修剪和非结构化修剪之间的重要差异。
在这里插入图片描述

3、网络修剪作为架构搜索

虽然前面的实验已经证明,对于结构化剪枝,剪枝架构中所继承的权值并不比随机的好,但剪枝的体系结构本身就带来了精度/性能的提升。在本节中,我们通过比较通过剪枝获得的模型和一致剪枝的模型来评估自动网络剪枝算法的架构搜索的价值。

Parameter Efficiency of Pruned Architectures. 在图3(左)中,我们比较了通过自动通道剪枝方法(网络修剪(Liu et al.,2017))获得的架构的参数效率,与一种简单的预定义剪枝策略,该策略统一地修剪每一层中相同百分比的通道。所有的架构都是从随机初始化的相同数量的时期中训练出来的。我们可以看到,通过Network slimming获得的架构更有效,因为它们可以使用比统一剪枝架构少5×的参数达到相同的精度。对于基于宽度的非结构化剪枝(Han et al.,2015),我们进行了一个类似的实验,如图3(右)所示。在这里,我们以固定的概率均匀地稀疏所有单独的权值,并且通过这种方法获得的架构比修剪后的架构效率要低得多。
在这里插入图片描述

我们还发现,通道/权重修剪的体系结构表现出非常一致的模式(见表7和图4)。这表明,原始的大型模型可能是为任务冗余地设计,该剪枝算法可以帮助我们提高工作效率。这也证实了自动剪枝方法对于在所评估的架构上搜索高效模型的价值。

在这里插入图片描述

然而,也存在一些情况,通过剪枝获得的架构并不比均匀修剪的好。我们在图5中展示了这样的结果,其中通过剪枝(蓝色)获得的体系结构并不比统一剪枝体系结构(红色)更有效。这种现象更可能发生在现代架构上,如ResNet和DenseNet。当我们研究这些剪枝架构的稀疏模式时(如附录G中的表18、19和20所示),我们发现它们在各个阶段中表现出接近一致的稀疏模式,这可能是它只能与均匀剪枝相同的原因。相比之下,对于VGG,修剪后的稀疏性模式总是可以优于如图3和图6所示的均匀模式。我们还在附录G的表21中显示了通过网络修剪修剪的VGG(Liuetal.,2017)的稀疏性模式,它们远非均匀。与ResNet和DenseNet相比,我们可以看到VGG的冗余在跨层阶段之间是相当不平衡的。网络剪枝技术可以帮助我们在这种情况下更好地识别冗余

在这里插入图片描述
在这里插入图片描述

Generalizable Design Principles from Pruned Architectures. 鉴于自动发现的体系结构在VGG网络上往往是参数有效的,人们可能会想知道:我们能从它们中推导出如何设计一个更好的体系结构的通用原则吗?我们做了几个实验来回答这个问题。

对于网络瘦身,我们使用来自剪枝体系结构的每个层阶段(具有相同特征映射大小的层)的平均通道数来构建一组新的体系结构,我们称这种方法为“引导剪枝”;对于基于大小的剪枝,我们分析了在修剪后稀疏性模式。并应用它们构造一组新的稀疏模型,我们称之为“引导稀疏化”。结果如图6所示。可以看出,对于网络修剪(图6左)和非结构化剪枝(图6右),体系结构的引导设计(绿色)可以与剪枝体系结构(蓝色)相当。
在这里插入图片描述
有趣的是,这些被引导的设计模式有时可以转移到不同的VGG变体和/或数据集。在图6中,我们从CIFAR- 10上的VGG-16中提取了修剪过的架构的模式,并将其应用于在CIFAR-100上设计高效的VGG-19。这些架构集被表示为“转移引导修剪/稀疏化”。我们可以观察到,它们(棕色)有时可能比直接修剪的结构(蓝色)稍差,但明显优于均匀修剪/稀疏化(红色)。在这些情况下,我们也不需要训练一个大型模型来获得一个有效的模型,因为转移的设计模式可以帮助我们直接实现效率。

与传统架构搜索方法的探讨 网络架构搜索技术包括强化学习(Zoph & Le,2017;Baker等人,2017)和进化算法(Xie & Yuille,2017;Liu等人,2018a)。在每次迭代中,对一个随机初始化的网络进行训练和评估来指导搜索,搜索过程通常需要数千次迭代才能找到目标体系结构。相比之下,使用网络剪枝作为架构搜索只需要一次训练,但搜索空间被限制在一个大型网络中所有“子网”的集合中,而传统的方法可以搜索更多的变化,如激活函数或不同的层序。

最近,Gordon等人(2018)使用了类似于网络瘦身(Liu等人,2017)来自动化网络架构的设计;He等人(2018c)使用强化学习对通道进行修剪,并自动压缩体系结构。另一方面,在网络架构搜索文献中,共享/继承训练参数(Pham et al.,2018;Liu et al.,2018b)已经成为减少训练预算的流行方法,但一旦找到目标架构,仍需要从头开始训练,以提高准确性。

4、关于彩票假说的实验

彩票假说(Frankle & Carbin,2019)推测,在大型网络中,一个子网络及其初始化使得训练特别有效,它们一起被称为“winning ticket”。在这个假设中,需要子网络的原始初始化(在大型模型训练之前),才能在隔离训练时实现竞争性能。实验表明,在大网络中,用随机重新初始化的权值来训练子网络比用原始初始化来训练子网络的效果更差。相比之下,我们的工作不需要重用剪枝模型的原始初始化,并表明·随机初始化足以使剪枝模型实现竞争性能·。

结论似乎是矛盾的,但在评估设置中有几个重要的差异:

  • a)我们的主要结论是根据结构化修剪方法得出的,尽管对于小规模问题(CIFAR),它也适用于非结构化修剪;Frankle & Carbin(2019)只评估非结构化剪枝。
  • b)我们评估的网络架构都是原始剪枝方法中使用的相对较大的现代模型,而Frankle & Carbin(2019)中的大多数实验使用小型浅层网络(< 6层)。
  • c)我们使用较大初始学习率 SGD(动量 0.1),广泛应用于之前的图像分类和修剪工作,是CIFAR和ImageNet事实上的默认优化设置;而弗朗克和卡宾(2019)主要使用学习率要低得多。
  • d)我们的实验包括大规模的ImageNet数据集,而弗兰克尔& Carbin(2019)只考虑了MNIST和CIFAR。

在本节中,我们展示了学习速率的差异是导致我们的工作与Frankle & Carbin(2019)之间看似矛盾的行为的原因,在CIFAR上的非结构化剪枝的情况下。对于结构化剪枝,当同时使用大的和小的学习率时,获胜的票证并不会优于随机初始化。
在这里插入图片描述

我们通过比较用原始初始化训练的模型(“中奖彩票”)和从随机重新初始化的权重训练的模型来检验彩票假设。我们实验使用两种选择的初始学习率(0.1和0.01)的逐步衰减计划,使用动量SGD。0.1在我们之前的实验和之前在CIFAR和ImageNet上的大多数工作中使用。 我们研究了迭代剪枝(在每次迭代中修剪20%)和非结构化剪枝的一次性剪枝。我们在图7和表9中显示了非结构化剪枝(Han et al.,2015)的结果,在表8中显示了基于l1-范数的过滤器剪枝(Li et al.,2017)
在这里插入图片描述
在这里插入图片描述
从图7和表9中,我们可以看到,对于非结构化剪枝,使用原始初始化(Carbin,2019),只提供了比初始学习率为0.01的随机初始化的优势。对于像Li等人(2017)这样的结构化剪枝,从表8可以看出,对于大小的初始学习率,使用原始初始化只能与随机初始化相当。在这两种情况下,我们可以看到,小的学习率比广泛使用的大学习率更低。总之,在我们的评估设置中,获胜者只在非结构化修剪的情况下进行改进,且初始学习率较小,但与广泛使用的大学习率相比,这种小的学习率产生的准确性较低。请注意,弗兰克尔& Carbin(2019)也在他们的第5节中报告说,使用高学习率,无法在ResNet-18/VGG上找到中奖彩票。当学习率较小时,原始初始化很有用的原因,可能是最终训练模型的权重由于参数更新步长较小而与原始初始化相差不远。

5、实验结论

我们的研究结果鼓励对结构化剪枝方法进行更仔细和更公平的基线评估。与传统的网络剪枝过程相比,从头开始训练预定义的目标模型还有以下优点:

  • a)由于模型较小,我们可以使用较少的GPU内存训练模型,可能比训练原始大模型更快;
  • b)不需要实现剪枝准则和程序,有时需要通过层进行微调,或者需要针对不同的网络架构进行定制;
  • c),我们避免调优剪枝过程中涉及的附加超参数。

我们的结果确实支持这样一种观点,即自动结构化剪枝在某些情况下可以找到有效的架构。然而,如果通过从头训练修剪后的模型可以实现剪枝和微调的准确性,那么根据统一剪枝基线(都是从头训练)来评估修剪后的架构也很重要,以证明该方法在识别高效架构方面的价值。如果统一修剪的模型不是更糟,我们也可以跳过管道,从头开始训练它们。

即使修剪和微调在准确性方面不能优于上述基线,在某些情况下,使用这种传统智慧可以比从头开始训练快得多: a)当一个预先训练过的大型模型已经提供,并且很少或没有训练预算;我们还注意到,只有当方法不需要对大型模型训练过程进行修改时,才能使用预先训练过的模型;b)需要获得多个不同大小的模型,或者不知道理想的大小,在这种情况下,人们可以训练一个大的模型,然后按不同的比例进行修剪。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1599057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 面试经典150题 202.快乐数

题目&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

基于arduino的ESP32上蓝牙midi音乐设备开发教程

目录 简介 开发环境 开发过程 函数介绍 相关文章 简介 首先看几个视频&#xff0c;大佬们做的东西&#xff0c;都是基于esp32。 自制卡林巴电子琴&#xff0c;可通过蓝牙连接手机库乐队 MIDI Boy【理科生的第一件乐器】_哔哩哔哩_bilibili 【Totoro】模仿“埙”的电子吹…

动态规划|01背包理论基础

卡码网 第46题 //二维dp数组实现 #include <bits/stdc.h> using namespace std;int n, bagweight;// bagweight代表行李箱空间 void solve() {vector<int> weight(n, 0); // 存储每件物品所占空间vector<int> value(n, 0); // 存储每件物品价值for(int i …

每帧纵享丝滑——ToDesk云电脑、网易云游戏、无影云评测分析及ComfyUI部署

目录 一、前言二、云电脑性能测评分析2.1、基本配置分析2.1.1、处理器方面2.1.2、显卡方面2.1.3、内存与存储方面2.1.4、软件功能方面 2.2、综合跑分评测 三、软件应用实测分析3.1、云电竞测评3.2、AIGC科研测评——ComfyUI部署3.2.1、下载与激活工作台3.2.2、加载模型与体验3.…

Java(120):使用Java对TiDB数据库批量写入数据

使用Java对TiDB数据库批量写入数据 1、前言&#xff1a; 本次对TiDB数据库测试需要1w条数据&#xff0c;如果MySQL可用存储过程造数&#xff0c;结果发现TiDB用不了。只能想其他办法&#xff0c;一种是Java直接批量插入&#xff0c;一种是Jmeter插入。这里用的Java插入。 如果…

最新常见的图数据库对比,选型,架构,性能对比

图数据库排名 地址&#xff1a;https://db-engines.com/en/ranking/graphdbms 知识图谱查询语言 SPARQL、Cypher、Gremlin、PGQL 和 G-CORE 语法 / 语义 / 特性SPARQLCypherGremlinPGQLG-CORE图模式匹配查询语法CGPCGPCGP(无可选)1CGPCGP语义子图同态、包 2无重复边、包 2子…

appium图像识别之images-plugin插件

在进行App自动化测试的过程中&#xff0c;由于页面的复杂性&#xff0c;需要根据页面的技术实现&#xff0c;通过上下文来切换不同的定位类型&#xff0c;给定位元素的稳定性带来了不小的挑战&#xff1b;图像识别技术则不依赖于页面本身是用什么技术实现的&#xff0c;只要能识…

Dubbo面试回答简单版

一、dubbo特性 超时重试机制地址缓存多版本负载均衡&#xff1a;随机、权重轮询、最少活跃调用、一致性哈希集群容错&#xff1a;失败重试、快速失败、失败安全、失败自动恢复、并行调用、广播服务降级&#xff1a;异常时返回mock 集群容错 FailOver 失败重试&#xff0c;读…

k8s基础入门

前言 开始学习K8S了&#xff0c;下面就是笔记整理 简介 k8s是谷歌开源得容器管理系统&#xff0c;主要功能包括 基于容器得应用部署&#xff0c;维护和滚动升级负载均衡和服务发现跨机器和跨地区得集群调度自动伸缩无状态服务和有状态服务广泛得Volume支持插件保持扩展性 …

【MySQL | 第六篇】数据库三大范式

文章目录 6.数据库设计三大范式6.1第一范式6.2第二范式6.3第三范式6.4反范式设计 6.数据库设计三大范式 6.1第一范式 第一范式&#xff08;1NF&#xff09;&#xff1a;确保每列的原子性(强调的是列的原子性&#xff0c;即列不能够再分成其他几列)。实际上&#xff0c;第一范式…

探索C++:深入了解这门古老而强大的编程语言

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践 文章目录 隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践1.业务背景&#xff1a;安全核对产生的土壤1.1相关政策出台1.2 数据差异的来源 2.产品方案&#xff1a;从试点到规模化的路3.技术共建&#xf…

RAKsmart:硅谷裸机云多IP服务器性能评测

在云计算领域&#xff0c;裸机云作为一种结合了传统物理服务器与云计算优势的服务模式&#xff0c;近年来备受关注。硅谷裸机云作为业界佼佼者&#xff0c;以其出色的性能和稳定性赢得了众多用户的青睐。今天&#xff0c;我们就来评测一下硅谷裸机云的多IP服务器性能。 首先&am…

操作系统再理解

目录 1、概念 2、操作系统的结构 3、对操作系统的理解&#xff08;管理角度&#xff09; 4、OS对硬件是怎么管理的&#xff1f; 1、概念 操作系统是一款进行软硬件资源管理的软件 广义的认识&#xff1a;操作系统的内核操作系统的外壳周边程序&#xff08;用户提供使用操作…

mysql的下载、安装

首先进入官网&#xff1a;MySQL 点击“downloads”进入下载界面 2.往下滑动滚轮&#xff0c;点击“mysql community...&#xff08;公开版&#xff09;” 3.往下滑&#xff0c;找到并单击“install for Windows” 4.选择版本&#xff1a;初学者可以使用较低版本&#xff0c;较…

Java:定时任务无法正常执行(scheduling + ShedLock)

目录 一、场景二、代码片段三、排查四、原因五、解决 一、场景 1、使用定时任务(scheduling) 分布式锁(ShedLock)定期执行一段代码 2、configureTasks()对于任务执行周期的更新是正常的 3、但任务方法无法被执行 二、代码片段 三、排查 1、确认Trigger没有问题 2、查看red…

Mac用户必备神器:Default Folder X,让文件操作更快捷、更智能!

Default Folder X for Mac是一款功能强大的文件管理辅助工具&#xff0c;它为Mac用户带来了前所未有的文件操作体验。&#x1f31f; 无论是日常办公、学习还是娱乐&#xff0c;Default Folder X都能帮助你更高效地管理文件&#xff0c;让你的工作更加得心应手。&#x1f4bc; …

java-spring 图灵 02 手写spring

01.idea中创建一个maven管理的空项目 02.模拟创建出spring容器类&#xff0c;这里叫wzpApplicationContext&#xff0c;创建的时候会自动加载配置类的数据&#xff1a; 这里wzpApplicationContext对标的是AnnotationConfigApplicationContext public class wzpApplicationCo…

【算法刷题 | 回溯思想 04】4.15(分割回文串)

文章目录 7.分割回文串7.1题目7.2解法&#xff1a;回溯7.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;终止条件&#xff08;3&#xff09;遍历过程 7.2.2代码 7.分割回文串 7.1题目 给你一个字符串 s&#xff0c;请你将 s 分割成一些子…

鸿蒙原生应用再新丁!企查查 碧蓝航线 入局鸿蒙

鸿蒙原生应用再新丁&#xff01;企查查 碧蓝航线 入局鸿蒙 来自 HarmonyOS 微博13日消息&#xff0c;碧蓝航线 将启动鸿蒙原生应用开发&#xff0c;双方将基于HarmonyOS NEXT鸿蒙星河版的原生流畅等特性&#xff0c;进一步提升游戏流畅度和画面精美度&#xff0c;为用户提供更…