当前位置: 首页 > news >正文

【联邦学习+区块链】TORR: A Lightweight Blockchain for Decentralized Federated Learning

文章目录

  • I.CONTRIBUTION
  • II. ASSUMPTIONS AND THREAT MODEL
    • A. Assumptions
    • B. Threat Model
  • III. SYSTEM DESIGN
    • A. Design Overview
    • B. Block Design
    • C. Initialization
    • D. Role Selection
    • E. Storage Protocol
    • F. Aggregation Protocol
    • G. Proof of Reliability
    • H. Blockchain Consensus
  • IV. SECURITY ANALYSIS


论文地址:https://ieeexplore.ieee.org/abstract/document/10159020


I.CONTRIBUTION

  1. 提出了轻量级的区块链TORR用于去中心化的联邦学习
  2. 提出了新的共识协议Proof of Reliablity来过滤掉不可靠的设备,从而减少系统延迟。提出了一种快速聚合算法来执行快速且正确的聚合,进一步降低系统延迟。
  3. 采用纠删码,高效可靠地存储模型,而区块链账本仅记录模型的哈希值。提出了定期存储刷新策略以进一步减少存储开销。
  4. 将系统部署在五台服务器上,模拟 100 个节点,并在三种不同的模型上进行测试。实验表明,TORR 可以将系统延迟、整体存储开销和峰值存储开销分别降低高达 62%、75.44% 和 51.77%。

II. ASSUMPTIONS AND THREAT MODEL

A. Assumptions

Federated Learning. 遵循典型联邦学习中的一般假设,TORR假设许多分布式设备愿意联合进行机器学习来训练全局模型。在每一轮训练中,都会选择一部分设备来训练本地模型。然而,没有中央参数服务器。轻量级设备作为存储容量有限、异构连接的节点加入区块链网络。部分节点存在由于网络条件差而响应缓慢或者恶意减缓训练进程的问题,这些节点被视为不可靠节点。

Proof of Reliability. 在TORR中,节点使用PoR就区块链账本的状态达成共识,PoR是基于PoS设计的。PoS 根据节点的stake选举一部分节点作为委员会,委员会成员决定下一个区块的内容。TORR将节点的stake定义为其可靠性的衡量标准,而不是贡献的资金,将一定的stake分配给保持在线并正确快速响应的节点。任意不可靠的行为如网络缓慢或断开连接,都会减少节点的stake。与PoS相同,PoR假设诚实的参与方拥有至少70%的stake。stake的分配情况记录在每个区块中,节点可以通过区块链账本获取stake的分配情况。

B. Threat Model

​恶意节点可以通过生成fake节点来增加其比例进行女巫攻击。使用PoS-like协议,恶意节点无法通过简单地增加节点数量来增加其stake。只要不超过30%的stake被恶意节点控制,TORR就可以正常工作。

​在存储过程中,恶意节点可以声称存储了一个chunk,但当其他节点请求时总是返回错误的chunk。TORR记录block中每个chunk的哈希值来解决这个问题。当向其他节点请求chunk时,每个节点都可以通过检查存储在区块链中的哈希值来验证该chunk。

​恶意节点可以通过缓慢响应或故意不响应任何请求来尝试减慢整个训练过程。在PoR协议中,任何此类行为都将被记录为减少节点stake的证据。随着训练的进行,stake较低的节点将很难被选为委员会成员。

​在聚合过程中,多个节点将会被选择为aggregator来进行聚合任务。如果恶意节点拥有aggregator一半以上的stake,则它们可能会主导聚合以获得不正确的全局模型。文章使用评分机制来评估每个节点的可靠性并确定stake的增加或减少。在每一轮中,选定的客户端和aggregator可以对存储chunks的节点进行评分。恶意客户端或aggregator可能会尝试通过提供极高或极低的分数来操纵此过程。为了解决这个问题,方案需要使委员会规模足够大以包含足够的诚实节点。此外还设计了聚合算法和适当的评分规则来防止恶意行为。

III. SYSTEM DESIGN

​TORR设计目标如下:(1)系统延迟应与集中式联邦学习相当,并且低于其他基于区块链的联邦学习框架。(2)单个节点的存储需求应比其他基于区块链的联邦学习框架少得多。(3)恶意节点在没有获得足够stake的情况下无法控制系统。

A. Design Overview

​TORR中存在三种角色:client、aggregator、keeper。每轮会选择 K K K 个clients和 M M M 个aggergator来分别进行训练和聚合。参数 K K K由发起联邦学习的模型拥有者指定,参数 M M M是TORR预先定义的。keepers用于存储模型。通过使用纠删码(erasure coding),无论是本地模型还是全局模型,都应该被编码成 n n n 个chunks,这些块存储在 $n $ 个选定的keeper中。block由aggregator或模型所有者生成,包含全局模型的哈希值并指示某一轮的开始,第一个block由模型所有者生成以启动联邦学习。TORR框架Fig.1所示。
在这里插入图片描述

​(step 1) 模型拥有者将全局模型编码为 n n n 个chunks,并将他们存储到 n n n 个keepers中。keepers通过VRF和一致性哈希进行选择,将全局模型的哈希值作为VRF的输入。同时,clients和aggregators同样使用前一个块的哈希值进行选择,即将创世块的哈希值作为VRF的输入。

​(step 2) 在全局模型存储完毕后,模型拥有者将创建包含模型哈希值的block,并将block进行广播。

​(step 3) 当收到block后,每个节点都会检查自身的角色。如果节点该轮为client,它首先会从keepers处请求chunks来恢复全局模型。client将会记录每个keeper的响应延迟,将其作为评分标准。

​(step 4) client使用自己的本地数据进行模型训练。

​(step 5) 训练完毕后,client会使用本地模型的哈希值作为VRF的输入来选择 n n n 个keepers。本地模型被编码为 n n n 个chunks,并存储在相应的keepers。

​(step 6) 任何完成存储操作的client都会将其本地模型的哈希值和记录的延迟传输到aggregators。当一个aggregator收到 K K K 个本地模型的哈希值时,将开始进行聚合操作。

​(step 7) aggergator首先向keepers请求chunks来恢复K个本地模型。同时,aggregator会记录每个keeper的响应延迟。然后aggregator将本地模型聚合为新的全局模型。

​(step 8) 需要注意的是,恶意的aggregator可能会聚合不正确的全局模型。为保证正确的聚合,文章设计了一种most-stake聚合算法,该算法由Bully选举算法修改而来。Bully算法是一种著名的选举算法,可以帮助高效地在多个节点中选择领导者,但不能容忍恶意节点。如果恶意节点赢得选举,它可以执行错误的聚合或停止运行以暂停该过程。文章添加了验证步骤来保证聚合的正确性,并添加了计时机制来保证算法的效率。Bully 选举算法选择 ID最大的节点作为leader。文章选择stake最多的节点作为leader,以保证区块更有可能由诚实且快速的节点创建。

​(step 9) 一旦aggergator(通常是拥有最多stake的节点)赢得选举并成为leader,它将选择新的全局模型的keepers并将新的全局模型存储在这些keepers中。

​(step 10) 然后创建包含新全局模型哈希的下一个块并将其传播到其他节点以开始下一轮联邦学习。

B. Block Design

​TORR 中的节点通过gossip协议传播区块,以保证网络中的每个节点都会收到新区块。接收者会将收到的块附加到其本地账本中。区块的结构如Fig.2所示。

在这里插入图片描述

每个block包含前一个block的哈希值,从而形成一条链。每个块中记录了参数round,当round达到模型所有者在创世块中所指定的数值时,联邦学习进程将会停止。block中还包含一个model object,它包含全局模型的哈希值、chunk的哈希值和所对应keeper的签名。任何节点都能够通过model object中记录的信息知道从哪里获取全局模型。keepers的签名能够保证模型已正确存储,模型的哈希保证了全局模型的正确性。stake distribution 表明每个节点持有多少stake。

VRF proof π通过block共享。有了proof、区块矿工的公钥以及用于生成证明的公共种子(前一个区块哈希或模型哈希),任何人都可以确定性地获得相同的 VRF 哈希输出并验证输出是否有效。VRF 哈希输出与一致性哈希一起用于client和aggregator的选择。此外,一个block最多应包含clients和aggregators提供的 K + M K+M K+M 个分数以及来自aggregator的 j j j 个签名,其中$ j ≥ ⌊M/2⌋ + 1$。这些分数用于更新每个节点的stake。签名是在聚合算法的验证步骤期间提供的,如果包含至少 ⌊ M / 2 ⌋ + 1 ⌊M/2⌋ + 1 M/2+1 个签名,则块被视为有效。

C. Initialization

​联邦学习模型拥有者创建创世块来初始化整个联邦学习过程。文章假设模型所有者是可信的,并且仅在这一步中可信,因此第一个块不包含聚合器的任何签名。此外,第一个块还包含预期的轮数,以便每个节点了解何时停止训练进程。

D. Role Selection

​为了防止可能的攻击,TORR中的角色每轮都会发生改变。当aggregator创建新块时,它使用其私钥、前一个块的哈希和模型哈希来选择新的client、aggregator和keeper。角色选择过程如Fig.3所示。

​根据一致性哈希,所有可能的哈希形成一个哈希环,从0到 2 32 2^{32} 232。每一块节点的stake都被哈希为位于环上的虚拟节点。节点所拥有的stake的数量不同,虚拟节点的数量也就不同。节点拥有的stake越多,它就会拥有更多的虚拟节点,那么被选中的可能性就更大。在联邦学习的背景下,通常存在大量的设备,从而产生大量的虚拟节点,这些节点将近似均匀地分布在环上。TORR 遵循了 PoS 的特点,即节点被选中的概率等于其拥有的stake比例。

​首先,将前一个区块的哈希或者模型哈希输入到VRF中,生成VRF哈希。由于哈希位于环上的一个点,因此将选择顺时针方向的第一个节点。然后计算这个哈希值的哈希值来选择第二个节点。该过程将持续进行,直至选择到所需数量的节点。VRF函数如公式 (1)所示。


VRF以随机种子 α \alpha α和私钥 s k sk sk作为输入,输出确定性哈希 β \beta β 和 proof π \pi π。如果输入相同的私钥和种子,则输出相同。对于不知道私钥的人来说,哈希输出 β \beta β 看起来与随机变量并无区别。因此,可以将该哈希作为一致性哈希的起点,以公平地选择节点。

​其他节点能够通过公式(2)验证哈希输出是否是由具有公钥 p k p_k pk的节点生成的,因此攻击者无法伪造输出。TORR使用前一个块哈希或模型哈希作为输入的随机种子 α α α,使用节点 s k i sk_i ski的私钥作为输入的私钥 s k sk sk。由于输出由 s k i sk_i ski决定,因此哈希输出 β β β 对于每个节点来说是唯一的。在创建块或模型之前,无法知道块哈希和模型哈希,恶意节点无法预测 VRF 的输出并对客户端或聚合器进行目标攻击。
在这里插入图片描述

E. Storage Protocol

Storage Requirement Reduction. 许多设备在联邦学习中闲置,因为每轮只选择其中的一小部分来训练本地模型,因此TORR利用许多闲置设备的有限存储空间来存储模型。考虑到恶意节点的影响和单个设备存储空间有限的问题,采用纠删码将模型划分为多个chunks。一方面,纠删码保证了模型的可用性。方案使用RS code来对模型进行编码。 ( n , k ) (n, k) (n,k) RS code可以将模型总共编码为 n n n 个chunks,并且 n n n 个chunks中的任何 k k k 个都可以用来恢复整个模型。正确设置 k k k n n n 可以保证即使某些节点是恶意的或发生故障,任何节点都可以恢复模型。另一方面,与大尺寸模型的存储相比,小尺寸chunks的存储平均了所有节点上沉重的存储压力。

​此外还设计了周期性的存储刷新策略,以避免整体存储的持续扩展。在联邦学习中,全局模型每轮都会更新。因此,在某些场景下,可以将模型存储一段时间后将其删除。具体来说,当节点请求在TORR中存储chunk时,该chunk连同block-tolive (BTL) 参数一起被发送给keeper。BTL是一个整数,表示一个chunk可以存活的轮数或block数。当新块到达时,节点会将所有所存储的chunks的 BTL 减一。任何 BTL 变为零的chunk都允许被删除,通过BTL的定义实现了灵活的存储刷新。

Mitigation of the Impact of Unreliable Devices. 在联邦学习中,轻量级设备通过不同的通信介质(例如 Wifi 或蜂窝网络)访问公共网络。网络中很大概率存在一些网络状况较差的不可靠设备。更严重的情况下,攻击者可以故意缓慢响应甚至不响应,这将威胁模型的可用性。纠删码避免了client和aggregator之间可能出现的不良连接。特别是当多个clients需要将本地模型传输到aggregator时,其中一个客户端与聚合器的连接可能较差。现在aggregator不再从单个client接收整个模型,而是同时从不同的keeper请求多个块。纠删码允许aggregator不等待来自某些stragglers的块,而是仅使用部分chunks来恢复整个模型。

Selection of k k k and n n n of RS Code. TORR 假设了一个更不友好的环境,最多 30% 的stake可能被恶意节点持有。因此通过选择 n n n k k k 来允许 30% 的节点发生故障。

​由于TORR使用基于节点stake的一致性哈希,因此节点被选择的概率等于其stake的比例。假设恶意节点持有的stake比例为 p p p,至少需要选择 n n n 个keepers来存储模型chunks。最多允许 n − k n-k nk 个节点失败,因为任何 k k k 个块都可以用于恢复模型。由此,可以计算出keepers被恶意节点支配的概率:
在这里插入图片描述
考虑到恶意节点最多拥有 30% 的stake,可以通过将 p p p 设置为 30% 来获得概率 P u p p e r P_{upper} Pupper 的上限。实验要求每轮选择10个客户端,整个联邦学习持续100轮。在100轮中,keepers将被选择1100次,以存储100个全局模型和1000个本地模型。因此,上界概率 P u p p e r P_{upper} Pupper应小于0.0009,以保证系统安全运行。选择 n n n k k k 时应考虑平衡。如果固定 k k k,选择较大的 n n n 有助于降低 P u p p e r P_{upper} Pupper 的概率,但会导致更高的冗余(以 n / k n/k n/k 衡量)。

F. Aggregation Protocol

​为了保证聚合过程中的安全性和防止单点故障,TORR需要多个aggregator共同进行聚合。当aggragator接收到来自所有client的本地模型object和score时,它首先检查签名。有效的本地模型object包含本地模型的哈希值和 n n n 个块的哈希值,通过 n n n 个keepers的签名证明模型已正确存储。然后aggregators将向相应的keeper请求chunks,以准备恢复所有本地模型。

​方案只用FedAvg方案进行聚合。假设client i i i 上传的本地模型用 w i w_i wi 表示,client的数据点数量为 n i n_i ni。总共包含K个clients,聚合的全局模型通过公式(4)表示。

在这里插入图片描述

由于公式 (4) 由多个加法操作组成,aggregator不需要等待恢复所有本地模型来进行聚合。一旦恢复了新的本地模型,aggregator就会立即计算中间模型。为了在多个aggregator之间达成共识,方案设计了一个根据 Bully 选举算法修改的a most-stake aggregation协议,如Algorithm 1所示。

Timed Election. 当aggregator生成全局模型时,将会向拥有更多stake的aggregator发送选举消息。选举消息是用于检测网络中是否存在另一个aggregator的消息。如果收到对选举消息的任何响应,则aggregator不能成为leader,因为有人拥有更多stake并保持在线。然而,如果拥有最多stake的攻击者成为leader,它可以立即停止运行,然后其他aggregator将永远等待新块。因此,每个aggregator在收到其他aggregators对选举消息的响应后,都会设置一个定时器 T T T。如果 T T T 过期但没有收到进一步的块,则意味着leader可能是攻击者或落后者。aggregators将开始新一次的选举,并将选举消息发送给拥有更多stake的aggregator,但上一次选出的leader除外。

Verification. 定时选举可以保证恶意节点无法故意暂停系统,但不能保证全局模型的正确性。拥有最多stake的恶意节点仍然可以赢得选举,然后在区块中包含不正确的全局模型。因此方案引入了验证步骤以保证正确性。aggregator成为领导者后,应将包含其全局模型哈希的块发送给所有其他aggregators进行验证。如果其他aggregators发现哈希值与其全局模型的哈希值相同,则会对该块进行签名。如果一个区块包含超过一半aggregators的签名,则该区块被视为有效。只要不超过一半的aggregators是恶意的,全局模型就是正确的。

Minimum Size of Aggregator Committee. 应适当选择委员会的大小 M M M,以避免委员会被恶意节点控制。如上所述,恶意节点被选择的概率 p p p 不超过30%。aggregator被恶意节点控制的概率 P a g r P_{agr} Pagr 如下公式(5)所示:

考虑运行联邦学习100轮,聚合器委员会将被选择100次。因此,安全阈值为0.01。委员会的最小规模为26人。

G. Proof of Reliability

​文章设计了一种Proof of Reliability共识协议来适应异构网络条件和不可靠的设备。核心是找到一个可信度量来评估每个节点的可靠性。方案使用client或aggregator报告获取的chunks的延迟作为评估的基础。

​假设在一轮开始时,全局模型存储在 n n n 个keepers中。当接收到新的block后, K K K 个client将首先向这些keepers请求chunks。在这个过程中,每个client都能够对这 n n n 个keepers打分。该分数等于发起请求和接收回复之间的延迟,这样每个keeper都会拥有 K K K 个分数。使用 S i C j S^{C_j}_i SiCj 来表示client j j j 向keeper i i i 提供的分数。client将分数与本地模型的哈希值一起发送给aggregator。

​为了执行聚合,每个aggregator需要向这些本地模型的keepers请求chunks。在这个过程中,每个aggregator会为最多 n K nK nK 个keepers进行评分,使用$ S^{A_j}_i $来表示aggregator j j j 为 keeper i i i 所评价的分数。每个aggregator都会将其分数发送给所有其他aggregators。那么所有aggregators都会获得本轮产生的所有分数,包括来自clients的 n K nK nK 个分数和来自aggregator的 n K M nKM nKM 个分数。

​如果某个keeper在某一轮中被挑选存储所有模型,它会获得 K + K M {K+KM} K+KM个分数。如果keeper仅被挑选一次来存储全局模型,那么它会获得 K K K 个分数。最终使用某个keeper所有得分的中位数作为指标来评估其可靠性,如公式(6)所示。


​如上所述,假设恶意节点所持stake不超过 30%,则保证诚实方占多数的委员会的最小规模为 26。因此,TORR 仅当收到超过 26 个节点的分数时才会调整节点的stake。stake更新公式如 (7) 所示。

​因此,能够快速响应的可靠节点将拥有更多的stake。更新后的stake包含在新区块中,新区块将在most-stake aggregation验证步骤中进行验证。如果leader捏造分数,会立即被其他aggregator检测到,并且该区块无法被验证。

H. Blockchain Consensus

​TORR中没有分叉。由于client和aggregator是通过 VRF 和使用前一个块哈希作为输入的一致性哈希来选择的,因此所有节点应该在一轮中观察到相同的client和aggregator。只有一个aggregator将被选为leader来创建下一个块,并且该块应由大多数aggregator验证。因此,该区块不存在争议。

IV. SECURITY ANALYSIS

​恶意的client可能会发送伪造的本地模型来毒害全局模型,并故意给keeper高分或低分。第一个问题文章不做讨论。第二个问题,如果少于 26 个节点对相同的 keeper 进行评分,则来自client的评分将不会被信任和使用,因为在这种情况下恶意节点可能占大多数。如果节点较多,则使用分数的中位数来防止恶意节点的影响。

​恶意的keeper可能声称存储了一个chunk,但是删除了该chunk或者修改了一个块。第一种行为破坏了模型的可用性。但通过RS code的正确选择,能够保证可以从诚实的keeper获得n个块中的k个来恢复模型。即使所有恶意模型都不存储chunks,也能够恢复该模型。第二种行为威胁模型的正确性。通过记录块中每个chunk的哈希值,以便任何节点都可以通过比较哈希值来验证chunk。如果恶意keeper返回了错误的哈希值,它将立即被检测到。

​恶意的aggregator可能会伪造一个不正确的全局模型,并故意给keeper高分或低分。第一个问题通过most-stake aggregattion中的验证操作解决。第二个问题通过使用中位数而不是平均分数来评估keeper来解决。

相关文章:

【联邦学习+区块链】TORR: A Lightweight Blockchain for Decentralized Federated Learning

文章目录 I.CONTRIBUTIONII. ASSUMPTIONS AND THREAT MODELA. AssumptionsB. Threat Model III. SYSTEM DESIGNA. Design OverviewB. Block DesignC. InitializationD. Role SelectionE. Storage ProtocolF. Aggregation ProtocolG. Proof of ReliabilityH. Blockchain Consens…...

《网络协议》08. 概念补充

title: 《网络协议》08. 概念补充 date: 2022-10-06 18:33:04 updated: 2023-11-17 10:35:52 categories: 学习记录:网络协议 excerpt: 代理、VPN、CDN、网络爬虫、无线网络、缓存、Cookie & Session、RESTful。 comments: false tags: top_image: /images/back…...

利用NVIDIA DALI读取视频帧

1. NVIDIA DALI简介 NVIDIA DALI全称是NVIDIA Data Loading Library,是一个用GPU加速的数据加载和预处理库,可用于图像、视频和语音数据的加载和处理,从而为深度学习的训练和推理加速。 NVIDIA DALI库的出发点是,深度学习应用中…...

TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...

【算法每日一练]-图论(保姆级教程 篇5(LCA,最短路,分层图)) #LCA #最短路计数 #社交网络 #飞行路线 # 第二短路

今天讲最短路统计和分层图 目录 题目:LCA 思路: 题目:最短路计数 思路: 题目:社交网络 思路: 题目:飞行路线 思路: 题目:第二短路 思路: 题目&a…...

德迅云安全为您介绍关于抗D盾的一些事

抗D盾概述: 抗D盾是新一代的智能分布式云接入系统,接入节点采用多机房集群部署模式,隐藏真实服务器IP,类似于网站CDN的节点接入,但是“抗D盾”是比CDN应用范围更广的接入方式,适合任何TCP 端类应用包括&am…...

leetcode算法之位运算

目录 1.判断字符是否唯一2.丢失的数字3.两整数之和4.只出现一次的数字II5.消失的两个数字6.位1的个数7.比特位计数8.汉明距离 1.判断字符是否唯一 判断字符是否唯一 class Solution { public:bool isUnique(string astr) {//利用鸽巢原理做优化if(astr.size()>26) return…...

java常用的几个图片处理工具对Tiff文件的支持

ImageMagick 官网 https://imagemagick.org/, 支持多种格式。命令行工具很适合调试。功能很强大. 还有一款工具GraphicsMagick 是从ImageMagick的基础上研发出来的。 OpenCV 官网 https://opencv.org/ , github地址https://github.com/opencv/opencv&…...

SQL必知会(二)-SQL查询篇(11)-联结表

第12课、联结表 联结表 使用联结:之前的 SELECT 查询某些列,只是针对一张表进行检索的。(即 FROM 表名)。但是如果用户想要使用 SELECT 对存储在不同表中的某些列时,则需要使用联结表的方式来实现。 例子中有建立两个…...

多模态大一统:开启全模态LLM和通用AI时代的大门

多模态大一统:开启全模态LLM和通用AI时代的大门 1. 目前多模态实现的方法1.1 单独训练各领域模型1.2 多任务学习1.3 集成多模态模型1.4 通用多模态模型2. 多模态统一难点2.1 数据集对齐和融合2.2 大规模计算资源需求2.3 各领域特性的兼容性2.4 可解释性和泛化能力3. 全模态的好…...

Alibaba Nacos注册中心实战

为什么需要注册中心 思考:网络请求,如果服务提供者发生变动,服务调用者如何感知服务提供者的ip和端口变化? // 微服务之间通过RestTemplate调用,ip:port写死,如果ip或者port变化呢? String ur…...

京东数据采集与挖掘(京东大数据):2023年10月京东冰箱品牌销售排行榜

鲸参谋监测的京东平台10月份冰箱市场销售数据已出炉! 10月份,冰箱市场的销售额有小幅上涨。鲸参谋数据显示,在京东平台上,今年10月冰箱市场的销量为94万,销售额将近23亿,同比增长超过1%。从价格上看&#x…...

某事业单位转型二类后绩效项目成功案例纪实

——事业单位从公益一类转向二类之后,如何通过绩效考核提高人员积极性 【客户行业】事业单位 【问题类型】绩效管理 【客户背景】 某国家级博物馆是由当地ZF与自然资源局共建共管的事业单位,是一家综合性较强的博物馆,入选过全国热搜博物…...

MySQL 和 SQL Server之间的数据迁移方法

目录 MySQL导入SQL Server 使用 SQL Server Management Studio (SSMS) 导入导出向导: 使用 SQL Server Integration Services (SSIS): SQL Server 导入 MySQL 使用 SQL Server Management Studio (SSMS) 导出数据: 使用 MySQL Workbench…...

单元测试实战(五)普通类的测试

为鼓励单元测试,特分门别类示例各种组件的测试代码并进行解说,供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战(一)Controller 的测试 单元测试实战(二)Service 的测试 单元测试实战&am…...

js 迭代器iterator 和 生成器Generator 10

✌ 文章目录 一、迭代器 iterator二、使用步骤1.引入库2.读入数据 总结 一、迭代器 iterator 迭代器是帮助我们对某个数据结构进行遍历的对象 迭代器:是一个对象,帮助我们对某个数据结构进行遍历 迭代器要符合迭代器协议,必须要有一个特定的n…...

100套Axure RP大数据可视化大屏模板及通用组件库

106套Axure RP大数据可视化大屏模板包括了多种实用美观的可视化组件库及行业模板库,行业模板涵盖:金融、教育、医疗、政府、交通、制造等多个行业提供设计参考。 随着大数据的发展,可视化大屏在各行各业得到越来越广泛的应用。可视化大屏不再…...

【OpenGauss源码学习 —— 执行算子(Append算子)】

执行算子(Append算子) Append 算子ExecInitAppend 函数exec_append_initialize_next 函数ExecAppend 函数ExecEndAppend 函数ExecReScanAppend 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和…...

Java(一)(引用类型的参数在传递,方法重载,面向对象编程基础)

基本类型和引用类型的参数在传递的时候有什么不同? 基本类型的值传递:参数传输存储的数据值 引用类型的值传递:参数传输存储的地址值 传递数组名字的时候,传递的是数组的地址,change方法可以通过地址直接访问我们在堆内存中开辟的数组,然后改变数组,数组中的元素发生变化 方…...

Vue第1天:特性概览

文章目录 Vue.js 简介 Vue的特性 如何使用Vue 安装Vue 通过CDN引入 使用npm 创建Vue实例 结语 Vue.js 简介 Vue.js(通常简称为Vue)是一款流行的JavaScript框架,专注于构建用户界面。它的设计灵感来自于现代的JavaScript框架&#xf…...

C++语法基础知识面经汇总

背景:汇总了网上C常考的基础知识,方便复习 1,static关键字 static可以用于成员变量,或者成员函数。存储空间在静态存储区(编译器会将其初始化为0,对应的存储空间直到程序执行结束才会释放)&…...

AM@幂级数性质@幂级数和函数求解

文章目录 幂级数性质四则运算性质分析性质求解和函数例例 幂级数性质 和多项式有相似的性质本文介绍用幂级数的性质求解幂级数和函数的两个例子 四则运算性质 若幂级数 ∑ n 0 ∞ a n x n \sum_{n0}^{\infin}a_{n}x^{n} ∑n0∞​an​xn(1)的收敛半径为 R 1 R_1 R1​,和函数为…...

PHP低版本安全问题

目录 1、PHP弱类型问题 1.1 MD5、 SHA1 弱比较问题 1.2 数组 0 1)函数无法处理数组,返回0 2)strcmp 2、特殊字符串导致的问题 2.1 "ffifdyop" 与 md5(string,raw) 2.2 ereg函数漏洞:00 截断 3、正则匹配问…...

结构体——C语言初阶

一.结构体的声明: (1)结构的基础知识: 结构体是一种构造数据类型把不同类型的数据组合成一个整体结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量需要注意的是,结构体是一种…...

基于django电影推荐系统

基于django电影推荐系统 摘要 该Django电影推荐系统是一个简单而基础的框架,旨在展示系统的基本组件。系统包括两个主要模型,即Movie和Rating,用于存储电影信息和用户评分。视图层包括展示电影列表和电影详情的功能,使用模板进行页…...

【问题处理】WPS提示不能启动此对象的源应用程序如何处理?

哈喽,大家好,我是雷工! 最近在用WPS打开word文件中,插入的Excel附件时,无法打开,提示:“不能启动此对象的源应用程序”。 经过上网查找处理办法,尝试解决,现将解决过程记…...

UE 程序化网格 计算横截面

首先在构造函数内加上程序化网格,然后复制网格体到程序化网格组件上,将Static Mesh(类型StaticMeshActor)的静态网格体组件给到程序化网格体上 然后把StaticMesh(类型为StaticMeshActor)Instance暴漏出去 …...

【Spring】IoC容器的一些总结与补充

文章目录 1. 创建容器的两种方式相对路径导入绝对路径导入 2. 获取Bean的三种方式getBean后强转类型getBean内写明类别根据类别获取bean 3. 容器层次结构4. BeanFactory5. bean的总结6. 注入的总结 1. 创建容器的两种方式 相对路径导入 ApplicationContext ctx new ClassPat…...

Java GUI实现五子棋游戏

五子棋是一种双人对弈的棋类游戏,通常在棋盘上进行。棋盘为 1515 的方格,黑白双方各执棋子,轮流在棋盘的格点上落子,先在横、竖、斜线上形成五个相连的同色棋子者获胜。五子棋规则简单,易学难精,兼具攻防和…...

Python 集成 Nacos 配置中心

Python 集成 Nacos 配置中心 下载 Nacos 官方 pyhton 库 pip install nacos-sdk-python # 指定国内阿里云镜像源 pip3 install nacos-sdk-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com配置 Nacos 相关信息 Global:nacos:port: 8848…...

Debian 11 更新 Node.js 版本

发布于 2023-07-14 在 https://chenhaotian.top/debian/d-upd-nodejs/ 步骤 从 NodeSource 服务下载需要的 Node.js 安装脚本。注意更换版本号。当前的 LTS 版本是 18.x curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -现在可以直接从 apt 安装&#xff0…...

python 对图像进行聚类分析

import cv2 import numpy as np from sklearn.cluster import KMeans import time# 中文路径读取 def cv_imread(filePath, cv2_falgcv2.COLOR_BGR2RGB): cv_img cv2.imdecode(np.fromfile(filePath, dtypenp.uint8), cv2_falg) return cv_img# 自定义装饰器计算时间 def…...

程序员导航站

探路者 hello.alluniverse.vip 开发者导航 - Pro Developer网站导航 探路者是一款极简导航工具,致力于收录的每个站点都有其独特的作用。同时支持自定义导航,让用户快速实现个性化的导航站点。 特性概述 免费ChatGPT 装机必备 开发工具 Git精选项目 …...

BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)

再解释三者之前我们需要先了解几个概念: 阻塞、非阻塞:是相较于线程来说的,如果是阻塞则线程无法往下执行,不阻塞,则线程可以继续往下 执行。同步、异步:是相较于IO来说的,同步需要等待IO操作完…...

深度学习YOLO图像视频足球和人体检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习YOLO图像视频足球和人体检测 该项目较为新颖,适合作为竞赛课题方向,学长非…...

系列七、JVM的内存结构【堆(Heap)】

一、概述 一个JVM实例只存在一个堆内存,堆内存的大小是可以手动调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三个部分,即…...

什么是Selenium?如何使用Selenium进行自动化测试?

什么是 Selenium? Selenium 是一种开源工具,用于在 Web 浏览器上执行自动化测试(使用任何 Web 浏览器进行 Web 应用程序测试)。   等等,先别激动,让我再次重申一下,Selenium 仅可以测试Web应用…...

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)

目录 A、求全是字母的最小十六进制数 B、Excel表格组合 C、求满足条件的日期 D、 取数字 - 二分 (1)暴力 (2)二分 E、最大连通块 - bfs F、哪一天? G、信号覆盖 - bfs (1)bfs&#xf…...

【数据结构】手撕双向链表

目录 前言 1. 双向链表 带头双向循环链表的结构 2. 链表的实现 2.1 初始化 2.2 尾插 2.3 尾删 2.4 头插 2.5 头删 2.6 在pos位置之前插入 2.7 删除pos位置 3.双向链表完整源码 List.h List.c 前言 在上一期中我们介绍了单链表,也做了一些练习题&…...

性能测试 —— Jmeter接口处理不低于200次/秒-场景

需求:期望某个接口系统的处理能力不低于200次/秒,如何设计? ①这个场景是看服务器对某个接口的TPS值是否能大于等于200,就可以了; ②系统处理能力:说的就是我们性能测试中的TPS; ③只要设计一…...

Qt中使用QNetworkAccessManager类发送https请求时状态码返回0

前言 在项目开发中,碰到一个问题,使用QNetworkAccessManager类对象发送https请求时,状态码一直返回0,抓包分析看请求响应也是正常的。费了好大劲终于搞定了,主要是两个原因导致的。 原因一:未设置支持SSL…...

Linux - 物理内存管理 - memmap

说明 裁减内核预留内存占用,在启动log中,发现memmap占用了大块内存(446个pages)。 On node 0 totalpages: 32576 memblock_alloc_try_nid: 1835008 bytes align0x40 nid0 from0x0000000000000000 max_addr0x0000000000000000 al…...

Python爬虫动态ip代理防止被封的方法

目录 前言 一、什么是动态IP代理? 二、如何获取代理IP? 1. 付费代理IP 2. 免费代理IP 3. 自建代理IP池 三、如何使用代理IP爬取数据? 1. 使用requests库设置代理IP 2. 使用urllib库设置代理IP 3. 使用selenium库设置代理IP 四、常…...

01Urllib

1.什么是互联网爬虫? 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据 解释1:通过一个程序,根据Url(http://www.…...

python爬取酷我音乐 根据歌名进行爬取

# _*_ coding:utf-8 _*_ # 开发工具:PyCharm # 公众号:小宇教程import urllib.parse from urllib.request import urlopen import json import time import sys import osdef Time_1...

【深度学习】吴恩达课程笔记(五)——超参数调试、batch norm、Softmax 回归

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【吴恩达课程笔记专栏】 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络 【深度学习】吴恩达课程笔记(三)——参数VS超参数、深度…...

腾讯云轻量级服务器和云服务器什么区别?轻量服务器是干什么用的

随着互联网的迅速发展,服务器成为了许多人必备的工具。然而,面对众多的服务器选择,我们常常会陷入纠结之中。在这篇文章中,我们将探讨轻量服务器和标准云服务器的区别,帮助您选择最适合自己需求的服务器。 腾讯云双十…...

解决:虚拟机远程连接失败

问题 使用FinalShell远程连接虚拟机的时候连接不上 发现 虚拟机用的VMware,Linux发行版是CentOs 7,发现在虚拟机中使用ping www.baidu.com是成功的,但是使用FinalShell远程连接不上虚拟机,本地网络也ping不通虚拟机&#xff0c…...

SpringBoot项目集成发邮件功能

1&#xff1a;引入依赖2&#xff1a;配置设置3&#xff1a;授权码获取&#xff1a;4&#xff1a;核心代码5&#xff1a;postman模拟验证6&#xff1a;安全注意 1&#xff1a;引入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>c…...

【Spring篇】使用注解进行开发

&#x1f38a;专栏【Spring】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f33a;原代码&#xff08;无注解&#xff09;&#x1f384;加上注解⭐两个注…...