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

news2024/11/18 23:44:29

文章目录

  • 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来解决。

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

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

相关文章

Hive的安装部署

目录 1.修改hadoop相关参数2.Hive解压安装3.Hive元数据的三种部署方式3.1 元数据库之Derby3.2 元数据库之Mysql3.3 元数据之MetaStore Server 4.hive的两种访问方式4.1 命令行的方式4.2 HiveServer2模式 1.修改hadoop相关参数 1)修改core-site.xml [roothadoop102…

Android 12 intent-filter添加android:exported后任然报错解决方法

Android 12 或更高版本为目标平台,且包含使用intent-filter 过滤器的 activity、service或receiver,您必须为这些应用组件显式声明 android:exported 属性。 常规操作 查看AndroidManifest.xml文件,搜索intent-filter,然后添加好…

灰度图处理方法

做深度学习项目图像处理的时候常常涉及到灰度图处理,这里对自己处理灰度图的方式做一个记录,后续有更新的话会在此更新 一,多维数组可视化 将多维数组可视化为灰度图 img_gray Image.fromarray(img, modeL) # 实现array到image的转换,m…

原来有 K8s 认证,找工作这么吃香!

随着容器的快速发展,容器管理工具Kubernetes(下文简称K8s)也应运而生,目前不仅百度、京东、阿里、Google等大公司在使用K8s,一些中小企业也开始把业务迁移到K8s中。 K8s在人工智能、大数据、5G、区块链、智能家居、航…

【postgresql】CentOS7 安装Pgweb

Pgweb Pgweb是PostgreSQL的一个基于web的数据库浏览器,用Go编写,可在Mac、Linux和Windows机器上运行。以零依赖性的简单二进制形式分布。非常易于使用,并具有适当数量的功能。简单的基于web和跨平台的PostgreSQL数据库浏览器。 特点 跨平台…

【用户实践】openGauss5.0在某省医保局实时数仓应用

一、项目背景 采用数据同步软件将各系统的数据库下的数据实时同步到openGauss数据库中;建立实时数仓;可以在实时数仓自行查询、分析、统计数据及报表;同时横向集成公共服务区和核心业务区生产库数据、集成其他委办局数据。纵向集成市级的生产…

使用Zoho Projects软件进行高效项目管理的方法

本文将通过Zoho Projects项目管理软件的功能,结合一般情况下使用Zoho Projects进行项目管理的过程,为大家展示如何充分利用Zoho Projects项目管理软件进行项目管理。我们将详细介绍任务看板、文档管理、甘特图与报表、里程碑、issue等功能,基…

PieCloudDB Database 自研内存管理器 ASanAlloc:为产品质量保驾护航

内存管理是计算机科学中至关重要的一部分,它涉及到操作系统、硬件和软件应用之间的动态交互。有效的内存管理可以确保系统的稳定性和安全性,提高系统运行效率,帮助我们最大限度地利用有效的内存资源,合理分配和回收内存&#xff0…

TikTok:传承文化多样性,扬播全球声音

在数字时代,社交媒体平台已经成为了传播文化多样性和全球声音的重要渠道。其中,TikTok无疑是最引人注目的之一。 这个短视频应用在短短几年内迅速崭露头角,吸引了全球数亿用户,成为一个独特的文化传媒工具,通过短视频…

芯向未来|紫光展锐CEO任奇伟博士受邀主持ICCAD 2023高峰论坛

11月10日至11日,中国集成电路设计业2023年会暨广州集成电路产业创新发展高峰论坛(ICCAD 2023)在广州保利世贸博览馆召开,本届年会以“湾区有你,芯向未来”为主题,分开幕式、高峰论坛、7场专题研讨、产业展览…

黑客帝国中的黑客如何隐藏自己的IP,你不可不知的正向代理和反向代理

文章目录 前言正向代理常用使用场景VPN动态 IP 代理隐藏客户端 IP 反向代理使用场景堡垒机nginx 负载均衡 动态 IP 代理实现分类按匿名分类按成本分类按协议分类 原理nodeJs 简单实现 总结个人简介 前言 hello,大家好,我是 Lorin ,今天给大家…

element el-upload上传功能

2023.11.14今天我学习了如何使用el-upload: <!--drag设置可拖动--><!--accept".xlsx"设置上传的文件类型--><!--:limit1上传文件的最大个数--><!--:auto-upload"false"是否在选取后直接上传--><!--:before-upload"beforeU…

概念回顾: API 和 API 互联

原文作者&#xff1a;NGINX 原文链接&#xff1a;概念回顾&#xff1a; API 和 API 互联 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 随着微服务架构的兴起&#xff0c;API 的数量急剧增加&#xff0c;由此也产生了一系列的挑…

2019年五一杯数学建模B题木板最优切割方案解题全过程文档及程序

2019年五一杯数学建模 B题 木板最优切割方案 原题再现 徐州某家具厂新进一批木板如表 1 所示&#xff0c;在家具加工的过程中&#xff0c;需要使用切割工具生产表 2所示的产品。假设&#xff1a;木板厚度和割缝宽度忽略不计。   请为该家具厂给出如下问题的木板最优切割方…

队列与堆栈:原理、区别、算法效率和应用场景的探究

队列与堆栈&#xff1a;原理、区别、算法效率和应用场景的探究 前言原理与应用场景队列原理应用场景&#xff1a; 堆栈原理应用场景递归原理和堆栈在其中的作用递归原理堆栈作用 队列与堆栈区别队列堆栈算法效率 前言 本文主要讲解数据结构中队列和堆栈的原理、区别以及相关的…

requests库验证错误解决方法

用户在使用requests库进行http请求时&#xff0c;遇到了一个AuthenticationRequired&#xff08;身份验证必须&#xff09;的错误。但是&#xff0c;当使用urllib.request.urlopen进行相同的操作时&#xff0c;却能够成功。同时&#xff0c;用户提供了自己的系统信息&#xff0…

GPT 学习法:恐怖算力 + 精确算法,实现复杂文献轻松的完美理解、在庞大的不确性中找到确定性

GPT 学习法&#xff1a;恐怖算力 精确算法&#xff0c;实现复杂文献轻松的完美理解、在庞大的不确性中找到确定性 复杂文献 - 恐怖算力 精确算法&#xff0c;复杂文献轻松的完美理解GPT 理解法 - 举例子、归纳、逻辑链推导本质、图示、概念放大器实战案例&#xff1a;学习高精…

省级数字经济政策词频分析数据集(2005-2023)

数据简介&#xff1a;当今社会&#xff0c;数字经济已经成为推动世界经济发展和社会变革的重要动力。随着信息技术的迅猛发展和智能化技术的普及应用&#xff0c;数字经济政策的制定和实施变得愈发重要。数字经济政策的词频分析成为了对政策文件和宣言进行深度解读的关键工具。…

Vue 中 slot 是什么?作用?分类?如何实现?

结论先行&#xff1a; slot 插槽&#xff0c;是子组件提供给父组件使用的一个占位符&#xff0c;父组件可以在这个占位符中填充任何模板代码。主要作用就是更好的拓展和定制化组件&#xff0c;例如弹窗组件、表格组件等。分为默认插槽、具名插槽和作用域插槽。 其中前两个都是…

SecureCRT 9.2.4最新

SecureCRT是一款功能强大的终端仿真软件&#xff0c;它通过提供安全的、高效的会话&#xff0c;帮助用户在远程设备上完成各种任务。SecureCRT具有出色的性能和可靠性&#xff0c;能够处理复杂的网络环境&#xff0c;提供高效的远程访问和管理。 SecureCRT的主要特点包括&…