DeepSpeed-Ulysses:支持极长序列 Transformer 模型训练的系统优化方法

DeepSpeed-Ulysses:支持极长序列 Transformer 模型训练的系统优化方法

flyfish

名字 Ulysses

“Ulysses” 和 “奥德修斯(Odysseus)” 指的是同一人物,“Ulysses” 是 “Odysseus” 的拉丁化版本

《尤利西斯》(詹姆斯·乔伊斯著,1922年出版)

以古希腊英雄奥德修斯(拉丁名“尤利西斯”)的神话为框架,将故事置于现代(20世纪初)的都柏林,通过三位主角一天内的经历,映射奥德修斯的十年漂泊。

奥德修斯(古希腊神话核心人物)

奥德修斯是古希腊城邦伊萨卡的国王,以智慧著称(如“特洛伊木马”计策的设计者)。特洛伊战争结束后,他因触怒海神波塞冬,踏上长达十年的返乡漂泊,故事集中于《奥德赛》(荷马史诗)。

“DeepSpeed-Ulysses”的借用“奥德修斯/尤利西斯”的“长途探索与克服挑战”意象,象征长序列模型训练的技术突破。

长序列Transformer模型训练是指针对输入序列长度极长(如包含数万至百万级 tokens)的Transformer模型进行优化训练的过程,其核心挑战在于平衡计算效率、内存使用和通信开销。

一、长序列Transformer模型的定义与应用场景

1. 模型特征

Transformer模型以自注意力机制为核心,传统模型的序列长度通常限制在数千tokens(如512或2048),而长序列模型需处理远超这一范围的输入。其计算复杂度随序列长度呈二次增长(注意力计算需遍历所有token对),导致训练时内存占用和通信开销剧增。

2. 关键应用领域
  • 生成式AI
    • 对话系统:处理长对话历史(需支持多轮交互的上下文)。
    • 长文档处理:对书籍、学术论文等进行摘要生成(序列长度可达数万词)。
    • 多模态任务:视频生成、语音识别等需处理时空维度的长序列输入。
  • 科学AI
    • 基因组学:分析人类基因组的64亿碱基对序列。
    • 气候预测:处理长时间序列的气象数据。
    • 医疗诊断:基于患者全病程记录的预测模型。

二、长序列训练的核心挑战

1. 内存与通信效率瓶颈
  • 激活值内存爆炸:Transformer的中间激活值(如注意力计算中的QKV张量)随序列长度平方增长,单GPU内存无法容纳极长序列。
  • 通信开销线性增长:现有序列并行方法(如Megatron-LM)在注意力计算时需进行全聚集(all-gather)通信,通信量随序列长度线性增加,导致训练效率随序列长度下降。
2. 现有并行技术的局限性
  • 数据/张量/流水线并行不适用:这些并行方式分别针对批量大小、隐藏维度、模型层数优化,但未考虑序列维度的划分,无法解决长序列特有的内存和通信问题。
  • 传统序列并行方法低效:如ColAI-SP采用环形通信,Megatron-LM依赖全聚集操作,均无法在扩展序列长度时保持通信效率,且需大量代码重构。

DeepSpeed-Ulysses解决长序列Transformer模型训练难题的方案

DeepSpeed-Ulysses针对长序列Transformer训练的四大核心创新,可拆解为数据划分策略、通信原语重构、内存分层优化、注意力模块化设计四大技术模块
DeepSpeed-Ulysses通过序列分片解耦计算与存储全对全通信重构带宽效率ZeRO-3扩展内存边界注意力抽象层屏蔽多样性,形成了从硬件通信到算法逻辑的端到端优化。

一、序列维度数据划分:动态分片与负载均衡

1. 分片粒度设计
  • 均匀切分:将输入序列按长度均分为P份(P为GPU数),每个GPU处理N/P tokens(如N=1M,P=64时,单卡处理15,625 tokens),确保计算负载均衡。
  • 细粒度对齐:结合注意力头数(H),将每个分片的QKV张量按头维度切分,实现“序列分片×头分片”的二维并行(如H=32,P=8时,每卡处理4个头的完整序列分片),避免头间通信冗余。
2. 分片生命周期管理
  • 前向传播:分片在嵌入层后立即生成,贯穿注意力计算全流程,减少中间复制开销。
  • 反向传播:梯度按分片聚合,通过通信原语自动对齐,无需显式分片重组(对比Megatron-LM需手动拼接梯度)。

二、通信原语重构:全对全替代全聚合

1. 两次全对全(All-to-All)通信
  • 第一次All-to-All(QKV收集)
    • 输入:各GPU持有(N/P, b, d)的Q/K/V分片(b为微批量,d为隐藏维度)。
    • 操作:通过高效的NVLink/IB网络,交换分片形成(N, b, d/P)的全局QKV(每个GPU获取完整序列的1/P头数据)。
    • 优势:通信量为3Nh/P(h为头维度),对比Megatron-LM的全聚合(3Nh)减少P倍。
  • 第二次All-to-All(结果分发)
    • 输入:注意力计算后的(N, b, d/P)输出。
    • 操作:重组为(N/P, b, d)分片,供后续MLP层处理,通信量Nh/P
    • 总通信量:4Nh/P,复杂度O(N/P),当N与P同比增长时保持恒定(如N×2,P×2,通信量不变)。
2. 通信拓扑优化
  • 节点内NVSwitch优先:利用GPU间高速互联,将All-to-All拆分为节点内(低延迟)和节点间(高带宽)两阶段,实测减少通信时间
  • 异步通信隐藏延迟:在注意力计算前预启动通信,与计算重叠(如FlashAttention的分块计算与通信流水线)。

三、内存分层优化:ZeRO-3×序列并行

1. 参数分片策略
  • 跨组划分:ZeRO-3原仅在数据并行组(DP组)分片参数,Ulysses扩展至DP组×序列并行组(SP组),形成二维分片(如DP=8,SP=8时,每个参数被分为64片)。
  • 动态聚合:仅在参数更新时,通过All-Gather收集分片梯度,平时仅保留本地分片,显存占用降低DP×SP倍。
2. 激活内存压缩
  • 分片激活:每个GPU仅存储N/P tokens的激活值,总激活内存从O(N²)降至O((N/P)²),支持N=1M时单卡激活内存仅为全序列的1/64(P=64)。
  • 与激活重计算协同:结合FlashAttention的分块重计算,进一步将激活内存降至O(N/P)。

四、注意力模块化设计:统一接口与动态适配

1. 注意力计算抽象层
  • 输入标准化:无论密集/稀疏,输入均为(N, b, d/P)的分片QKV(N为全局序列长度)。
  • 头级并行:每个GPU负责H/P个头的完整注意力计算,支持任意头数分片(如H=96,P=8时每卡12头)。
  • 输出重组:通过第二次All-to-All自动对齐头维度,屏蔽底层注意力实现差异。
2. 稀疏注意力特化优化
  • 块对角通信:针对滑动窗口等稀疏模式,仅交换相邻分片的K/V,通信量进一步降至O(N/P×W)(W为窗口大小)。
  • 与Blockwise Attention协同:支持将序列划分为块,块内全连接、块间稀疏连接,通信量减少70%(对比全局密集)。
3. 兼容性验证
  • FlashAttention v2集成:通过分片QKV直接输入FlashAttention内核,实测长序列(N=512K)吞吐量提升1.8倍
  • 稀疏模式扩展:支持BigBird的全局+局部混合注意力,无需修改通信逻辑,仅替换注意力计算函数

五、工程实现细节:易用性与扩展性

1. 代码侵入性
  • 零修改集成:仅需在模型定义中添加@sequence_parallel装饰器,自动替换原生Attention为分布式版本
  • 并行组抽象:自动管理DP/SP组的创建与销毁,用户无需显式管理通信域。
2. 故障恢复机制
  • 分片检查点:仅保存本地分片参数,检查点大小减少DP×SP倍,支持1024卡集群下30B模型的快速恢复

注意力集成

DeepSpeed-Ulysses通过优化多种注意力机制,系统性解决了长序列Transformer训练的效率瓶颈。

一、自注意力(Self-Attention)

1. 密集自注意力(Dense Self-Attention)
  • 数学公式
    Attention ( Q , K , V ) = Softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=Softmax(dk QKT)V
    其中:

    • Q ∈ R N × d Q \in \mathbb{R}^{N \times d} QRN×d, K ∈ R N × d K \in \mathbb{R}^{N \times d} KRN×d, V ∈ R N × d V \in \mathbb{R}^{N \times d} VRN×d
    • N N N 为序列长度, d d d 为隐藏维度
  • 解决的问题

    • 传统实现瓶颈:计算复杂度 O ( N 2 ) O(N^2) O(N2) 和内存占用 O ( N 2 ) O(N^2) O(N2),难以处理超长序列(如 N > 10 k N > 10k N>10k
    • DeepSpeed-Ulysses优化
      • 通过序列并行(Sequence Parallelism)将 N N N 划分为 N / P N/P N/P P P P 为GPU数)
      • 两次All-to-All通信将计算复杂度降至 O ( N / P ) O(N/P) O(N/P)
2. 稀疏自注意力(Sparse Self-Attention)
  • 数学公式
    Attention ( Q , K , V ) = Softmax ( Q K T ⊙ M d k ) V \text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T \odot M}{\sqrt{d_k}}\right)V Attention(Q,K,V)=Softmax(dk QKTM)V
    其中:

    • M M M 为稀疏掩码矩阵,仅保留部分非零连接
  • 解决的问题

    • 传统密集注意力缺陷:长序列下计算和内存开销爆炸
    • DeepSpeed-Ulysses优化
      • 支持滑动窗口(Sliding Window)、块对角(Block Diagonal)等稀疏模式
      • 通信量降至 O ( N / P × W ) O(N/P \times W) O(N/P×W) W W W 为窗口大小)

二、交叉注意力(Cross-Attention)

数学公式:

CrossAttention ( Q , K enc , V enc ) = Softmax ( Q K enc T d k ) V enc \text{CrossAttention}(Q, K_{\text{enc}}, V_{\text{enc}}) = \text{Softmax}\left(\frac{QK_{\text{enc}}^T}{\sqrt{d_k}}\right)V_{\text{enc}} CrossAttention(Q,Kenc,Venc)=Softmax(dk QKencT)Venc
其中:

  • Q Q Q 来自解码器, K enc , V enc K_{\text{enc}}, V_{\text{enc}} Kenc,Venc 来自编码器

  • 解决的问题

    • 长序列跨模态挑战:生成式任务中,解码器需高效关注超长编码序列
    • DeepSpeed-Ulysses优化
      • 通过序列分片和分布式通信,支持 N enc × N dec N_{\text{enc}} \times N_{\text{dec}} Nenc×Ndec 规模的交叉注意力
      • 结合ZeRO-3减少参数内存占用,支持万亿级参数模型

三、因果注意力(Causal Attention)

数学公式:

CausalAttention ( Q , K , V ) = Softmax ( Q K T + Mask d k ) V \text{CausalAttention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T + \text{Mask}}{\sqrt{d_k}}\right)V CausalAttention(Q,K,V)=Softmax(dk QKT+Mask)V
其中:

  • Mask i , j = { 0 if  i ≥ j − ∞ otherwise \text{Mask}_{i,j} = \begin{cases} 0 & \text{if } i \geq j \\ -\infty & \text{otherwise} \end{cases} Maski,j={0if ijotherwise

  • 解决的问题

    • 自回归生成的信息泄露:防止未来token影响当前预测
    • DeepSpeed-Ulysses优化
      • 在分布式环境下高效应用掩码,避免跨分片的未来信息泄露
      • 支持超长上下文生成

四、Blockwise Attention(分块注意力)

数学公式:

BlockwiseAttention ( Q , K , V ) = ∑ i = 1 B Softmax ( Q i K i T d k ) V i + ∑ i ≠ j Softmax ( Q i K j T d k ) V j ⋅ M i , j \text{BlockwiseAttention}(Q, K, V) = \sum_{i=1}^{B} \text{Softmax}\left(\frac{Q_i K_i^T}{\sqrt{d_k}}\right)V_i + \sum_{i \neq j} \text{Softmax}\left(\frac{Q_i K_j^T}{\sqrt{d_k}}\right)V_j \cdot M_{i,j} BlockwiseAttention(Q,K,V)=i=1BSoftmax(dk QiKiT)Vi+i=jSoftmax(dk QiKjT)VjMi,j
其中:

  • B B B 为块数, M i , j M_{i,j} Mi,j 为块间连接掩码

  • 解决的问题

    • 长序列计算碎片化:将序列划分为块,块内密集计算,块间稀疏交互
    • DeepSpeed-Ulysses优化
      • 块内通信量 O ( N block 2 ) O(N_{\text{block}}^2) O(Nblock2),块间通信量 O ( N block × K ) O(N_{\text{block}} \times K) O(Nblock×K) K K K 为稀疏度)
      • 实验显示通信量减少70%,支持块间全局连接(如BigBird)

五、FlashAttention优化

数学公式:

FlashAttention ( Q , K , V ) = ∑ i = 1 T Softmax ( Q i K i T d k ) V i \text{FlashAttention}(Q, K, V) = \sum_{i=1}^{T} \text{Softmax}\left(\frac{Q_i K_i^T}{\sqrt{d_k}}\right)V_i FlashAttention(Q,K,V)=i=1TSoftmax(dk QiKiT)Vi
其中:

  • T T T 为内存块数,通过分块计算减少峰值内存

  • 解决的问题

    • 长序列内存瓶颈:传统注意力的激活值内存占用 O ( N 2 ) O(N^2) O(N2)
    • DeepSpeed-Ulysses优化
      • 结合序列并行,将内存降至 O ( N / P ) O(N/P) O(N/P)
      • 分块计算与通信重叠,提升计算效率

六、DeepSpeed-Ulysses的核心优化公式

1. 分布式注意力计算

Output = AllToAll ( Softmax ( AllToAll ( Q i , K i , V i ) d k ) ) \text{Output} = \text{AllToAll}\left(\text{Softmax}\left(\frac{\text{AllToAll}(Q_i, K_i, V_i)}{\sqrt{d_k}}\right)\right) Output=AllToAll(Softmax(dk AllToAll(Qi,Ki,Vi)))
其中:

  • Q i , K i , V i Q_i, K_i, V_i Qi,Ki,Vi 为第 i i i 个GPU的序列分片

  • 解决的问题

    • 传统数据并行的通信瓶颈:全聚集(All-Gather)通信量 O ( N ) O(N) O(N)
    • 优化后:两次All-to-All通信量降至 O ( N / P ) O(N/P) O(N/P)
2. 内存优化公式

Memory = Params + Activations + Gradients \text{Memory} = \text{Params} + \text{Activations} + \text{Gradients} Memory=Params+Activations+Gradients
其中:

  • Params = TotalParams P × S \text{Params} = \frac{\text{TotalParams}}{P \times S} Params=P×STotalParams S S S 为ZeRO-3分片因子)

  • Activations = O ( N P ) \text{Activations} = O\left(\frac{N}{P}\right) Activations=O(PN)(通过序列分片和激活重计算)

  • 解决的问题

    • 长序列训练的内存墙:传统方法无法支持 N > 100 k N > 100k N>100k 的序列
    • 优化后:在7B模型上支持 N = 512 k N=512k N=512k,内存效率提升4倍

All-to-All通信

分布式计算中的All-to-All通信与DeepSpeed-Ulysses优化

DeepSpeed-Ulysses通过两次All-to-All通信,实现了长序列Transformer训练的三大突破:
将O(N)复杂度降为O(N/P),打破长序列训练的带宽瓶颈; 利用NVSwitch/IB拓扑和异步流水线,将GPU算力利用率提升至硬件峰值的54%; 支持1M token序列与万亿参数模型的联合训练,为科学AI(如基因组分析)和生成式AI(如长文本生成)提供底层支撑。

一、All-to-All通信的核心概念

1. 通信机制本质
All-to-All是分布式系统中一种数据交换模式:网络中的每个节点(如GPU)同时向其他所有节点发送自身数据分片,并接收所有节点发来的分片。例如,当有P个GPU时,每个GPU初始持有数据切片X₁, X₂, …, Xₚ,通信后每个GPU都会获得完整的[X₁, X₂, …, Xₚ],相当于每个节点都收集到全局所有数据分片,形成完整数据集。

2. 与其他通信方式的区别

  • All-Gather:所有节点仅收集同一数据的不同分片(如多个GPU共同组成完整模型参数),通信量随数据规模线性增长。
  • All-to-All:节点间双向交换各自分片,通信量随节点数P成反比,适合数据并行场景下的高效同步。
二、DeepSpeed-Ulysses的两次All-to-All通信设计

1. 第一次通信:QKV张量聚合(注意力计算前)

  • 输入状态:每个GPU持有序列长度为N/P的Q/K/V张量(形状为(N/P, b, d),b为微批量,d为隐藏维度)。
  • 通信过程
    • 每个GPU向其他P-1个GPU发送自己的Q/K/V分片;
    • 每个GPU接收所有分片后,拼接成全局序列的Q/K/V张量(形状变为(N, b, d/P)),其中每个GPU负责d/P维度的注意力头计算。
  • 核心作用:使每个GPU获取完整序列的部分注意力头数据,为并行计算注意力做准备。

2. 第二次通信:注意力结果重分配(计算后)

  • 输入状态:注意力计算后的输出张量形状为(N, b, d/P)。
  • 通信过程
    • 每个GPU将输出按序列维度重新切分为N/P长度的分片;
    • 通过All-to-All将分片发送至对应GPU,最终每个GPU持有(N/P, b, d)的张量,供后续MLP层处理。
  • 核心作用:将注意力计算结果按序列维度重新分配,确保后续操作的并行性。
三、通信量优化的数学逻辑

1. 传统方法(如Megatron-LM)的瓶颈
采用All-Gather+Reduce-Scatter组合:

  • 每次注意力计算需2次All-Gather(收集QKV)和2次Reduce-Scatter(聚合结果),总通信量为4Nh(N为序列长度,h为隐藏维度),复杂度为O(N)。
  • 问题:当N从16K增至1M时,通信量增长62.5倍,极易造成网络拥塞。

2. DeepSpeed-Ulysses的优化公式
两次All-to-All的通信量计算:

  • 第一次通信(QKV收集):3Nh/P(Q、K、V三个张量);
  • 第二次通信(结果分发):Nh/P;
  • 总通信量:4Nh/P,复杂度降为O(N/P)。
  • 关键优势:当N与P同比增长时(如N×2,P×2),通信量保持不变。例如:
    • N=256K,P=64时,传统方法通信量为1024Kh,DeepSpeed仅为16Kh(减少64倍);
    • N=1M,P=64时,传统方法为4000Kh,DeepSpeed为62.5Kh(仅为1.56%)。
四、硬件拓扑与效率优化

1. 现代集群的网络架构支持

  • 节点内:通过NVSwitch高速互联,All-to-All分解为节点内低延迟交换(如8个GPU间的直接数据传输);
  • 节点间:采用胖树IB拓扑,支持高带宽批量数据传输,避免跨节点通信瓶颈。

2. 通信-计算流水线机制

  • 异步执行模式:
    1. GPU在发送Q/K/V分片的同时,启动部分计算任务;
    2. 接收完整Q/K/V后,立即开始注意力计算,将通信延迟隐藏在计算过程中。
  • 效果:实测显示,该机制可使通信效率提升30%-40%,尤其适用于长序列的分块计算。
五、实验验证与实际价值

1. 性能对比数据

  • 在70亿参数GPT模型上,DeepSpeed-Ulysses支持512K序列长度,而Megatron-LM仅支持128K;
  • 吞吐量方面,DeepSpeed达175 TFlops/GPU,是Megatron-LM的2.5倍(硬件峰值利用率54%)。

2. 长序列训练的扩展性

  • 当序列长度从64K增至1M时,DeepSpeed通过增加GPU数量(如从16增至256),保持通信量恒定,实现线性扩展;
  • 内存占用方面,结合ZeRO-3优化,单GPU显存占用从O(N²)降至O((N/P)²),支持百万级token训练。

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

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

相关文章

Redis-基础-总结

一、概述 Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供了丰富的数据结构,例如String、Hash、List、Set、sortedset等等。数据是存在内存中的,同时Redis…

尚硅谷redis7 28-32 redis持久化之理论介绍

28redis持久化之理论介绍 redis持久化:redis如何将内存数据写入磁盘中 为什么需要持久化? 内存数据一断电就会消失,那么所有的请求都会打到数据库中。因此让redis中的数据长期持有,不管是重启、故障、恢复、宕机,还…

JS逆向【抖查查】逆向分析 | sign | secret签名验证

1.目标 目标网址:https://www.douchacha.com/bloggerRankingRise 切换日期出现目标请求 import requests import jsonheaders {"accept": "application/json, text/plain, */*","accept-language": "zh-CN,zh;q0.9","…

【数据仓库面试题合集④】SQL 性能调优:面试高频场景 + 调优策略解析

随着业务数据规模的持续增长,SQL 查询的执行效率直接影响到数据平台的稳定性与数据产出效率。因此,在数据仓库类岗位的面试中,SQL 性能调优常被作为重点考察内容。 本篇将围绕常见 SQL 调优问题,结合实际经验,整理出高频面试题与答题参考,助你在面试中游刃有余。 🎯 高…

python打卡训练营打卡记录day37

知识点回顾: 过拟合的判断:测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint,还包含训练状态 早停策略 作业:对信贷数据集训练后保存权重,加载权重后继续训练50轮&#xf…

卷积神经网络(CNN)深度讲解

卷积神经网络(CNN) 本篇博客参考自大佬的开源书籍,帮助大家从头开始学习卷积神经网络,谢谢各位的支持了,在此期待各位能与我共同进步​ 卷积神经网络(CNN)是一种特殊的深度学习网络结构&#x…

深度体验:海螺 AI,开启智能创作新时代

人工智能 AI 工具如雨后春笋般涌现,而海螺 AI 以其独特的魅力与卓越的性能,迅速在众多产品中崭露头角,成为了无数创作者、办公族以及各行业人士的得力助手。近期,我对海螺 AI 进行了深入的使用体验,接下来就为大家详细…

哈希表day5

242 有效的字母异位词 思路就是转为ASCII码&#xff0c;然后用一个数组记录26位字母出现的次数 #include <string> class Solution{ public:bool isAnagram(string s,string t){int record[26]{0};for (int i0;i<s.size();i){record[s[i]-a];}for (int i0;i<t.si…

【Python数据库全栈指南】从SQL到ORM深度实践

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…

Android磁盘占用优化全解析:从监控到治理的存储效率革命

引言 随着移动应用功能的复杂化&#xff0c;磁盘占用问题日益突出。据统计&#xff0c;国内头部应用的平均安装包大小已超100MB&#xff0c;运行时缓存、日志、图片等数据更可能使磁盘占用突破GB级。过度的磁盘消耗不仅影响用户设备空间&#xff0c;还可能触发系统的“应用数据…

AJAX-让数据活起来(一):入门

目录 一、AJAX概念和axios使用 1.1 什么是AJAX ? 1.2 怎么用AJAX ? 1.3 axios使用 二、认识URL 2.1 什么是URL? 2.2 URL的组成 组成 协议 域名 资源路径 获取-新闻列表 三、URL查询参数 URL查询参数 axios - 查询参数 四、常用请求方法和数据提交 常用请求…

【C++篇】list模拟实现

实现接口&#xff1a; list的无参构造、n个val构造、拷贝构造 operator重载 实现迭代器 push_back() push_front() erase() insert() 头尾删 #pragma once #include<iostream> #include<assert.h> using namespace std;namespace liu {//定义list节点temp…

Go 语言范围循环变量重用问题与 VSCode 调试解决方法

文章目录 问题描述问题原因1. Go 1.21 及更早版本的范围循环行为2. Go 1.22 的改进3. VSCode 调试中的问题4. 命令行 dlv debug 的正确输出 三种解决方法1. 启用 Go 模块2. 优化 VSCode 调试配置3. 修改代码以确保兼容性4. 清理缓存5. 验证环境 验证结果结论 在 Go 编程中&…

快速创建 Vue 3 项目

安装 Node.js 和 Vue CL 安装 Node.js&#xff1a;访问 https://nodejs.org/ 下载并安装 LTS 版本。 安装完后&#xff0c;在终端检查版本&#xff1a; node -v npm -v安装 Vue CLI&#xff08;全局&#xff09;&#xff1a; npm install -g vue/cli创建 Vue 3 项目 vue cr…

java学习日志——Spring Security介绍

使用Spring Security要重写UserDetailsService的loadUserByUsername方法&#xff08;相当于自定了认证逻辑&#xff09;

【C++进阶篇】初识哈希

哈希表深度剖析&#xff1a;原理、冲突解决与C容器实战 一. 哈希1.1 哈希概念1.2 哈希思想1.3 常见的哈希函数1.3.1 直接定址法1.3.2 除留余数法1.3.3 乘法散列法&#xff08;了解&#xff09;1.3.4 平方取中法&#xff08;了解&#xff09; 1.4 哈希冲突1.4.1 冲突原因1.4.2 解…

单机Kafka配置ssl并在springboot使用

目录 SSL证书生成根证书生成服务端和客户端证书生成keystore.jks和truststore.jks辅助脚本单独生成truststore.jks 环境配置hosts文件kafka server.properties配置ssl 启动kafkakafka基础操作springboot集成准备工作需要配置的文件开始消费 SSL证书 证书主要包含两大类&#x…

PCB设计教程【入门篇】——电路分析基础-元件数据手册

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、数据手册的重要…

Vue2实现Office文档(docx、xlsx、pdf)在线预览

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【辰辉创聚生物】JAK-STAT信号通路相关蛋白:细胞信号传导的核心枢纽

在细胞间复杂的信号传递网络中&#xff0c;Janus 激酶 - 信号转导和转录激活因子&#xff08;JAK-STAT&#xff09;信号通路犹如一条高速信息公路&#xff0c;承担着传递细胞外信号、调控基因表达的重要使命。JAK-STAT 信号通路相关蛋白作为这条信息公路上的 “关键节点” 和 “…